使用libpng显示png图片

来源:互联网 发布:北上广 知乎 编辑:程序博客网 时间:2024/04/30 14:48

二话不说,上代码先。

 

OPENFILENAMEA ofn = {0};

char szFilter[] ="PNG Files (*.PNG)\0*.png\0"

"All Files (*.*)\0*.*\0\0";

char filename[MAX_PATH]={0};

char file_title[MAX_PATH]={0};

ofn.lStructSize = sizeof(OPENFILENAMEA);

ofn.hwndOwner = m_hWnd;

ofn.hInstance = NULL;

ofn.lpstrFilter = szFilter;

ofn.lpstrCustomFilter = NULL;

ofn.nMaxCustFilter = 0;

ofn.nFilterIndex = 0;

ofn.lpstrFile = filename;

ofn.nMaxFile = MAX_PATH;

ofn.lpstrFileTitle = file_title;

ofn.nMaxFileTitle = MAX_PATH;

ofn.lpstrInitialDir = NULL;

ofn.lpstrTitle = NULL;

ofn.nFileOffset = 0;

ofn.nFileExtension = 0;

ofn.lpstrDefExt = "png";

ofn.lCustData = 0;

ofn.lpfnHook = NULL;

ofn.lpTemplateName = NULL;

ofn.Flags = OFN_HIDEREADONLY;

if (!GetOpenFileNameA(&ofn))

return;

char png_header[8];

png_structp png_ptr;

png_infop info_ptr;

int width, height, bit_depth, color_type;

FILE* file = fopen(ofn.lpstrFile, "rb");

fread(png_header, 1, 8, file);

if (png_sig_cmp((png_const_bytep)png_header, 0, 8))

{

fclose(file);

return;

}

png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);

info_ptr = png_create_info_struct(png_ptr);

if (setjmp(png_jmpbuf(png_ptr)))

{

png_destroy_read_struct(&png_ptr, &info_ptr, NULL);

fclose(file);

return;

}

png_init_io(png_ptr, file);

png_set_sig_bytes(png_ptr, 8);

 

png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, NULL);

png_bytep *row_pointers = png_get_rows(png_ptr, info_ptr);

 

png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *)&width, (png_uint_32 *)&height, &bit_depth, &color_type, NULL, NULL, NULL);

 

png_uint_32 ulRowBytes = png_get_rowbytes(png_ptr, info_ptr);

png_uint_32 ulChannels = png_get_channels(png_ptr, info_ptr);

 

DWORD wDIRowBytes = (WORD) ((3 * width + 3L) >> 2) << 2;

BYTE *pDib = (BYTE *) malloc (sizeof(BITMAPINFOHEADER) + wDIRowBytes * height);

BITMAPINFOHEADER *pbmih = (BITMAPINFOHEADER *) pDib;

memset(pbmih, 0, sizeof(BITMAPINFOHEADER));

pbmih->biSize=sizeof(BITMAPINFOHEADER);

pbmih->biWidth=width;

pbmih->biHeight=-height;

pbmih->biPlanes=1;

pbmih->biBitCount=24;

pbmih->biCompression=BI_RGB;

pbmih->biSizeImage=0;

pbmih->biXPelsPerMeter=0;

pbmih->biYPelsPerMeter=0;

pbmih->biClrUsed=0;

pbmih->biClrImportant=0;

BTYE *pDiData = pDib + sizeof(BITMAPINFOHEADER);

for (int j = 0; j < height; j++)

{

for (int i = 0; i < width; i++)//rgba

{

//should in bgr order

pDiData[3*j*width + 3*i] = row_pointers[j][ulChannels*i + 2];

pDiData[3*j*width + 3*i + 1] = row_pointers[j][ulChannels*i+1];

pDiData[3*j*width + 3*i + 2] = row_pointers[j][ulChannels*i];

}

}

//data is ready to display

SetDIBitsToDevice (hdc, 0, 0, width, height, 0, 0, 0, height, pDiData, (BITMAPINFO *) pDib, DIB_RGB_COLORS);

free(pDib);

png_destroy_read_struct(&png_ptr, &info_ptr, NULL);

fclose(file);

--完--

如果需要完整源码的工程可以从这里http://download.csdn.net/detail/qiuchangyong/7504751下载,

也可以从这里http://www.pudn.com/downloads633/sourcecode/windows/bitmap/detail2570501.html下载到。

0 0
原创粉丝点击