用Podofo绘制带透明度的png图片
前言:
Podofo库是一个通用跨平台的开源c++类库,用于处理pdf文档,包括创建,修改,添加水印等功能。
不过因为其是开源项目,而且作者更新也比较慢。所以有些功能还是自己修改源码的。
比如添加png图片。
在官方说明中,是有使用DrawImage方法来添加图片的代码示例,但是当绘制带有透明通道的png图片时,DrawImage并不能显示出图片的透明度。
可以很清楚看到图片遮挡了文字,而且有莫名其妙的黑色区域。尤其是当想添加水印时,这简直就没是灾难。
那我们如何解决这个问题呢?
一、外国人给出的方案
由于伟大的墙的缘故,我百度无果后,在bing上搜索了相关问题。如果没法翻墙google,用bing搜索就是一个很好的选项。
在bing上,我搜索到了 PNG transparency issue,里面讨论了透明度的讨论。
在此关键信息的翻译如下
Hi All,
I myself fixed this issue in PODOFO.
Issue : Transparency mask is stripped off and not exported as smask.(透明度掩码已经被去除,并且没有作为smask导出)
Solution : I have converted 8 bit images to RGBA image and convert the
transparency stream as a /smask stream in pdf.(我已经转换8位图片为RGBA形式的图片,并且在pdf中将透明度流作为一个smask流)
Tested with 8 bit pallete transparency image and RGBA transparency images(blablabla,这句不重要。)
I dont know how to merge this changes to PODOFO codebase.
这位号称解决了问题的人,叫ram yd,并把代码贴了出来。代码主要是修改了原码中的LoadFromPng
但是经过我的测试,ram yd的代码的确显示出了png的透明度,但却没有rgb色了!
讨论中,还有人提到是因为版本的问题。为此,我还特地找了podofo 0.9.2的版本编译,但结果仍然一样。
虽然这份代码没能直接实现我想要的结果,但却给我们指明了一个方向。
二、艰难的探索之旅
1、我将ram yd的代码与原码进行了比较,发现他主要改了几个地方。
新建了smask_data:png图片在解压后,有rgba四个通道的数据。将alpha通道的数据赋值给smask_data。
将smask_data赋值给smaskstream流,将流赋值给P