如何使用Python中的透明度将.EPS文件保存到PNG中

问题描述:

我正在构建一个类似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,分辨率越高,渲染时间越长。 –

看起来不支持透明度。从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) –