使用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下载到。
- 使用libpng显示png图片
- 使用libpng显示png图片
- 使用libpng显示外部png图片
- 教你如何使用libpng显示png图片
- 教你如何使用libpng显示png图片
- 使用libpng和GDI读取显示png图片
- 使用libpng解码png图片
- libpng解析png图片,用SDL显示
- 使用libpng读取PNG图片像素数据 .
- OpenGL使用libPng读取png图片
- OpenGL使用libPng读取png图片
- 使用 Libpng 配合 GDI 完成对 png 图片的解析与显示
- LIBPNG显示PNG图像
- 图像解码之二:使用libpng解码png图片
- 图像解码之二:使用libpng解码png图片
- zlib 与 libpng 的配置与使用 part 3 libpng的安装与生成PNG图片
- zlib 与 libpng 的配置与使用 part 3 libpng的安装与生成PNG图片
- zlib 与 libpng 的配置与使用 part 3 libpng的安装与生成PNG图片
- KGDB 相关资源
- Tomcat端口问题
- 基于对话框的MFC应用程序加入Accelerator
- ERROR: No viable tables matched specification.
- 百度地图静态库的合成
- 使用libpng显示png图片
- document.body is null
- Android布局大全
- Qt浅谈之二:钟表(时分秒针)
- Sed学习笔记
- windows下svn的安装和配置
- ONVIF: gsoap安装过程
- mysql 查找包含某些字段且不包含另一些字段的表
- EA强大的画图工具---设计数据库表格