This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

在dsp64x上实现24位RGB或YUV压缩jpeg算法问题求助

Other Parts Discussed in Thread: TMS320DM648

TI,你好:

我现在用TMS320DM648,准备把存储在三个空间的RGB图像转成jpeg图像压缩,不知道TI有无专门的库文件或代码实现在dsp上的jpeg压缩,我在网上找了一个24位RGB真彩色bmp图像转jpeg的压缩算法,在计算机通过VS软件能够实现从10 20  40  60  80  100质量因子的压缩,但当移植到DSP上运行时,当无压缩比时,能够实现bmp到jpeg的转换,但是当质量因子=80时,转换后的jpeg图像颜色失真,当小于80时,jpeg图像已看不出原来图像信息了,为何从计算机移植到dsp上,差别这么大呢,望给予指导,谢谢。下面是我的main函数中调用的jpeg压缩函数。

void JpegCompress(void)
{
	FILE *Bmp_File;
	FILE *Jpg_File;
	Uint8 quality;//图片压缩品质参数
	JPEGINFO JpgInfo;//JPEG文件结构
	Pic_Para src;	
	Uint8 *BmpData;
	Uint8 *pYBuff,*pUBuff,*pVBuff;

	//配置图片参数	
	Bmp_File = fopen("E:\\7.bmp", "rb");//读入图片数据
	fseek(Bmp_File,14+40, SEEK_SET);
	fread(pBuff, Bmp_Width * Bmp_Height*3, 1, Bmp_File);

	//ZeroMemory(&JpgInfo,sizeof(JPEGINFO));
	JpgInfo.bytenew = 0;
	JpgInfo.bytepos = 7;
	
	src.height = Bmp_Height;
	src.width = Bmp_Width;
	src.pBMPBuffer = pBuff;//指向BMP数据区
	//开辟空间
	pYBuff = &pYUVBuff[0][0];
	pUBuff = &pYUVBuff[Bmp_Height][0];
	pVBuff = &pYUVBuff[Bmp_Height*2][0];
	//将RGB信号转换为YUV信号
	BmpData = src.pBMPBuffer;
	BGR2YUV111(BmpData,pYBuff,pUBuff,pVBuff,src.width,src.height);
	//将信号分割为8x8的块
	DivBuff(pYBuff, src.width, src.height,  src.width, DCTSIZE, DCTSIZE );  
	DivBuff(pUBuff, src.width, src.height,  src.width, DCTSIZE, DCTSIZE );  
	DivBuff(pVBuff, src.width, src.height,  src.width, DCTSIZE, DCTSIZE ); 
	
	quality = QualityScaling(100);//10 20  40  60  80  100
	SetQuantTable(std_Y_QT,JpgInfo.YQT, quality);// 设置Y量化表
	SetQuantTable(std_UV_QT,JpgInfo.UVQT,quality);// 设置UV量化表

	InitQTForAANDCT(&JpgInfo);// 初始化AA&N需要的量化表
	JpgInfo.pVLITAB=JpgInfo.VLI_TAB + 2048;// 设置VLI_TAB的别名
	BuildVLITable(&JpgInfo);// 计算VLI表   

	JpgImageSize = 0;
	//写入各段
	memset(JpgImage,0x00,MAXOUTLEN);
	JpgImageSize = WriteSOI(JpgImage,JpgImageSize); 
	JpgImageSize = WriteAPP0(JpgImage,JpgImageSize);
	JpgImageSize = WriteDQT(&JpgInfo,JpgImage,JpgImageSize);
	JpgImageSize = WriteSOF(JpgImage,JpgImageSize,src.width,src.height);
	JpgImageSize = WriteDHT(JpgImage,JpgImageSize);
	JpgImageSize = WriteSOS(JpgImage,JpgImageSize);
	
	//计算Y/UV信号的交直分量的huffman表,这里使用标准的huffman表,并不是计算得出,缺点是文件略长,但是速度快
	BuildSTDHuffTab(STD_DC_Y_NRCODES,STD_DC_Y_VALUES,JpgInfo.STD_DC_Y_HT);
	BuildSTDHuffTab(STD_AC_Y_NRCODES,STD_AC_Y_VALUES,JpgInfo.STD_AC_Y_HT);
	BuildSTDHuffTab(STD_DC_UV_NRCODES,STD_DC_UV_VALUES,JpgInfo.STD_DC_UV_HT);
	BuildSTDHuffTab(STD_AC_UV_NRCODES,STD_AC_UV_VALUES,JpgInfo.STD_AC_UV_HT);

	// 处理单元数据
	JpgImageSize = ProcessData(&JpgInfo,pYBuff,pUBuff,pVBuff,src.width,src.height,JpgImage,JpgImageSize);  
	JpgImageSize = WriteEOI(JpgImage,JpgImageSize);
	
	Jpg_File = fopen("E:\\aa.jpg","wb"); 
	fwrite(JpgImage,JpgImageSize,1,Jpg_File);	
	fclose(Jpg_File);