使用ReportLab 2.3处理PNG透明度

34 投票
3 回答
14844 浏览
提问于 2025-04-15 13:45

我有两个PNG格式的图片,想用Python 2.5的ReportLab 2.3把它们合成一个PDF。当我用canvas.drawImage(ImageReader)把其中一个PNG写到画布上并保存时,透明部分变成了黑色。如果我用PIL(1.1.6)生成一个新的图片,然后把其中一个PNG粘贴到这个PIL图片上,效果就很好。 我已经在Gimp里仔细检查过,这两张图片的透明通道都正常,并且保存得也没问题。我没有收到任何错误提示,网上搜索也找不到解决办法。

有没有人成功把透明的PNG合成到ReportLab的画布上,并且透明效果正常的?谢谢!

3 个回答

1

ReportLab这个工具用PIL来处理图片。目前,PIL的最新版本已经修复了一个问题,可以支持透明的PNG图片。不过,如果你想要一个稳定的版本,就得等到1.1.6的发布了。

2

我发现使用 mask='auto' 在 reportlab 3.1.8 里不再有效了。文档里说要传入你想要遮罩的值。现在对我有效的是 mask=[0, 2, 0, 2, 0, 2, ]。简单来说,它的格式是 `mask=[红色起始值, 红色结束值, 绿色起始值, 绿色结束值, 蓝色起始值, 蓝色结束值]`。

这个 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 图片。所以我还需要找出一种方法来检测图像的颜色空间,并且只对灰色空间的图像应用这个遮罩。

89

mask 参数 设置为 'auto' 传给 drawImage 这个函数,就能解决我遇到的问题。

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

关于 drawImage 函数的更多信息

撰写回答