2个回答
展开全部
如何在Windows应用程序中显示jpeg和png格式的图片 源代码片段(zip压缩包,5k) 依赖的第三方库(zip压缩包,900k) 经常看到有人在bbs技术版面上问类似的问题,简要介绍一下怎么解决这个小问题。因为Win32 API只对bmp格式的位图提供基本支持,所以需要使用第三方库来完成这个任务。GDI+其实就是一个很好的选择,不仅支持多种图片格式,而且支持图像处理操作,并且做了一定的优化,接口定义也十分清晰。 这里讲的是基于Independent Jpeg Group的JpegLib和libpng.org的libpng两个库的解决方案。Jpeg和png两种格式都是带压缩的图像格式,,所不同的是jpeg使用了有损压缩,png使用了无损压缩。要在Windows程序中显示这两种图片需要将压缩过的图片在内存中还原为位图。相对而言bmp格式的图片处理起来就容易得多,以至于查查资料每个人都可以写一个读取bmp图片的模块,当然,也不完全那么容易,还要考虑多种颜色模式和bmp图片中4像素对齐的问题。OK,不管jpeg和png读取多么麻烦,ijg和libpng.org已经写好了读取这两种格式文件的库,这两个库都是用C语言写的,期中libpng依赖于zlib,而zlib也是用C写成。 最近做的项目需要使用jpeg和png图片,这里把一些代码片段(没有DEMO,单读取文件部分是完整的)分享一下,这些代码的原始版本并不是我们小组写的,但是我们进行了封装并且修复了一些bug(比如内存泄露)。本来是想做个小DEMO演示一下,但是工作量比较大(我试图同时支持vc6,vc71,vc80,dev-cpp等等)。 以下是载入jpeg图片的方法: C++代码 HBITMAP PictureLoader::LoadJpegPicture( const char* fileName ) { FILE * jpegFile; struct jpeg_error_mgr jerr; struct jpeg_decompress_struct cinfo; if ((jpegFile = fopen(fileName, "rb")) == NULL) { return HBITMAP(0); } cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, jpegFile); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); int rowSize = cinfo.output_width * cinfo.output_components; int width=cinfo.output_width; int height=cinfo.output_height; BYTE *bmpBuffer=new BYTE[(height+1)*width*3]; BYTE **pBuffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, rowSize, 1); while(cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, pBuffer, 1); int start=rowSize*(cinfo.output_scanline-1); for(int i = 0; i < rowSize; i++) { bmpBuffer[start+i]=pBuffer[0][i]; } } jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); HBITMAP bitmap = CreateBitmapFromBuffer(bmpBuffer, width, height); fclose(jpegFile); delete[] bmpBuffer; return bitmap; }
博思aippt
2024-07-20 广告
2024-07-20 广告
博思AIPPT是基于ai制作PPT的智能在线工具,它提供了4种AI制作PPT的方式,包括AI生成大纲、AI直接生成PPT、文本生成PPT、AI提炼word文档生成PPT,一站式集成多种AI生成PPT的方式,可满足办公用户的不同需求和使用场景...
点击进入详情页
本回答由博思aippt提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询