Stone

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  0 随笔 :: 2 文章 :: 2 评论 :: 0 Trackbacks
工作需要,要做一个jpeg压缩的对话框,用的是开源的库wxWidgets,并且提供有相应的API来实现压缩的功能,看似很简单的一个东西,原以为三五分钟就可以搞定的,最后折腾了半天。下面是最开始的代码:


1         wxInitAllImageHandlers();                        //首先初始化handlers
 2         wxString str = wxFileSelector();                 //从硬盘里选择个image
 3         wxImage image(str);                              //构造个wxImage对象               
 4         image.SetOption(wxIMAGE_OPTION_QUALITY,10);      //就是调用这个API进行压缩
 5         image.SaveFile(_T("save.jpg"));                  //保存到本地看一下效果,ok,也压缩了


但最后用dc进行绘制时需要转换为wxBitmap才能进行绘制,所以我就有了下面的操作
          wxBitmap bitmap(image);
但当我用这个生成的bitmap进行绘制时,发现并不是我压缩过的图片,竟然还是原图,就是从硬盘里读出的数据,这让我非常纳闷,最后确认了是调用SetOption()时,数据只是在内存中进行了操作,并没有apply到真正的数据里,在保存结果时,才把压缩后的数据保存为数据文件(也就是本地的jpeg文件)
最后用了数据流的方式,来解决了这个问题,好像也只能用数据流的方式来解决,这个应该是经验的问题,以前没有过这种经验。解决问题的代码如下,仅供参考(第一次发帖,排版不好,请见谅):
  wxInitAllImageHandlers();
  wxString str 
= wxFileSelector(); //Select a jpeg image from the disk
  wxImage originalImage(str);
  originalImage.SetOption(wxIMAGE_OPTION_QUALITY,
10);
  
// Save JPEG in reduced quality
  wxMemoryOutputStream compressedJpeg;
  originalImage.SaveFile(compressedJpeg);
  
// Load just created JPEG into new image
  wxImage compressedImage(wxMemoryInputStream(compressedJpeg));
  
// Convert image to bitmap for displaying
  wxBitmap bitmap(compressedImage); 


posted on 2008-08-23 00:12 Stonexin 阅读(1008) 评论(2)  编辑 收藏 引用

评论

# re: 利用wxWidgets进行jpeg压缩并实时显示[未登录] 2011-07-22 12:35 李健
originalImage.SaveFile(compressedJpeg);
这一行编译不过  回复  更多评论
  

# re: 利用wxWidgets进行jpeg压缩并实时显示 2011-07-22 15:42 xinst
@李健
编译不过?
bool SaveFile(wxOutputStream& stream, int type)
或者需要加一个类型。可以看一下wxWidgets的参考手册  回复  更多评论