DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

最近,处于项目需要,需要将Bmp转换为JPEG格式。以前做过,采用的是GDI+的方式,该方式有一个极大地缺陷为无法实现跨平台处理。闲话少说,进入正题。

[cpp] view plain copy
 
  1. CxImage cxImageBmp(pRGBBuffer, dwRGBSize, CXIMAGE_FORMAT_BMP);  
  2.   
  3. cxImageBmp.Save("D:\\ttt.jpg",CXIMAGE_FORMAT_JPG);  


该方式很正常,顺利将RGB格式24位BMP图像转化为本地JPG文件并保存下来。

 

但是采用以下内存转换方式,却失败了。

[cpp] view plain copy
 
  1. BYTE* pJpgDataTemp = new BYTE[1024 * 1024];  
  2.   
  3. int lJpgSize = 0;  
  4.   
  5. bool b = cxImageBmp.Encode(pJpgDataTemp, lJpgSize, CXIMAGE_FORMAT_JPG);  


一方面,函数返回值为false;另一方面,数据长度,lJpgSize为0。

 

后来,经过以下修改,成功。

[cpp] view plain copy
 
  1. BYTE* pJpgDataTemp =NULL;  
  2.   
  3. int lJpgSize = 0;  
  4.   
  5. bool b = cxImageBmp.Encode(pJpgDataTemp,lJpgSize,CXIMAGE_FORMAT_JPG);  

 

为什么?下面我们从CxImage::Encode()定义中进行查看:

[cpp] view plain copy
 
  1. bool CxImage::Encode(BYTE * &buffer, long &size, DWORD imagetype)  
  2. {  
  3. if (buffer!=NULL)  
  4.   
  5. {  
  6. strcpy(info.szLastError,"the buffer must be empty");  
  7. return false;  
  8. }  
  9.   
  10.   
  11. CxMemFile file;  
  12. file.Open();  
  13. if(Encode(&file,imagetype))  
  14. {  
  15. buffer=file.GetBuffer();  
  16. size=file.Size();  
  17. return true;  
  18. }  
  19.   
  20.   
  21. return false;  
  22. }  


真相大白!

posted on   DoubleLi  阅读(2217)  评论(1编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示