使用reportlab 2.3 实现PNG 的透明度

Posted

技术标签:

【中文标题】使用reportlab 2.3 实现PNG 的透明度【英文标题】:Transparency in PNGs with reportlab 2.3 【发布时间】:2010-11-21 11:27:09 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

将值为 'auto' 的 ma​​sk 参数 传递给 drawImage 为我解决了这个问题。

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

More information on the drawImage-function

【讨论】:

仅供参考,drawImage 文档可在此处获得:reportlab.com/apis/reportlab/dev/… 使用 Sphinx 生成的在线文档是非常糟糕的文档。相反,我发现用户指南 pdf reportlab.com/docs/reportlab-userguide.pdf 更有用。对于这个特定问题,请参阅第 2 章“使用 pdfgen 的图形和文本”中的“图像方法”部分。他们解释了 mask param 关键字。【参考方案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 图像。所以我仍然需要找到一种方法来检测图像的色彩空间。并且只在灰色空间图像上应用该蒙版。

【讨论】:

我使用的是黑白图像。似乎无法找到解决办法,所以我只是对图像进行了Photoshop处理,使其具有白色背景。方式,方式,方式更快。 @varagrawal 如果您在 Photoshop 中打开原始图像,您应该检查它使用的色彩空间。应该是灰度。如果您将颜色空间更改为 RGB,图像看起来会相同,但文件大小会有点大,但这会起作用并且您可以保持透明度。【参考方案3】:

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

【讨论】:

以上是关于使用reportlab 2.3 实现PNG 的透明度的主要内容,如果未能解决你的问题,请参考以下文章

怎样使用Alpha通道使png图片透明

css里写的png怎么在ie6里透明

通过转换为PNG使背景在JPEG图像中透明

我用Jquery Png后a:hover背景图依旧不透明!

把有透明区域的png图片和另外一个图片合并成一个,如何在web程序端实现,如php,python等

ReportLab:如何对齐文本对象?