16

我正在尝试使用 Ghostscript 将具有透明背景的 PDF 文件光栅化为具有透明背景的 PNG 文件,但未成功。我已经从高低搜索了其他尝试相同事情的人提出的问题,但据我所知,没有一个已发布的解决方案可以归结为指定 -sDEVICE=pngalpha,与我的测试文件一起使用。在这一点上,我真的很感谢更有经验的手可以提供的任何建议或技巧。

我的测试 PDF 位于此处:http ://www.kolossus.com/files/test.pdf

可能问题出在这个文件上,但我对此表示怀疑。据我所知,它没有指定背景,当我使用 Photoshop 或 Illustrator 等透明感知应用程序打开文件时,它果然显示为透明背景。但是,当使用 Adob​​e Reader 等应用程序打开文件时,文件会以白色背景呈现。我相信这更多地与呈现 PDF 的应用程序有关,而不是与 PDF 本身有关——Adobe Reader 等应用程序假设您想查看打印文档的外观,因此总是在图稿后面显示白色画布——但是我不能确定。

我正在使用的 gs 命令是:

gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r72 -sOutputFile=test.png test.pdf

这将生成一个 PNG,该 PNG 在文件中艺术品的边界框之外具有透明像素,但在艺术品边界框内的所有像素都被光栅化为白色背景。这对我来说是个问题,因为我的作品有阴影和抗锯齿边缘,需要在最终输出中保留,不能只用 ImageMagick 进行后处理。我的 PNG 输出示例与上面的 pdf 位于同一位置,最后是 .png(stackoverflow 不允许我在帖子中包含多个 url)。

有趣的是,我发现使用 -dBackgroundColor 标志没有任何影响,即使我将其设置为非白色的东西,例如 -dBackgroundColor=16#ff0000。也许我对这个标志的语法的理解是错误的。

同样有趣的是,我发现使用 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 标志来尝试启用子像素抗锯齿没有任何效果。我也将不胜感激有关如何启用亚像素抗锯齿的任何建议,尤其是在文本上。

最后,我在 Mac OS 10.5.7 上使用 GPL Ghostscript 8.64,我试图设置的渲染工作流程是从 PrinceXML 输出的 PDF 生成透明的 PNG 图像。我直接调用 Ghostscript 进行光栅化,而不是使用 ImageMagick,因为 ImageMagick 委托 Ghostscript 进行 PDF 光栅化,我应该能够通过直接调用 GS 更好地控制光栅化。

谢谢你的帮助。

——乔恩·沃尔夫

4

3 回答 3

20

我分享了您使用-dTextAlphaBits=4-dGraphicsAlphaBits=4标志的经验。它们似乎不适用于所有文本。我想出的“修复”是将图像渲染为所需尺寸的 4 倍,然后缩小图像。幸运的是,ghostscript 在渲染千兆像素 PNG 文件时没有问题。

更新

在渲染像素数超过 2.500.000(即 10 mb 像素缓冲区)的透明 PNG 时,Ghostscript(最高版本 9)似乎也遇到了重大问题。透明的背景突然变成白色。

深入研究 ghostscript 的源码,我发现当像素缓冲区大小超过 10 mb 时,它会切换到不同的内存分配方案。更具体地说,图像是使用 deviceimage32而不是pngalpha. 鉴于pngalpha驱动程序的实现方式,当 gs 决定不使用其pngalpha_fill_rectangle().

幸运的是,在运行时调用了一个开关-dMaxBitmap=N来配置此参数。这在可追溯到 1999-01-15 的一个完全不同的错误的解决方法中提到,请参阅http://pages.cs.wisc.edu/~ghost/doc/AFPL/5.50/relnotes/index.htm

添加-dMaxBitmap=2147483647为我解决了很多问题。在 64 位系统上,这个数字可能更高。

真正的解决办法当然是重新设计pngalpha驱动程序,以便将背景颜色设置为0x7f000000无论实际代码路径如何,但大多数系统都有足够的内存来实现上述技巧。

于 2011-02-05T14:21:32.797 回答
2

恐怕我不能告诉你 ghostscript 能做什么,但我确实有一个建议。尝试使用黑色和白色背景渲染您的 PDF。两个图像中出现相同的任何像素显然是不透明的(即 alpha == 1.0)。不同的像素具有非零 alpha,可以通过从白色背景像素中减去黑色背景像素来计算。给出或取一些精度,任何红色、绿色或蓝色分量的值都将是 alpha 值。

于 2009-06-29T02:41:28.137 回答
2

只有在构建时选择了“transpar”选项,Ghostscript 才能处理透明度。假设您的 Ghostscript 是正确的版本,您可以在命令行中添加一个参数:

... -c "0 .setopacityalpha" -f c:/path/to/file/to/be/converted.pdf

(您可以使用 [0..1] 范围内的不透明度变体)。

此外,您是否尝试过使用 ImageMagick或 GraphicMagick 的命令将 Ghostscript 创建的 .png(如果背景确实是白色而不是透明)转换为透明背景?这是一个例子:convertgm convert

convert -background transparent test.png test_transp.png

顺便说一句,如果 Acrobat 或 AcroReader 将所有页面背景显示为白色:即使对于真正透明的背景,这也是默认设置。您可以在应用程序的设置选项中更改它:IIRC 该设置位于“页面显示”选项中并命名为 s.th。比如“显示透明度栅格”。(如果我详细查找它,它可能不会有太大帮助——Adobe 会在每个新版本中不断改变所有选项。只要自己在那里四处寻找,现在你会发现它,因为你知道它就在那里。)

于 2010-06-05T17:12:22.737 回答