bmp转JPG问题

n112339 2009-12-02 02:04:20
初次处理图片,对JPG的格式不是很了解,想通过BMP转JPG格式来加强JPG的理解.大侠们给段最原始的代码啊,在网络上搜索到的都是调用库什么的的,真正的转换过程都看不到代码.我想学习最基础的,谢谢各位大侠帮忙
...全文
1406 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
cpu_amd 2011-07-14
  • 打赏
  • 举报
回复
我现在也遇到了这个问题
FL06052146 2011-07-01
  • 打赏
  • 举报
回复
谁给个源代码呀!!!
gamedragon 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 liuchui2009 的回复:]
引用 26 楼 n112339 的回复:
谁能给我发个代码谢谢了

大家说了这么多方法,结果你来了一句这样的,lz我很服你了
[/Quote]
看LZ的问题还以为看到了一个CSDN上少见的好学青年,结果太失望了
loop_k 2009-12-26
  • 打赏
  • 举报
回复
CXImage VC下实现,各种编码方式。
或者用OPenCV 实现方便。
liuchui2009 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 n112339 的回复:]
谁能给我发个代码谢谢了
[/Quote]
大家说了这么多方法,结果你来了一句这样的,lz我很服你了
n112339 2009-12-20
  • 打赏
  • 举报
回复
谁能给我发个代码谢谢了
aaaa3105563 2009-12-06
  • 打赏
  • 举报
回复
UP
S_S_Ge 2009-12-06
  • 打赏
  • 举报
回复
up
副组长 2009-12-06
  • 打赏
  • 举报
回复
JpegDll,能够满足你全部要求。

如果你仅仅需要JPG部分,不要用CxImage。如果你不是为了学习,不要从头写JPG代码。
Akrit 2009-12-06
  • 打赏
  • 举报
回复
自己写吧,多有成就感 :-)
falcon_cjj 2009-12-06
  • 打赏
  • 举报
回复
我也正在找这个,学习了
LPR_Pro 2009-12-04
  • 打赏
  • 举报
回复
CXImage
lonkil 2009-12-03
  • 打赏
  • 举报
回复
自己写的话,很麻烦,直接用GDI+,省心。
cloudyi 2009-12-03
  • 打赏
  • 举报
回复
找本图像通信方面的书看下就可以了解算法了, 大概说下:
BMP到JPG压缩:
1. 将RGB色彩空间转化为YUV空间
2. 将图像数据分割成8*8数据块
3. 对8*8数据块进行前向DCT(离散余弦变换)和反向DCT变换
4. 变换后根据亮度信号和色差信号量化表进行量化对变换结果进行量化
5. 直流系数和交流系数进行扫描Z字型扫描, 即行程编码过程
6. 对行程编码的结果进行熵编码, 典型的如霍夫曼编码
cloudyi 2009-12-03
  • 打赏
  • 举报
回复
找本图像通信方面的书看下就可以了解算法了, 大概说下:
BMP到JPG压缩:
1. 将RGB色彩空间转化为YUV空间
2. 将图像数据分割成8*8数据块
3. 对8*8数据块进行前向DCT(离散余弦变换)和反向DCT变换
4. 变换后根据亮度信号和色差信号量化表进行量化对变换结果进行量化
5. 直流系数和交流系数进行扫描Z字型扫描, 即行程编码过程
6. 对行程编码的结果进行熵编码, 典型的如霍夫曼编码
lyllm_117228 2009-12-03
  • 打赏
  • 举报
回复
OpenCV
CxImage
用户 昵称 2009-12-03
  • 打赏
  • 举报
回复
厄使用现成的,这jpg太复杂了。
会飞的老鱼 2009-12-03
  • 打赏
  • 举报
回复
我这来一个使用JpegFile类处理JPEG的代码:

/*************************************************************************
*
* 函数名称:
* SaveJPEG()
*
* 参数:
* HDIB hDIB - DIB 句柄
* CString fileName - 用于保存文件路径和文件名
*
* 返回值:
* void - 无返回值
*
* 说明:
* 该函数对24位DIB位图象进行JPEG编码压缩
*
************************************************************************/

void CMyJPEG::SaveJPEG(HDIB hDIB, CString fileName)
{
// this assumes your data is stored as a 24-bit RGB DIB.
// if you have a 1,4,8,15/16 or 32 bit DIB, you'll have to
// do some work to get it into a 24-bit RGB state.

if (hDIB==NULL) {
AfxMessageBox("图像数据错!");
return;
}

UINT width=0,height=0;

// 定义指向DIB的指针并锁定DIB
LPBYTE lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB);

// 读取DIB位图信息头(令指针lpBIH指向DIB位图信息头),获取图像宽度和高度
LPBITMAPINFOHEADER lpBIH=(LPBITMAPINFOHEADER)lpDIB;

width=lpBIH->biWidth;
height=lpBIH->biHeight;

if(lpBIH->biBitCount!=24) //位图不是24位的
{
AfxMessageBox("图像不是24位的!");

// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);

return;
}

BYTE* buf=m_DIB.FindDIBBits(lpDIB); //获取DIB的位图阵列首地址

BYTE *tmp_buf=NULL;

// assume buf is a DWORD-aligned BGR buffer, vertically flipped
// as if read from a BMP file.

//变量widthBytes用于存放24位位图像一行像素所需的存储空间的大小。
//注:DIB规定以字节为单位的每行长度始终要是4的倍数。
UINT widthBytes=(width*24+31)/32*4;

// un-DWORD-align
tmp_buf=JpegFile::RGBFromDWORDAligned(buf,
width,
widthBytes,
height);

// vertical flip(垂直翻转图像,因为位图像是自下向上存放的,
// 而 JPEG 图像是自上而下存放的。)
JpegFile::VertFlipBuf(tmp_buf, width*3, height);

// reverse BGR(BGR -> RGB)(交换DIB位图阵列中每个像素的红色分量
// 和蓝色分量,得到RGB图像数据。)
JpegFile::BGRFromRGB(tmp_buf, width, height);

if (tmp_buf==NULL) {
AfxMessageBox("~DWORD Memory Error!");

// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);

return;
}

int quality;
quality=80; // JPEG 文件的质量

// write it(保存RGB图像数据为 JPEG 图像文件)
BOOL ok=JpegFile::RGBToJpegFile(fileName,
tmp_buf,
width,
height,
TRUE,
quality);
if (!ok) {
AfxMessageBox("Write Error!");
}

// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);

delete [] tmp_buf; //删除存放RGB图像数据的存储空间
}

至于JpegFile类的源代码自己可以上网搜一下。
注:JpegFile类是Chris Losinger于1997年编写的一个用jpeglib函数库来处理jpeg文件的C++类。
liuchui2009 2009-12-03
  • 打赏
  • 举报
回复
http://download.csdn.net/source/1108244下个源代码来参考下
或者参考这个网站http://www.vckbase.com/document/viewdoc/?id=1177
gxx2019 2009-12-02
  • 打赏
  • 举报
回复
用libjpeg,自己写的代码大概50行
用cxImage,自己写的代码3行
用GDAL,自己写的大概4行
如果你想自己不用任何库,纯C写,建议到JPEG官网上找些资料看,主要算法是8*8的离散余弦逆变换,huffman逆变换等,代码要3000行左右,外加一堆时间。如果你有充足的时间并想锻炼下自己的能力,用最后一种。如果你只是想能变换出个图片,用前三种,搜一下GDAL,cximage的用法就有了
加载更多回复(11)

19,468

社区成员

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

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