程序是用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),也就是后面转换的会把前面所有转换过的累加进去,这是什么原因?怎样解决?有没有什么其它的转换方法?(最好有原码)
内存中的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),也就是后面转换的会把前面所有转换过的累加进去,这是什么原因?怎样解决?有没有什么其它的转换方法?(最好有原码)
解决方案 »
- 菜鸟求教2
- 在class之后加一个__declspec关键字,对于这个类来说,是一个编译时特性还是运行时特性?
- 非常着急,请教各位
- 读取控制台上的都东西
- 继承一下CButton类都出问题,郁闷
- 求vox编码模块
- 视图放大再放大再放大……,缩放因子应该怎么计算?
- 想做有关联通的短信平台,哪里老兄有资料,可购买
- 一个Dialog程序,我在WM_EARSEBKGND,画了一个背景位图,在这个基础上,我在OnPaint()中用TextOut.....
- VC编译时出现的小问题。。。大侠进来帮忙!
- 新手问题:我创建了一个对话框程序,如何在对话框中加入statusbar呢?
- VMR9的alphablending问题
不知道你有没有解决这个问题
用CxImage好像好慢
http://blog.csdn.net/dd167/archive/2006/02/16/600301.aspx
正如里面所说的
/*
这是一个简单的jpeg编码程序,支持1:1:1采样的baseline彩色jpeg,输入只能是24bit的BMP文件
代码结构只求能说明各步骤过程,并不做特别的优化,效率较为一般。
*/
我还发现了一些问题,就是压缩连续图像的时候,原图像没变化,压缩出来的图像却有时亮有时暗,有的时候左边会有一些跑到了右边,就是压缩很不稳定。
测试了一下时间,一帧差不多47ms,不知道速度和其它的一些方法比怎样?
在压缩时可以设置压缩到内存或者压缩到文件,用IJL_JBUFF_WRITEWHOLEIMAGE就可以实现你的要求。
vc 6.0完全可以调用,而且非常方便。
[email protected]
http://blog.csdn.net/lixiaosan/archive/2006/04/28/694790.aspx
呵呵 抄来的
内存中转换绝对可行
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);}
我得到的是24位的纯数据,你的方法应该要在数据前加上bmp头,形成完整的位图文件再转化吧