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

问题描述 投票:0回答:2

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

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

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

顺便说一句,我看过这个,但我不明白:/ 如何将 .eps 文件转换为高质量的 1024x1024 .jpg?

python python-3.x windows turtle-graphics python-turtle
2个回答
2
投票

我在使用 ImageMagick 时遇到了问题,因为它的安全策略已更改,因此它无法与 Ghostscript 交互。 (有充分的理由......但值得怀疑的是,它不允许您在本地覆盖默认策略,以便网络应用程序可以受到保护,同时白名单用途仍然可以工作。)

对于其他人来说

convert: not authorized
,以下是直接调用 Ghostscript 的方法:

gs -dSAFER -dEPSCrop -r300 -sDEVICE=jpeg -o image.png image.eps
  • -dSAFER
    将 Ghostscript 置于沙盒模式,以便您可以解释不受信任的 Postscript。 (应该是默认的,但向后兼容。)
  • -dEPSCrop
    要求 Ghostscript 不要将其填充到可打印页面的大小。 (详情)
  • 当调用 Ghostscript 时,
  • ImageMagick 的
    -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")


1
投票

从您显示的链接中,有这个 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

© www.soinside.com 2019 - 2024. All rights reserved.