bmp-用IJG的jpeg库压缩DIB位图出现色彩失真。

问题描述

用IJG的jpeg库压缩DIB位图出现色彩失真。
    这是用IJG的jpeg库编写的一段压缩DIB位图的程序,程序运行没问题,结果图形色彩却出现了严重的失真:
jpeg_compress_struct jpeg;
jpeg_error_mgr jerr;
jpeg.err = jpeg_std_error(&jerr);    //错误输出在绑定
jpeg_create_compress(&jpeg);    //初始化压缩对象

//定义压缩后的输出,这里输出到一个文件!
FILE* pFile = fopen( "d:\myjpeg.jpeg","wb");
if( !pFile ) return;

jpeg_stdio_dest(&jpeg, pFile);  //绑定输出
jpeg.image_width = bmp.bmWidth;
jpeg.image_height = bmp.bmHeight;
jpeg.input_components = 3;
jpeg.in_color_space = JCS_RGB;
jpeg_set_defaults(&jpeg);
jpeg_set_quality(&jpeg, 60, TRUE);
jpeg_start_compress(&jpeg, TRUE);

JSAMPROW row_pointer[1];
for(int i=0;i<bmp.bmHeight;i++) //采用倒序压缩,因DIB位图为倒序
{
    row_pointer[0] = (pBits +( bmp.bmHeight - (i+1))* 4 *((bmp.bmWidth * 24 + 31) / 32));
    jpeg_write_scanlines(&jpeg, row_pointer, 1);
}
jpeg_finish_compress(&jpeg);
jpeg_destroy_compress(&jpeg);
fclose( pFile ); pFile = NULL;

因网络问题无法上传图片,求高手解答,非常感谢!

解决方案

压缩肯定有一定的失真,压缩比率别压太狠。

解决方案二:

我各种比例都试了一下,色彩效果都一样。

时间: 2024-10-29 01:01:44

bmp-用IJG的jpeg库压缩DIB位图出现色彩失真。的相关文章

windows下 vc6.0中使用speex库压缩音频文件

问题描述 windows下 vc6.0中使用speex库压缩音频文件 想在windows下使用speex库压缩音频文件 代码使用speex文档中附录A的代码 只是把其中的文件路径修改了 但是编码之后的文件大小只用2K 原文件900K左右,而且解码后无法播放,全是杂音,请问是怎么回事 编码文件是PCM格式的. 代码如下 #include #include #include #include #define FRAME_SIZE 160 void main() { FILE *fin,*fout;

求vc对dib位图局部缩放程序

问题描述 求vc对dib位图局部缩放程序 解决方案 解决方案二:局部缩放仅仅是bitblt函数参数的调整,加上双缓存

BMP、GIF、JPEG、PNG以及其他图片格式简介

BMP格式 BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持.随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用.这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大.所以,目前BMP在单机上比较流行. GIF格式 GIF是英文Graphics Interchange Format(图形交换格式)的缩写.顾名思义,

用JPEG算法压缩文本的试验

JPEG图像压缩算法是有损算法.每次当你打开图片编辑.保存的时候,图片中一部分原始内容就会丢失.但是,人们很难用肉眼观察到其中的差别.因此,我们就来压缩下<罗密欧与朱丽叶>,把虚拟的"压缩"现实化. 压缩后片段: "O Romep+ Rpldo wiepffnre arr!riov Romep@ Dgoy thz gatggr `me tefusf sgx n`me!" 原文: O Romeo, Romeo! wherefore art thou Rom

Jpeg 库的解码OpenCL优化

libJpeg库解码OpenCL优化 这两周在闲暇时基于通用的libjpeg库重新做了一个opencl解码实现.重新熟悉下算法. 代码路径 https://github.com/jxt1234/platform_external_jpeg OpenCL文件夹目录下面的就是所有的修改. 用Xcode开发的,没兴趣去整Makefile了,代码独立,移植集成也很方便. 主要特点 1.算法代码完全独立,不修改原来库中的代码. 2.支持各种YUV格式(411.422.444等等). 3.霍夫曼解码仍然由C

使用jpeglib库实现bmp转jpg

一.vc编译jpeglib库 1.下载源代码 下载地址:http://www.ijg.org/.注意:一定要下载win32 版本 2.编译源代码.     A.解压源代码,修改源代码中jconfig.vc为jconfig.h:     B.添加环境变量PATH,C:/Program Files/Microsoft Visual Studio/VC98/Bin :     C.修改makefile.vc,将 Pull in standard variable definitions下面的一行换为:

最简单的视音频播放示例2:GDI播放YUV, RGB

前一篇文章对"Simplest Media Play"工程作了概括性介绍.后续几篇文章打算详细介绍每个子工程中的几种技术.在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和它们属于同一层面的的简单的技术--GDI作为热身. GDI简介 下面这段文字摘自维基百科: 图形设备接口(Graphics Device Interface或Graphical Device Interface,缩写GDI),是微软公司视窗操作系统(Microsoft Windows)的三

mcu-请教jpeglib库在压缩存储jpeg图片的详细过程

问题描述 请教jpeglib库在压缩存储jpeg图片的详细过程 jpeg库在压缩存储rgb数据时,是以压缩后的MCU为单位存储,还是以压缩后的一行rgb数据为单位存储? jpeg在压缩图片时不是以8x8的像素块(MCU也可能不是8x8)来编码的么,为什么它提供的 jpeg_write_scanlines()函数给人的感觉是压缩一行像素图,再把压缩后的数据存入文件中而不是存储一个压缩后的MCU.

Android图片压缩以及优化实例

前言 图片压缩在Android技术中已经属于烂大街,上周看了2个开源库然后对自己项目的压缩做了对比,发现一些新东西,记录与此. 为何要压缩 1.体积的原因 如果你的图片是要准备上传的,那动辄几M的大小肯定不行的,况且图片分辨率大于设备分辨率的话毫无意义. 2.内存原因 如果图片要显示下Android设备上,ImageView最终是要加载Bitmap对象的,就要考虑单个Bitmap对象的内存占用了,如何计算一张图片的加载到内存的占用呢?其实就是所有像素的内存占用总和: bitmap内存大小 = 图