工作需要,要做一个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);