如何将 .EPS 文件保存为透明的 PNG Python
How to save an .EPS file to PNG with transparency in Python
我正在构建一个类似 Paint 的应用程序 因为我希望以后可以自由地重新定位和修改形状属性,所以我使用 Tkinter 在 Canvas 上绘制形状而不是 PIL Draw 或其他任何东西。从其他答案中,我找到了如何通过首先创建一个 postscript 文件然后使用 PIL 将其转换为 PNG 来将 canvas 保存为 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)
似乎不支持透明度。来自 the docs:
The EPS driver can read EPS images in L, LAB, RGB and CMYK mode, but Ghostscript may convert the images to RGB mode rather than leaving them in the original color space.
当您加载 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:
我从这个 Question 得到了解决方案
我们可以使用 -gNNNNxMMMM
设置自定义宽度和高度
但 dpi 值只裁剪一小块区域。我尝试使用通常的 72dpi,得到了不错的输出(我不确定它是否完美)。现在我需要找到每次 运行 程序并提供自定义图像大小值时如何执行此命令。 :\
我正在构建一个类似 Paint 的应用程序 因为我希望以后可以自由地重新定位和修改形状属性,所以我使用 Tkinter 在 Canvas 上绘制形状而不是 PIL Draw 或其他任何东西。从其他答案中,我找到了如何通过首先创建一个 postscript 文件然后使用 PIL 将其转换为 PNG 来将 canvas 保存为 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)
似乎不支持透明度。来自 the docs:
The EPS driver can read EPS images in L, LAB, RGB and CMYK mode, but Ghostscript may convert the images to RGB mode rather than leaving them in the original color space.
当您加载 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:
我从这个 Question 得到了解决方案
我们可以使用 -gNNNNxMMMM
设置自定义宽度和高度
但 dpi 值只裁剪一小块区域。我尝试使用通常的 72dpi,得到了不错的输出(我不确定它是否完美)。现在我需要找到每次 运行 程序并提供自定义图像大小值时如何执行此命令。 :\