网上都是gdiplus的例子,其实GDI也是支持透明度的,放一个例子。
#include "png.h"
#include "zlib.h"
#include <fstream>
#pragma comment(lib, "Msimg32.lib")//AlphaBlend需要
void Draw(HWND hwnd, const char* pngfile, bool layered)
{
png_image image;
memset(&image, 0, (sizeof image));
image.version = PNG_IMAGE_VERSION;
if (!png_image_begin_read_from_file(&image, pngfile)) {
printf("read file error!");
return;
}
png_bytep buffer = (png_bytep)malloc(PNG_IMAGE_SIZE(image));
//读完一行前进的字节数, 因为bmp里面是反向扫描的, 这里直接设置为负数反向读取
png_int_32 row_stride = -(png_int_32)PNG_IMAGE_ROW_STRIDE(image);
if (buffer && !png_image_finish_read(&image, NULL, buffer, row_stride, NULL)) {
printf("read png file error!");
free(buffer);
return;
}
//图片有透明度, 颜色需要预乘, 同时把RGBA转为BGRA
png_bytep buffer2 = buffer;