1

我正在構建一個類似Paint的應用程序因爲我希望以後可以自由重新定位和修改形狀屬性,所以我使用Tkinter在Canvas上繪製形狀,而不是PIL繪圖或其他任何東西。從其他答案中,我找到了如何將畫布另存爲PNG,方法是先創建一個postscript文件,然後使用PIL將其轉換爲PNG。如何使用Python中的透明度將.EPS文件保存到PNG中

現在的問題是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

您的系統中是否安裝了ghostscript?順便說一句,你運行哪個平臺? –

+0

@PauloScardine是的!我安裝了ghostscript。我在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 EPS圖像,LAB,RGB和CMYK模式,但可能的Ghostscript將圖像轉換爲RGB模式,而不是讓他們在原有的色彩空間。

當在RGB(而不是RGB )加載alpha通道信息被丟棄並將其轉換爲RGBA以後將不恢復它。

最好的辦法是將它移植到更新的工具箱,比如cairo或QT,或者直接按照PM2Ring的建議使用GhostScript轉換文件。

對於GS方法來設置輸出文件的寬度和高度,您必須使用-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:

我從這個Question 的解決方案,我們可以設置自定義的寬度和高度使用-gNNNNxMMMM 但只有dpi值作物的小面積。我嘗試了通常的72dpi,並且我得到了體面的輸出(我不確定它是否完美)。現在我需要找到每次運行程序並提供自定義圖像大小值時如何執行此命令。 :\

+0

我試過這個,但是它導致了相同的大小問題。我比較了PIL轉換png和GS轉換png的W/H比值,以及我發現GS讀取圖像寬度的高度和高度與寬度:\ Im不知道爲什麼會發生這種情況,因爲即使PIL也使用GS來渲染PNG,但沒有寬度和高度的問題。 (PIL.png)W/H = H/W(GS.png) –