1

私はペイント様のアプリケーションを構築しています。後でシェイプのプロパティを自由に変更して変更したいので、Tkinterを使ってキャンバス上に図形を描きますPIL Drawまたは何か他のもの。他の答えから、私はポストスクリプトファイルを作成し、それをPILを使ってPNGに変換することで、キャンバスをPNG形式で保存する方法を見つけました。Pythonで透明なPNGに.EPSファイルを保存するには

ここで、EPSファイルには透明なスペースがありますが、PNGファイルではそのボイドが白の背景色で塗りつぶされています。私はどこが間違っているのか分からない。

以下は私が使用した機能です。

def saveImg(event): 
    global canvas 
    canvas.postscript(file="my_drawing.eps", colormode='color') 
    imgNew = Image.open("my_drawing.eps") 
    imgNew.convert("RGBA") 
    imgNew.thumbnail((2000,2000), Image.ANTIALIAS) 
    imgNew.save('testImg.png', quality=90) 
+0

システムにゴーストスクリプトがインストールされていますか?どんなプラットフォームを実行していますか? –

+0

@PauloScardineはい!ゴーストスクリプトをインストールしました。私はMac OS上でpython 3.5.2を実行しています –

+0

GhostScriptを使ってコマンドラインで変換を行うことができます: 'gs -dSAFER -dNOPAUSE -dBATCH -r150 -sDEVICE = pngalpha -sOutputFile = testImg.png my_drawing.eps '。 '-r150'は解像度を150 DPIに設定し、解像度が高いほどレンダリングに時間がかかります。 –

答えて

2

透過率はサポートされていません。 the docsから:

EPSドライバはL、LAB、RGBやCMYKモードでEPS画像を読み取ることができるが、Ghostscriptがなく、元の色空間でそれらを残すよりもRGBモードに画像を変換することができます。 (代わりに、RGB の)は、RGBにロード

アルファチャンネル情報が破棄され、それ以降のRGBAに変換すると、それを回復しないであろう。

あなたの最善の策は、カイロやQTのような最新のツールキットに移植することです。あるいは、PM2Ringの示唆どおりに直接GhostScriptを使用してファイルを変換します。

出力ファイルの幅と高さを設定するには、-rNスイッチを使用する必要があります。ここで、NはPPI(ピクセル/インチ)の解像度です。 EPSバウンディングボックスと目的の出力サイズから目標解像度を得るには、計算を行う必要があります。

または、最初に固定解像度にレンダリングして、100 PPIとし、得られた幅を確認し、正しい解像度を得るために数式を実行できます。例えば、-r100でレンダリングすることは、あなたに幅500個のピクセル、ファイルを与えるが、あなたはそれが1024年にしたい場合:

desired_resolution = initial_resolution * desired_width // initial_width 

1024個のピクセル幅のファイルを取得するために:

>>> 100 * 1024 // 500 
204 

ですから、レンダリングする必要がありますEPSは-r204を再度使用しています。

編集1:

私たちは-gNNNNxMMMM が、DPI値作物小さな領域のみを使用して、カスタムの幅と高さを設定することができ、このQuestion から解決策を得ました。私は通常の72dpiで試してみましたが、まともな出力が得られました(完璧かどうかはわかりません)。今私はプログラムを実行し、カスタムイメージサイズの値を提供するたびにこのコマンドを実行する方法を見つける必要があります。 :\

+0

これを試しましたが、同じサイズの問題が発生しました。私は、PILで変換されたPNGとGSで変換されたPNGのW/H比を比較しました。GSは画像の幅を高さと高さとして読み取っています。 pngがありますが、幅と高さに問題はありません。 (PIL.png)W/H = H/W(GS.png) –

関連する問題