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

时间:2017-10-18 12:54:43

标签: python python-3.x tkinter python-imaging-library tkinter-canvas

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

现在的问题是EPS文件有透明空格,但PNG文件用白色背景颜色填充这些空白。我不确定我哪里出错了。

以下是我使用的功能。

$methodValue = null;
if (isset($_REQUEST['method']) and strlen($_REQUEST['method']) > 0) {
    $methodValue = $_REQUEST['method'];
}

1 个答案:

答案 0 :(得分:2)

看起来不支持透明度。来自the docs

  

EPS驱动程序可以读取L,LAB,RGB和CMYK模式下的EPS图像,但Ghostscript可能会将图像转换为RGB模式,而不是将它们保留在原始色彩空间中。

当您加载RGB(而非RGB A )时,Alpha通道信息将被丢弃,之后将其转换为RGBA将无法恢复。

最好的方法是将其移植到更新的工具包(如cairo或QT)或直接使用GhostScript转换文件,如PM2Ring所建议的那样。

对于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,我得到了不错的输出(我不确定它是否完美)。现在我需要找到每次运行程序并提供自定义图像大小值时如何执行此命令。 :\