用libjpeg.lib库把BMP压缩成JPG的问题

lyon&tvb 2009-06-13 04:28:46
如题,本人利用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;
}
...全文
663 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
宇文课本 2012-10-23
  • 打赏
  • 举报
回复
楼主,能具体说下你的宽度是怎么设置不对的吗,谢谢!
ljpdb 2012-08-13
  • 打赏
  • 举报
回复
请问被压缩的图片是BMP的吗?在哪里输入的?
caroline_sunny 2012-06-19
  • 打赏
  • 举报
回复
你好,最近在做相关的东西,请问程序里的m_pDataConv怎么定义?
wawagua 2011-10-08
  • 打赏
  • 举报
回复
你里面很多变量都没有定义啊:m_pDataConv,m_strJPGFile
lyon&tvb 2009-06-15
  • 打赏
  • 举报
回复
知道原因啦,原来是我没有处理好BMP文件的数据,图像的宽度设得不对!
seefront1 2009-06-13
  • 打赏
  • 举报
回复
我认为您可以先尝试着分析 不正常压缩的文件参数(色深等)与正常压缩的文件有什么不一样,再针对不同的参数对程序进行调整。

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧