28

我有两个 PNG,我试图在 Python 2.5 上使用 ReportLab 2.3 将它们组合成 PDF。当我使用 canvas.drawImage(ImageReader) 将任一 PNG 写入画布并保存时,透明度变为黑色。如果我使用 PIL (1.1.6) 生成一个新图像,然后将任一 PNG 粘贴()到 PIL 图像上,它就可以很好地合成。我已经在 Gimp 中仔细检查过,两个图像都有工作的 alpha 通道并且被正确保存。我没有收到错误,而且我的 google-fu 似乎没有任何东西可以出现。

有没有人将透明的 PNG 合成到 ReportLab 画布上,并且透明度工作正常?谢谢!

4

3 回答 3

74

传递值为 'auto'的掩码参数drawImage来为我解决此问题。

drawImage(......., mask='auto')

有关 drawImage 函数的更多信息

于 2009-10-26T15:01:40.373 回答
2

我发现mask='auto'reportlab 3.1.8 已经停止为我工作。在文档中,它说要传递您想要屏蔽的值。所以现在对我有用的是mask=[0, 2, 0, 2, 0, 2, ]. 基本上它看起来像这样 `mask=[red_start, red_end, green_start, green_end, blue_start, blue_end, ]

mask 参数可让您创建透明图像。它需要 6 个数字并定义将被屏蔽或视为透明的 RGB 值的范围。例如,使用 [0,2,40,42,136,139],它将屏蔽掉红色值为 0 或 1、绿色值为 40 或 41 以及蓝色值为 136、137 或 138 的任何像素(范围为 0-255) . 目前您的工作是了解哪种颜色是“透明”或背景颜色。

更新:这掩盖了任何是rgb(0, 0, 0)rgb(1, 1, 1)显然可能不是正确的解决方案。我的问题是人们上传带有灰色空间的 png 图像。所以我仍然需要找到一种方法来检测图像的色彩空间。并且仅在灰色空间图像上应用该蒙版。

于 2015-02-07T17:43:38.990 回答
1

ReportLab 使用 PIL 来管理图像。目前,PIL 主干已经应用了补丁来支持透明 PNG,但如果您需要稳定的包,您将不得不等待 1.1.6 版本。

于 2009-08-21T10:00:56.303 回答