Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中将.EPS文件以透明方式保存到PNG_Python_Python 3.x_Tkinter_Python Imaging Library_Tkinter Canvas - Fatal编程技术网

如何在Python中将.EPS文件以透明方式保存到PNG

如何在Python中将.EPS文件以透明方式保存到PNG,python,python-3.x,tkinter,python-imaging-library,tkinter-canvas,Python,Python 3.x,Tkinter,Python Imaging Library,Tkinter Canvas,我正在构建一个类似绘画的应用程序,因为我希望以后可以自由地重新定位和修改形状属性,我使用Tkinter在画布上绘制形状,而不是PIL draw或其他任何东西。从其他答案中,我发现了如何将画布保存为PNG,方法是首先创建一个postscript文件,然后使用PIL将其转换为PNG 现在的问题是EPS文件有透明的空格,但PNG文件用白色背景色填充这些空格。我不确定我会错在哪里 下面是我使用的函数 def saveImg(event): global canvas canvas.pos

我正在构建一个类似绘画的应用程序,因为我希望以后可以自由地重新定位和修改形状属性,我使用Tkinter在画布上绘制形状,而不是PIL draw或其他任何东西。从其他答案中,我发现了如何将画布保存为PNG,方法是首先创建一个postscript文件,然后使用PIL将其转换为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)

看起来不支持透明度。发件人:

EPS驱动程序可以在L、LAB、RGB和CMYK模式下读取EPS图像,但Ghostscript可以将图像转换为RGB模式,而不是将其保留在原始颜色空间中

加载RGB(而不是RGBA)时,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
因此,必须使用
-r204
再次渲染EPS

编辑1:

我从中得到了答案 我们可以使用
-gnnnxmmm

但是,新闻部只重视一小部分作物。我尝试了通常的72dpi,得到了不错的输出(我不确定它是否完美)。现在,我需要了解如何在每次运行程序并提供自定义图像大小值时执行此命令:\

您的系统中是否安装了ghostscript?顺便说一句,你在运行哪个站台?@PauloScardine是的!我已经安装了ghostscript。我正在Mac OS上运行python 3.5.2,您可以使用GhostScript在命令行上进行转换,如下所示:
gs-dSAFER-dNOPAUSE-dBATCH-r150-sDEVICE=pngalpha-sOutputFile=testImg.png my_drawing.eps
-r150
将分辨率设置为150 DPI,分辨率越高渲染时间越长。@PM2Ring wow!它工作得很好。是否可以设置输出文件的宽度和高度?由于eps与大小无关,因此输出分辨率似乎是随机的。我检查了文件,但只能找到纸张尺寸。是否可以提供自定义尺寸?更新了答案,并提供了如何获得特定宽度/高度的建议。我尝试了此方法,但结果出现了相同的尺寸问题。我比较了PIL转换的png和GS转换的png的W/H比率,发现GS读取图像的宽度为高度,高度为宽度:\I不确定为什么会发生这种情况,因为即使PIL也使用GS渲染png,但宽度和高度没有问题。(巴布亚新几内亚)W/H=H/W(巴布亚新几内亚)