使用Pythonturtle,我试图将画布保存为png。我研究过它并找到了一种将其另存为 eps 文件而不使用任何模块的方法,但我发现很难将 eps 文件转换为 png。
有没有办法在不下载其他模块的情况下将 eps 转换为 png?如果没有,有人可以告诉我更多关于 ImageMagick 的信息,因为我已经看过它,但我很困惑如何使用它?我也看到它被链接到 linux,它已经过时了吗?
如果不将 eps 转换为 png,是否有更简单的方法将画布另存为 png?
顺便说一句,我看过这个,但我不明白:/ 如何将 .eps 文件转换为高质量的 1024x1024 .jpg?
我在使用 ImageMagick 时遇到了问题,因为它的安全策略已更改,因此它无法与 Ghostscript 交互。 (有充分的理由......但值得怀疑的是,它不允许您在本地覆盖默认策略,以便网络应用程序可以受到保护,同时白名单用途仍然可以工作。)
对于其他人来说
convert: not authorized
,以下是直接调用 Ghostscript 的方法:
gs -dSAFER -dEPSCrop -r300 -sDEVICE=jpeg -o image.png image.eps
-dSAFER
将 Ghostscript 置于沙盒模式,以便您可以解释不受信任的 Postscript。 (应该是默认的,但向后兼容。)-dEPSCrop
要求 Ghostscript 不要将其填充到可打印页面的大小。 (详情)-density 300
会变成 -r300
。 (详情)-sDEVICE
是设置输出格式的方式(有关其他选择,请参阅手册的设备部分。)-o
是-dBATCH -dNOPAUSE -sOutputFile=
的简写(详情)然后您可以使用 ImageMagick 的
mogrify
命令调整其大小以适合精确的像素尺寸:
mogrify -resize 1024x1024 image.png
(
mogrify
类似于convert
,但替换输入文件而不是写入新文件。)
更新:事后看来,我应该在发布第一个答案之前检查 Pillow 是否支持 EPS。
原生 Python 解决方案是使用 Pillow 对调用 Ghostscript 的支持(在这方面类似于 ImageMagick,但具有原生 Python API)。
但是,Pillow 的文档没有解释它们如何达到以像素为单位的大小,并且仅采用可选的乘数 (
scale
) 作为默认大小,而不是绝对 DPI 值。
如果这不困扰您,并且您已经安装了 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")
从您显示的链接中,有这个 Imagemagick 命令:
convert -density 300 image.eps -resize 1024x1024 image.jpg
大多数 EPS 文件都是矢量图像。它们没有以像素为单位的物理尺寸,因为它是矢量绘图,其中包含描述如何绘制每个对象的命令。它不是包含像素的光栅图像,并且没有任何特定的像素尺寸集。
因此,对于矢量文件,您可以设置打印密度来告诉 Imagemagick(将其传递给 Ghostscript 进行光栅化工作)将矢量数据转换为光栅数据,然后将其保存为光栅格式输出图像。标称密度为 72 dpi(有时为 92 或 96)。因此,如果您将 -密度 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是否支持设置密度,或者是否支持读取PDF文件,这需要Ghostscript。但您可以使用 Python Subprocess 模块来调用 Imagemagick 命令行。请参阅https://www.imagemagick.org/discourse-server/viewtopic.php?f=4&t=32920