使用PythonMagick将PDF转换为JPG时,如何使透明背景白色而不是黑色

时间:2013-06-24 16:05:09

标签: python imagemagick pythonmagick

我正在尝试使用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来做,因为它似乎需要更长的时间。

1 个答案:

答案 0 :(得分: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")

NB。组合运算符可以是PythonMagick.CompositeOperator.DstOverCompositeOp,我不确定它处理它的方式。

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