关于libjpeg修改图片质量的讨论
2010-12-31 10:32
260 查看
大多的开源或不开源的软件处理jpg图像的时候均使用libjpeg开源库,目前最新版本为libjpeg-8b,下载链接为
http://freshmeat.net/projects/libjpeg
里面很多makefile文件,linux下不多说,在win32下,构建vc6工程只要将.vc6后缀名搜索出,将make*dsp.vc6修改为make*dsp.dsp,所有make*dsw.vc6修改为make*dsw.dsw,这里得到makeadsw.dsw和makejdsw.dsw,前者为所有编解码及测试程序工程,后者为简单的libjpeg工程。对于libjpeg的makejdsw生成了一个win32的的.lib库,这里可将库名称修改为libjpeg.lib。这样我们可参考编码程序将图片编码为jpeg图片了。
比如,现在我们利用GDI+打开任意格式图片,而后得到图片的解码数据,便可编译为jpeg图片了。
ps:为何不用GDI+直接保存jpg图片,因GDI+中生成的jpeg质量不满意,嘿嘿
正常情况下,这样也可以满足我们的基本需求,但对于有些图片,比如黑色背景,写白色字体的图片,在压缩时,基本设定质量最高为100,但压缩质量仍不满意,原因便在压缩时的图像采样率上,ASDSee保存jpeg图片格式时,有选择采样率的2 * 1和1* 2,而libjpeg默认为2 * 2,因此会发现ACDSee质量要好些的缘故,如果不介意,可以直接设定为1 * 1,质量会更好些,不过对于这样的图片压缩后的图片大小可能大于原bmp图片大小,具体情况请读者自行参考。
http://freshmeat.net/projects/libjpeg
里面很多makefile文件,linux下不多说,在win32下,构建vc6工程只要将.vc6后缀名搜索出,将make*dsp.vc6修改为make*dsp.dsp,所有make*dsw.vc6修改为make*dsw.dsw,这里得到makeadsw.dsw和makejdsw.dsw,前者为所有编解码及测试程序工程,后者为简单的libjpeg工程。对于libjpeg的makejdsw生成了一个win32的的.lib库,这里可将库名称修改为libjpeg.lib。这样我们可参考编码程序将图片编码为jpeg图片了。
比如,现在我们利用GDI+打开任意格式图片,而后得到图片的解码数据,便可编译为jpeg图片了。
ps:为何不用GDI+直接保存jpg图片,因GDI+中生成的jpeg质量不满意,嘿嘿
// 数据转换// data void init_data(Bitmap &bitmap, unsigned char *pDataConv) { // Btimap int iWidth = bitmap.GetWidth(); int iHeight = bitmap.GetHeight(); Gdiplus::BitmapData bitmapData; Gdiplus::Rect rectPiece(0, 0, iWidth, iHeight); // lock,获取Bitmap数据 bitmap.LockBits(&rectPiece, Gdiplus::ImageLockModeWrite, PixelFormat32bppARGB, &bitmapData); int iBitmapPieceStride = bitmapData.Stride; unsigned long *pBitmapPiecePixels = (unsigned long*)bitmapData.Scan0; // 获取像素点数据 unsigned long ulColorValueTemp = 0; unsigned char usR, usG, usB; for (int y = 0; y != iHeight; ++y) { for (int x = 0; x != iWidth; ++x) { ulColorValueTemp = pBitmapPiecePixels[y * iBitmapPieceStride / 4 + x]; usR = (ulColorValueTemp >> 16); usG = (ulColorValueTemp >> 8); usB = ulColorValueTemp; *pDataConv = usR; ++pDataConv; *pDataConv = usG; ++pDataConv; *pDataConv = usB; ++pDataConv; } } // // memcpy(pDataConv, pBitmapPiecePixels, iWidth * iHeight * 3); bitmap.UnlockBits(&bitmapData); }
默认情况下,不管是GDI+,还是CxImage,OpenCV等常见的开源库均只提供了设定质量的函数,即
jpeg_set_quality()
正常情况下,这样也可以满足我们的基本需求,但对于有些图片,比如黑色背景,写白色字体的图片,在压缩时,基本设定质量最高为100,但压缩质量仍不满意,原因便在压缩时的图像采样率上,ASDSee保存jpeg图片格式时,有选择采样率的2 * 1和1* 2,而libjpeg默认为2 * 2,因此会发现ACDSee质量要好些的缘故,如果不介意,可以直接设定为1 * 1,质量会更好些,不过对于这样的图片压缩后的图片大小可能大于原bmp图片大小,具体情况请读者自行参考。
相关文章推荐
- 关于libjpeg修改图片质量的讨论
- 【discuz】遇到关于图片的操作就崩了?(如:imagecreatefromjpeg),修改php.ini的内容,把php_gd2.dll前面的;去掉
- 关于修改image属性后图片不刷新问题
- 关于在SQL存取JPEG图片的方法一
- 图片质量压缩 与 图片格式 JPEG PNG
- 关于修改ico图片位深度的方法
- DSP一起学习:大家关于lib讨论的部分内容
- 【OpenCV开发】imread和imwrite的类型以及第三个参数关于图片压缩质量等
- 关于使用JS修改图片地址的一点困惑
- C#图片处理之: 另存为压缩质量可自己控制的JPEG
- 关于图片显示质量的细节问题
- 修改图片大小和质量
- ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
- dcm4che 转图片时遇到 Unsupported JPEG process: SOF type 0xc3 CLibJPEGImageReader for format: jpeg 错
- (讨论)关于const修饰的值不能修改的实践
- 关于图片的压缩(大小压缩和质量压缩)BitmapFactory.Options详解
- C#图片处理之:另存为压缩质量可自己控制的JPEG
- 读取和修改JPEG图片文件的头信息EXIF和JFIF
- Nodejs跨平台轻量级图片编解码库【增加Jpeg质量调整】
- 不修改源代码实现Libjpeg内存编解码jpeg