Ghostscript 创建巨大的图像,比预期的像素多一个数量级

Posted

技术标签:

【中文标题】Ghostscript 创建巨大的图像,比预期的像素多一个数量级【英文标题】:Ghostscript creating huge images, order of magnitude more pixels than expected 【发布时间】:2011-10-18 11:13:47 【问题描述】:

我使用此 Ghostscript 命令将 PDF 转换为图像:

gs \
 -q -dQUIET -dPARANOIDSAFER -dBATCH -dNOPAUSE -dNOPROMPT \
 -dCOLORSCREEN \
 -dDOINTERPOLATE \
 -dMaxBitmap=500000000 \
 -dNumRenderingThreads=4 \
 -dAlignToPixels=0 \
 -dGridFitTT=0 \
 -dTextAlphaBits=4 \
 -dGraphicsAlphaBits=4 \
 -sDEVICE=jpeg \
 -dFirstPage=1 \
 -dDEVICEWIDTHPOINTS=1654 \
 -dDEVICEHEIGHTPOINTS=2333 \
 -dDEVICEXRESOLUTION=1654 \
 -dDEVICEYRESOLUTION=2333 \
 -sOutputFile=d:\images\%01d.jpg \
  d:\test.pdf

它转换图像,但图像是 13675x27280px。我想要 1654x2333 像素的图像。我做错了什么?

【问题讨论】:

【参考方案1】:

您以 PostScript 点数指定了媒体的宽度和高度,其中每英寸有 72 个点,然后指定了以每英寸点数定义的巨大分辨率 (1654x2333)/

媒体的大小仅与输出的像素大小成正比,因为这也取决于分辨率。如果我将媒体设置为 72 点(1 英寸)和 300 dpi 的分辨率,则生成的图像将为 300 像素。如果我将其设置为 600 dpi,则图像将为 600 像素。

所以你说媒体是 1654 点(22.97222 英寸)乘 2333 点(32.402777 英寸)。然后你说 x 方向的分辨率是 1654 dpi。所以 x 方向的大小(以像素为单位)是22.97222 * 1654 = 37966.055。类似的计算得出 y 大小为 75596.68。

虽然这与您声明的大小不同,但这可能是因为您没有设置 -dFIXEDMEDIA,因此 PDF 文件中的媒体大小会覆盖命令行中提供的媒体大小。以分辨率和尺寸计算,这意味着介质宽度为 13675/1654 = 8.25 英寸,高度为 11.69 英寸。您的 PDF 文件最初使用 A4 作为页面大小。

您需要指定分辨率和页面大小,一起计算时会为您提供所需的像素大小。您还必须设置 -dFIXEDMEDIA 以防止 覆盖指定大小的 PDF 文件。

最后,您可能希望指定 -dPDFFITPAGE 以便缩放 PDF 以适应媒体,假设这是您真正想要发生的事情。

在这种情况下,只需将分辨率设置为 200 dpi,并忽略其他点,即可获得接近您想要的结果 (-r200)。显然,您必须删除 -dDEVICERESOLUTION 开关。

【讨论】:

【参考方案2】:

Ken 解释得很好,但我注意到他在其中一个开关上的外壳不正确。

使 PDF 适应(固定)页面大小的参数是 -dPDFFitPage(不是全部大写)。所有的 Ghostscript 开关是区分大小写的,除非文档明确允许多个版本。

还有 -g_x_ 选项直接以像素为单位设置图像大小(页面大小)并自动设置 -dFIXEDMEDIA 选项。

【讨论】:

以上是关于Ghostscript 创建巨大的图像,比预期的像素多一个数量级的主要内容,如果未能解决你的问题,请参考以下文章

ghostscript 没有创建精确的图像

使用 Ghostscript 从单个 JPG 文件创建 PDF - PDF 中的图像放置问题

Ghostscript:在保持纵横比的同时设置像素宽度,EPS到PNG

CUDA 速度比预期慢 - 图像处理

使用 GhostScript 打印 PDF

在 Android 相机中拍摄的照片比预期的要小