用libjpeg.lib库把BMP压缩成JPG的问题
如题,本人利用libjpeg.lib库,并参考赵新国的“使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)”和代码,http://hi.baidu.com/d_south/blog/item/621285d494e41c09a08bb706.html
但是有些图像可以成功压缩,但很多图片会都出现扭曲并且彩色图变成灰度图啦,不知道是什么原因,希望有高手可以解答!
代码如下:
void CBMPtoJPGDlg::OnBtnSave()
{
// TODO: Add your control notification handler code here
CString l_strExt;
FILE* l_oFile;
static char BASED_CODE szFilter[] = "JPG Files (*.jpg)|*.jpg|All Files (*.*)|*.*||";
l_strExt = "jpg";
//保存文件对话框
CFileDialog SaveDialog(FALSE, l_strExt, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
SaveDialog.DoModal();
m_strJPGFile = SaveDialog.GetPathName();
//AfxMessageBox(m_strJPGFile); //测试路径是否正确
//分配缓冲区,用来存放图像数据
m_pDataConv = new UCHAR[m_realWidth*m_Height];
if (m_pDataConv == NULL)
{//分配内存失败
delete[] m_pDataConv;
return;
}
//将图像R与B分量互换
int i = 0;
for (i = 0; i<m_Width*m_Height; i++)
{
m_pDataConv[i*3] = m_pData[i*3+2];
m_pDataConv[i*3+1] = m_pData[i*3+1];
m_pDataConv[i*3+2] = m_pData[i*3];
}
/*申请并初始化jpeg压缩对象,同时要指定错误处理器*/
struct jpeg_compress_struct jcs;
// 声明错误处理器,并赋值给jcs.err域
struct jpeg_error_mgr jem;
jcs.err = jpeg_std_error(&jem);
jpeg_create_compress(&jcs);
/*指定压缩后的图像所存放的目标文件,注意,目标文件应以二进制模式打开 */
l_oFile = fopen(m_strJPGFile, "wb");
//打开错误时的处理?????
if (l_oFile == NULL)
{
AfxMessageBox("文件操作错误,请检查保存路径!");
//delete [] m_pData;
//delete [] m_pDataConv;
return;
}
jpeg_stdio_dest(&jcs, l_oFile);
/*
设置压缩参数,主要参数有图像宽、高、色彩通道数(1:索引图像,3:其他),
色彩空间(JCS_GRAYSCALE表示灰度图,JCS_RGB表示彩色图像),压缩质量等
*/
jcs.image_width = m_Width; // 为图的宽和高,单位为像素
jcs.image_height = m_Height;
jcs.input_components = m_iMode; //在此为1(MODE_GRAYSCALE),表示灰度图,如果是彩色位图,则为3(MODE_RGB)
switch (m_iMode)
{
case MODE_RGB:
jcs.in_color_space = JCS_RGB;
break;
case MODE_GRAYSCALE:
jcs.in_color_space = JCS_GRAYSCALE;
break;
}//JCS_GRAYSCALE表示灰度图,JCS_RGB表示彩色图像
jpeg_set_defaults(&jcs);
jpeg_set_quality (&jcs, 80, true);
/*
首先调用jpeg_start_compress,然后可以对每一行进行压缩,也可以对若干行进行压缩,甚至
可以对整个的图像进行一次压缩,压缩完成后,记得要调用jpeg_finish_compress函数
*/
jpeg_start_compress(&jcs, TRUE);
JSAMPROW row_pointer[1]; // 一行位图
int row_stride; // 每一行的字节数
row_stride = jcs.input_components*jcs.image_width;
// 对每一行进行压缩
while (jcs.next_scanline < jcs.image_height)
{
//从图像的最后一行开始压缩
row_pointer[0] = &m_pDataConv[(jcs.image_height-jcs.next_scanline-1) * row_stride];
//row_pointer[0] = &m_pData[jcs.next_scanline * row_stride];
jpeg_write_scanlines(&jcs, row_pointer, 1);
}
jpeg_finish_compress(&jcs);
//释放压缩工作过程中所申请的资源
jpeg_destroy_compress(&jcs);
fclose(l_oFile);
delete [] m_pData;
delete [] m_pDataConv;
}