使用 GhostScript 以固定大小导出 PNG

Posted

技术标签:

【中文标题】使用 GhostScript 以固定大小导出 PNG【英文标题】:Using GhostScript to export PNGs at fixed size 【发布时间】:2017-09-12 19:17:27 【问题描述】:

我们有许多方形 EPS 图像,我们希望通过脚本以非常特定的格式/大小将其导出为 PNG,即

8192x8192,灰度,无 alpha,无抗锯齿 2048x2048,灰度,无 alpha,抗锯齿。

我们没有运气编写“专业”工具 Photoshop 或 Illustrator 来执行此操作(尽管我们可以通过 UI 执行此操作,但它们的弱脚本支持无法控制 alpha 或精确的图像导出大小,所以我们要么总是在大图像中获取 alpha,或者我们有时会得到稍微不准确的图像大小,这会破坏后续算法。)

我们第一次尝试这样做的高分辨率版本是:

gs -sDEVICE=pnggray -o cover.png -dDEVICEWIDTHPOINTS=8192 -dDEVICEHEIGHTPOINTS=8192 -dGraphicsAlphaBits=1 -dPDFFitPage=true cover.eps

但是,这似乎并没有按预期调整图像大小以填充框。

在给定方形 EPS 的情况下,有没有办法让 Ghostscript 做我们想做的事?

【问题讨论】:

也许您应该发布一个示例 EPS 并描述您希望在 PNG 中填充的部分,或者也发布一个正确输出的 PNG。 Imagemagick 可能有助于使这更容易,尽管它依赖 Ghostscript 来完成这项工作。 我可以,但我使用的所有图像都受版权保护,因此我需要制作合成图像,并且我需要将 EPS 文件托管在“适当”公开的地方,即不仅仅是保管箱。问题的主要部分涉及以已知的输出画布尺寸 (2048x2048) 导出图像,而不是像 72dpi 这样的已知 分辨率,这显然会根据图像的物理尺寸(即我不在乎,因为这不是用于打印的。)有没有办法做到这一点? 在 Imagemagick 中,我会指定比您需要的更大的密度,然后调整为您想要的大小。这会产生非常好的质量结果,尽管可能需要比您想要的更长的时间。类似于:convert -density 288 image.eps -resize WxH image.png 在 IM 6 中并将 convert 替换为 IM 7 的魔法。这假设 -density 288 使光栅图像比您想要的 WxH 大几倍。 这不是一个有效的解决方案,因为我想要精确的提示(尤其是在非抗锯齿 16k-sq 图像的情况下,我希望或多或少是二进制的。另外,“更高比 8192-sq" 很快变得巨大(特别是在某些情况下,我们使用 16384-sq 或 24k-sq。我已经在各种工具中提供了多种选项,用于“以随机高分辨率渲染并下采样到精确尺寸”。我想要以精确的尺寸渲染。我真的不明白为什么所有位图光栅化器都不能这样做,而是专注于物理尺寸,而位图是无量纲的,而像素只是一个像素。 【参考方案1】:

您对 EPS 文件的问题是它们不要求媒体大小。这是因为 EPS 文件旨在包含在其他 PostScript 程序中,因此需要由生成 PostScript 的应用程序调整它们的大小。

为此,EPS 文件包括定义 EPS 边界框的 cmets(PostScript 解释器会忽略它)。放置 EPS 的应用程序可以快速扫描 EPS 以查找此信息,然后在它正在创建的最终 PostScript 程序中适当地设置 CTM 并插入 EPS 的内容。

Ghostscript 中的FitPage 开关依赖于具有已知的媒体大小(使用此选项时您应该设置-dFIXEDMEDIA)和请求的媒体大小,确定应用到请求的比例因子以实现它适合实际大小,并设置 CTM 以应用该缩放。

如果您从未收到媒体尺寸请求(EPS 不会收到),则不会进行缩放。

现在 Ghostscript 确实有一个不同的开关,EPSCrop 从 EPS 中提取 cmets 并使用它来设置媒体大小(由于这个原因,Ghostscript 具有允许处理 cmets 的机制,在其他人中)。您可以实现类似的机制来获取 BoundingBox cmets,并缩放 EPS 以使其适合所需的目标媒体大小。

我可能会搞砸一些东西,但我不得不乱七八糟地创建一个示例文件来工作.....

【讨论】:

【参考方案2】:

不要在上面的命令行中意外指定 PDFFitPage。处理 EPS 文件时指定 EPSFitPage。 PDFFitPage 将默默地什么都不做。

【讨论】:

以上是关于使用 GhostScript 以固定大小导出 PNG的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 Ghostscript 从 PDF 进行分页 JPEG 转换/导出

合并 PDF 的 Ghostscript 压缩结果

Ghostscript 会导出 PNG,但会切掉横向页面的一半

在 ghostscript 中添加 OTF 字体 Latin Modern Roman 以生成矢量化 pdf

如何使用 ghostscript 调整 .eps 文件的大小

使用 Ghostscript 指定 PDF 页面大小