使用Python龟我试图将画布保存为png。我已经研究过它,并找到了一种方法将其保存为没有任何模块的eps文件,但我发现很难将eps文件转换为png。
有没有办法在不下载其他模块的情况下将eps转换为png?如果没有,有人可以告诉我更多关于ImageMagick的信息,因为我看过它,但我很困惑如何使用它?我还看到它与linux有关并且它已经过时了吗?
如果不将eps转换为png,是否有更简单的方法将画布保存为png?
是的,我见过这个,但我不明白:/ How to convert a .eps file to a high quality 1024x1024 .jpg?答案 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)-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")