内存中的bmp转换成内存中的jpg?

hiox_ppl 2006-11-06 04:53:56
程序是用VC++ 6.0的MFC
内存中的bmp数据是用摄像头采集的,我要把它转化成jpg数据之后在网络上传输(不要存成文件,那样影响速度).
我有用过jpeg.lib库
里面有两个函数
extern "c"
{
void RGBtoJPEGBuff(BYTE* Buff,DWORD ImageWidth,DWORD ImageHeight,BYTE *outJPEGBuff,DWORD *BuffLen);
void RGBtoJPEGFile(BYTE* Buff,DWORD ImageWidth,DWORD ImageHeight,char* outFileName);
}
RGBtoJPEGFile这个我用过可以
RGBtoJPEGBuff这个也可以用,只是转换过后得到的内容有问题。
如:
RGBtoJPEGBuff(Buff1,ImageWidth,ImageHeight,outJPEGBuff1,DWORD *BuffLen1);
RGBtoJPEGBuff(Buff2,ImageWidth,ImageHeight,outJPEGBuff2,DWORD *BuffLen2);
outJPEGBuff2的内容=outJPEGBuff1的内容+我想要的buff2转换的实际内容(outJPEGBuff2+BuffLen1),也就是后面转换的会把前面所有转换过的累加进去,这是什么原因?怎样解决?

有没有什么其它的转换方法?(最好有原码)
...全文
1056 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiox_ppl 2006-12-12
  • 打赏
  • 举报
回复
楼上的我试了一下,在vc++6.0里不行,在vc++.net里可以运行(做一点修改)
我得到的是24位的纯数据,你的方法应该要在数据前加上bmp头,形成完整的位图文件再转化吧
缔峰泽科技 2006-12-12
  • 打赏
  • 举报
回复
不要在数据前加上bmp头,自动加上,我存的是JPG,有一些函数我没有写出可以到网上找到或在MSDN上找得到
缔峰泽科技 2006-12-10
  • 打赏
  • 举报
回复
回复楼主我已解决
内存中转换绝对可行
void Cmfc对话框Dlg::OnBnClickedButton3()
{
CImage mmage;
HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND.
HDC hScreenDC = ::GetDC(hWnd); //获得屏幕的HDC.
HDC MemDC = ::CreateCompatibleDC(hScreenDC);
RECT rect;

::GetWindowRect(hWnd,&rect);

HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC,rect.right,rect.bottom);
HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
::BitBlt(MemDC,0,0,rect.right,rect.bottom,hScreenDC,rect.left,rect.top,SRCCOPY);
hBitmap=(HBITMAP)::SelectObject(MemDC,hOldBMP);

mmage.Attach(hBitmap);
IStream* pStmImage = NULL;

HGLOBAL hMemBmp = GlobalAlloc(GMEM_MOVEABLE,0);//可移动的缓冲区
if (hMemBmp == NULL) return;
CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmImage);//将内存区B作为流的起始
if (pStmImage == NULL)

{
GlobalFree(hMemBmp);
MessageBox(L"为空");
return ;
}
mmage.Save(pStmImage,ImageFormatJPEG);

BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);//得到缓冲区的起始地址

CFile mfile(L"234.jpg",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
GlobalUnlock(hMemBmp);
mfile.Write(pbyBmp,GlobalSize(hMemBmp));
mfile.Close();
pStmImage->Release();
GlobalFree(hMemBmp);
if(mmage)
mmage.Destroy();
::DeleteObject(MemDC);
::ReleaseDC(hWnd,hScreenDC);}
hiox_ppl 2006-12-08
  • 打赏
  • 举报
回复
大家说的可行方法,能不能把代码贴出来或发一份给我
dirdirdir3 2006-12-08
  • 打赏
  • 举报
回复
还不如压成视频传输,特别是连续的时候
宙斯之神 2006-12-08
  • 打赏
  • 举报
回复
gdi+吧
http://blog.csdn.net/lixiaosan/archive/2006/04/28/694790.aspx
呵呵 抄来的
kanglipeng 2006-12-06
  • 打赏
  • 举报
回复
CXIMAGE的Decode!
argenCHN 2006-12-06
  • 打赏
  • 举报
回复
不知道,帮顶
hiox_ppl 2006-12-06
  • 打赏
  • 举报
回复
to:lhxx(随风)

有没有IJL的库和示例,发一份给我,谢谢
hiox_ppl@163.com
Douglax 2006-12-04
  • 打赏
  • 举报
回复
学习中
「已注销」 2006-12-04
  • 打赏
  • 举报
回复
我也推荐CXIMAGE
iohui 2006-11-29
  • 打赏
  • 举报
回复
友情接分
jelllove 2006-11-28
  • 打赏
  • 举报
回复
到www.codeproject.com下载一个Ximage吧,很方便,很好用,而且免费
peter123570 2006-11-28
  • 打赏
  • 举报
回复
可以用GDI+,可以不用.net.
vc 6.0完全可以调用,而且非常方便。
随风bj 2006-11-28
  • 打赏
  • 举报
回复
可以用INTEL的IJL15.DLL库来压缩,速度快占用资源少。
在压缩时可以设置压缩到内存或者压缩到文件,用IJL_JBUFF_WRITEWHOLEIMAGE就可以实现你的要求。
Douglax 2006-11-28
  • 打赏
  • 举报
回复
最近我也有同样的问题得不到解决
shawnwan 2006-11-28
  • 打赏
  • 举报
回复
难搞,顶下先
LiChenYue 2006-11-27
  • 打赏
  • 举报
回复
学习一下,蹭点分!
h13bk 2006-11-27
  • 打赏
  • 举报
回复
顺便请教一下,RGBtoJPEGFile的Buff参数不知道该怎么设置,我是用CDC取得图像,然后用GetDIBits取得像素buffer,然后把这个buffer传给RGBtoJPEGFile,结果保存的jpg都花了,怎么回事呢?
hiox_ppl 2006-11-21
  • 打赏
  • 举报
回复
忘了说了,帧的大小是320*240像素
加载更多回复(5)

19,468

社区成员

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

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