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);

