用Podofo绘制带透明度的png图片

用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值