如何在Python 3.6中将.eps文件转换为.png

时间:2017-08-22 23:44:41

标签: python windows python-3.x

使用Python龟我试图将画布保存为png。我已经研究过它,并找到了一种方法将其保存为没有任何模块的eps文件,但我发现很难将eps文件转换为png。

有没有办法在不下载其他模块的情况下将eps转换为png?如果没有,有人可以告诉我更多关于ImageMagick的信息,因为我看过它,但我很困惑如何使用它?我还看到它与linux有关并且它已经过时了吗?

如果不将eps转换为png,是否有更简单的方法将画布保存为png?

是的,我见过这个,但我不明白:/ How to convert a .eps file to a high quality 1024x1024 .jpg?

2 个答案:

答案 0 :(得分:1)

从您显示的链接中,有一个Imagemagick命令:

convert -density 300 image.eps -resize 1024x1024 image.jpg

大多数EPS文件都是矢量图像。它们没有像素的物理尺寸,因为它是一个矢量绘图,其命令描述了如何绘制每个对象。它不是包含像素的光栅图像,也没有任何特定的维度像素集。

因此,使用矢量文件,您可以设置打印密度以告知Imagemagick(将其传递给Ghostscript进行栅格化工作)以将矢量数据转换为栅格数据,然后将其另存为栅格格式输出图像。标称密度为72 dpi(有时为92或96)。因此,如果您使用-density 288并使用以下命令:

convert -density 288 image.eps image.png

这会导致每个维度的图像比刚刚做的图像大4倍

convert image.eps image.png

,默认dpi为72,与

相同
convert -density 72 image.eps image.png

请注意,72 * 4 = 288。

现在你有一个高质量的光栅png,特别是如果eps文件是用蓝线等细线绘制的线条。

然而,如果那个太大并且你想将它减少到它的标称尺寸1/4,你可以做(​​注意1/4 = 25%)

convert -density 288 image.eps -resize 25% image.png

这个过程有时被称为超级采样,并且会产生比仅仅做

更好看的结果
convert image.eps image.png

在原始命令中,他们决定获得高质量的光栅图像,并调整为1024x1024。

因此,您可以在从EPS矢量图像生成高清光栅图像后调整到所需的任何尺寸。

您使用的密度越大,PNG的质量就越高,但处理时间会更长。所以你必须交易时间与质量,并选择在合理的时间内产生足够质量的最小密度。

我不知道Python Wand是否支持设置密度,或者它是否支持读取需要Ghostscript的PDF文件。但是您可以使用Python Subprocess模块​​调用Imagemagick命令行。见https://www.imagemagick.org/discourse-server/viewtopic.php?f=4&t=32920

答案 1 :(得分:0)

ImageMagick的安全策略已更改,因此无法与Ghostscript交互,因此一直遇到问题。 ({for good reason ...但是令人怀疑的是,它不允许您在本地覆盖默认策略,因此可以在白名单使用仍然有效的情况下保护Web应用程序。)

对于任何陷入convert: not authorized的人,以下是直接调用Ghostscript的方法:

gs -dSAFER -dEPSCrop -r300 -sDEVICE=jpeg -o image.png image.eps
  • -dSAFER将Ghostscript置于沙盒模式,因此您可以解释不受信任的Postscript。 (它应该是默认值,但向后兼容。)
  • -dEPSCrop要求Ghostscript不要将其填充到可打印页面的大小。 (details
  • ImageMagick的-density 300在调用Ghostscript时变为-r300。 (details
  • -sDEVICE是设置输出格式的方式(其他选择请参见手册的Devices section。)
  • -o-dBATCH -dNOPAUSE -sOutputFile=details)的简写

然后您可以使用ImageMagick的mogrify命令来调整其大小以适合确切的像素尺寸:

mogrify -resize 1024x1024 image.png

({mogrify类似于convert,但替换输入文件而不是写入新文件。)

更新:事后看来,在发布第一个答案之前,我应该检查过Pillow是否支持EPS。

原生Python解决方案是使用Pillow对调用Ghostscript的支持(在这方面像ImageMagick,但具有原生Python API)。

但是,Pillow的文档没有解释它们如何达到像素大小,并且仅对默认大小而不是绝对DPI值采用可选的乘数(scale)。

如果那不打扰您,并且您同时安装了Pillow和Ghostscript,则以下是不使用ImageMagick的方法:

#!/usr/bin/env python3

from PIL import Image

TARGET_BOUNDS = (1024, 1024)

# Load the EPS at 10 times whatever size Pillow thinks it should be
# (Experimentaton suggests that scale=1 means 72 DPI but that would
#  make 600 DPI scale=8⅓ and Pillow requires an integer)
pic = Image.open('image.eps')
pic.load(scale=10)

# Ensure scaling can anti-alias by converting 1-bit or paletted images
if pic.mode in ('P', '1'):
    pic = pic.convert("RGB")

# Calculate the new size, preserving the aspect ratio
ratio = min(TARGET_BOUNDS[0] / pic.size[0],
            TARGET_BOUNDS[1] / pic.size[1])
new_size = (int(pic.size[0] * ratio), int(pic.size[1] * ratio))

# Resize to fit the target size
pic = pic.resize(new_size, Image.ANTIALIAS)

# Save to PNG
pic.save("image.png")