使用 GhostScript 以固定大小导出 PNG
Using GhostScript to export PNGs at fixed size
我们有很多正方形 EPS 图像,我们希望通过脚本以非常特定的 formats/sizes 将其导出为 PNG,即
- 8192x8192,灰度,无 alpha,无抗锯齿
- 2048x2048,灰度,无 alpha,抗锯齿。
我们没有运气编写 "professional" 工具 Photoshop 或 Illustrator 的脚本来执行此操作(尽管我们可以通过 UI 执行此操作,但它们的脚本支持薄弱,无法控制 alpha 或精确度图像导出大小,所以我们要么总是在大图像中获得 alpha,要么我们有时会得到稍微不准确的图像尺寸,这会破坏后续算法。)
我们第一次尝试制作高分辨率版本是:
gs -sDEVICE=pnggray -o cover.png -dDEVICEWIDTHPOINTS=8192 -dDEVICEHEIGHTPOINTS=8192 -dGraphicsAlphaBits=1 -dPDFFitPage=true cover.eps
但是,这似乎没有按预期调整图像大小以填充框。
给定方形 EPS,有没有办法让 Ghostscript 执行我们想要的操作?
EPS 文件的问题是它们不要求媒体大小。这是因为 EPS 文件旨在包含在其他 PostScript 程序中,因此它们需要由生成 PostScript 的应用程序调整大小。
为此,EPS 文件包含定义 EPS 边界框的注释(被 PostScript 解释器忽略)。放置 EPS 的应用程序可以快速扫描 EPS 以找到此信息,然后在它正在创建的最终 PostScript 程序中适当地设置 CTM 并插入 EPS 的内容。
Ghostscript 中的 FitPage
开关依赖于已知的媒体大小(使用时应设置 -dFIXEDMEDIA
)和请求的媒体大小,确定要应用的比例因子请求以使其适合实际大小,并设置 CTM 以应用该缩放比例。
如果您从未收到媒体尺寸请求(使用 EPS 则不会),则不会进行缩放。
现在 Ghostscript 确实 有一个不同的开关,EPSCrop
它从 EPS 中获取评论并使用它来设置媒体大小(Ghostscript 有机制允许出于这个原因处理评论等)。您可以实施类似的机制来获取 BoundingBox 注释,并缩放 EPS 以使其适合所需的目标媒体大小。
我可能会搞砸一些东西,但我不得不忙着创建一个示例文件来工作......
不要在上面的命令行中不小心指定了 PDFFitPage。处理 EPS 文件时指定 EPSFitPage。 PDFFitPage 将默默地不做任何事情。
我们有很多正方形 EPS 图像,我们希望通过脚本以非常特定的 formats/sizes 将其导出为 PNG,即
- 8192x8192,灰度,无 alpha,无抗锯齿
- 2048x2048,灰度,无 alpha,抗锯齿。
我们没有运气编写 "professional" 工具 Photoshop 或 Illustrator 的脚本来执行此操作(尽管我们可以通过 UI 执行此操作,但它们的脚本支持薄弱,无法控制 alpha 或精确度图像导出大小,所以我们要么总是在大图像中获得 alpha,要么我们有时会得到稍微不准确的图像尺寸,这会破坏后续算法。)
我们第一次尝试制作高分辨率版本是:
gs -sDEVICE=pnggray -o cover.png -dDEVICEWIDTHPOINTS=8192 -dDEVICEHEIGHTPOINTS=8192 -dGraphicsAlphaBits=1 -dPDFFitPage=true cover.eps
但是,这似乎没有按预期调整图像大小以填充框。
给定方形 EPS,有没有办法让 Ghostscript 执行我们想要的操作?
EPS 文件的问题是它们不要求媒体大小。这是因为 EPS 文件旨在包含在其他 PostScript 程序中,因此它们需要由生成 PostScript 的应用程序调整大小。
为此,EPS 文件包含定义 EPS 边界框的注释(被 PostScript 解释器忽略)。放置 EPS 的应用程序可以快速扫描 EPS 以找到此信息,然后在它正在创建的最终 PostScript 程序中适当地设置 CTM 并插入 EPS 的内容。
Ghostscript 中的 FitPage
开关依赖于已知的媒体大小(使用时应设置 -dFIXEDMEDIA
)和请求的媒体大小,确定要应用的比例因子请求以使其适合实际大小,并设置 CTM 以应用该缩放比例。
如果您从未收到媒体尺寸请求(使用 EPS 则不会),则不会进行缩放。
现在 Ghostscript 确实 有一个不同的开关,EPSCrop
它从 EPS 中获取评论并使用它来设置媒体大小(Ghostscript 有机制允许出于这个原因处理评论等)。您可以实施类似的机制来获取 BoundingBox 注释,并缩放 EPS 以使其适合所需的目标媒体大小。
我可能会搞砸一些东西,但我不得不忙着创建一个示例文件来工作......
不要在上面的命令行中不小心指定了 PDFFitPage。处理 EPS 文件时指定 EPSFitPage。 PDFFitPage 将默默地不做任何事情。