三、处理纯色背景的png图片
有些 png 不具备a通道, 但是背景为纯色, 如下图中的一座浮岛的png图片(il.png)所示:
通过观察可以发现, 该图片得背景为 RGB(255, 255, 255) 的纯白色背景, 对于这样的图片, 要实现纯色部分的透明显示最简单的办法就是借助 TransparentBlt 函数, 该函数的作用是将图片中的某一种颜色当做透明颜色并与目标设备中的颜色进行融合, 其函数的原型:
BOOL TransparentBlt(
HDC hdcDest, // 目标设备环境的句柄
int nXOriginDest, // 目标矩形左上角的x轴坐标
int nYOriginDest, // 目标矩形左上角的y轴坐标
int nWidthDest, // 目标矩形宽度
int hHeightDest, // 目标矩形高度
HDC hdcSrc, // 源设备环境句柄
int nXOriginSrc, // 源矩形左上角的x轴坐标
int nYOriginSrc, // 源标矩形左上角的y轴坐标
int nWidthSrc, // 源矩形宽度
int nHeightSrc, // 源矩形高度
UINT crTransparent // 源位图中的RGB值当作透明颜色
);
现在将 BitBlt 和 AlphaBlend 操作替换为 BitBlt 和 TransparentBlt 操作:
BitBlt( hdc, 0, 0, bk_x, bk_y, hdcBk, 0, 0, SRCCOPY );
TransparentBlt( hdc, 200, 0, fr_x, fr_y, hdcFr, 0, 0, fr_x, fr_y, RGB(255, 255, 255) );
运行效果如图:
这种处理方式有个弊端就是, 当图像内部也用到与将被扣去的颜色值时, 抠出来的效果就变得不符合我们期望值, 这时, 通过 PS 或者其他图像处理软件对图片进行二次处理是个不错的办法。
本文中的代码与示例素材下载(含VC6工程文件):
下载地址:
具体下载目录在 /2013年资料/8月/12日/使用 libpng 配合 GDI 完成对 png 图片的解析与显示