2

我正在尝试使用 PythonMagick 从 PDF 转换为 JPG,但我找不到设置背景颜色的方法,默认情况下它从透明更改为黑色。我可以使用 os.system 和 -flatten 参数获得所需的结果,如下所示。

import os
os.system('convert -flatten -background \#ffffff -density 400 -adaptive-resize 1900x infile.pdf outfile.jpg')

但是,PythonMagick 似乎没有flatten方法,下面的代码片段会生成一个黑色背景的图像。

import PythonMagick
import os
img = PythonMagick.Image("infile.pdf")
img.backgroundColor('#ffffff')
img.density('400')
img.resize('1900x')
img.magick('JPG')
img.quality(60)
img.write("outfile.jpg") 

还有一个使用颜色的 transparent() 方法。我不太确定它的用途,但img.transparent('#ffffff')没有帮助。有没有其他方法可以达到同样的效果?我宁愿不使用它os.system,因为它似乎需要更长的时间。

4

1 回答 1

4

如果您查看-flatten命令行选项的文档,您会发现它是-layers flatten.

-layers flatten命令本身是一个组合命令,它包括创建一个当前背景颜色的图层,其大小与第一个图像画布相同,然后在其上依次组合每个图层。

PythonMagick 本质上只是Magick++ C++ 接口的绑定层。提供的高级命令convert不一定在较低级别的库中复制,因为它们实际上是如上所述的命令序列。因此,虽然 PythonMagick 库中没有针对它的单一命令,但可以复制该功能。

您所追求的方法是.composite(),PythonMagick 文档非常有限(或者实际上不存在),大多数人都远离该库。但我认为用法是这样的,如果 PDF 中只有一层(完全未经测试):

import PythonMagick

img = PythonMagick.Image("infile.pdf")

img.density('400')

bgColour = PythonMagick.ColorRGB(1.0, 1.0, 1.0)
size = "%sx%s" % (img.columns(), img.rows())

flattened = PythonMagick.Image(size, bgColour)
flattened.type = img.type

flattened.composite(img, 0, 0, PythonMagick.CompositeOperator.SrcOverCompositeOp)

flattened.resize('1900x')
flattened.magick('JPG')
flattened.quality(60)

flattened.write("outfile.jpg")

注意。组合运算符可能是PythonMagick.CompositeOperator.DstOverCompositeOp,我不确定它处理的是哪种方式。

尽管 PDF 是 ImageMagick 的一个特例,因为它们通常被传递给 ghostscript 进行光栅化。这意味着您可能需要为 ghostscript ( gs) 提供一些奇怪的参数来正确处理 alpha 通道。尝试向命令添加详细选项以查看它发出的委托命令,并考虑通过os.system('gs ...')命令自己进行 PDF 光栅化,然后进行调整大小。虽然我怀疑这会比调用更快convert

于 2013-06-24T18:32:59.550 回答