读书人

在内存中将BMP图片转换成JPG图片,该如

发布时间: 2012-01-09 21:05:42 作者: rapoo

在内存中将BMP图片转换成JPG图片
Image img((L "G:\\yuan32.bmp ");//这里的图片可以是其它格式
CLSID pngClsid;
GetEncoderClsid(L "image/jpeg ", &pngClsid);//这里的图片可以是其它格式,此处转化为BMP格式
img.Save(L "G:\\321123.jpg ", &pngClsid, NULL);
我利用GDI+现在可以将硬盘上的BMP图片文件转换成JPG文件了。但我现在在内存中有一段m_lpBmpData用来存储BMP数据,现在我想直接利用m_lpBmpData将在内存中直接转换为JPG文件(想把JPG数据也放在一段内存中),这个如何实现呢,HELP

[解决办法]
Image img(IStream *pBmp);
[解决办法]
HWND hDeskWnd = ::GetDesktopWindow();//获得屏幕的HWND.
HDC hScreenDC = ::GetDC(hDeskWnd); //获得屏幕的HDC.
HDC MemDC = ::CreateCompatibleDC(hScreenDC);
RECT rect;

::GetWindowRect(hDeskWnd,&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);

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

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

{
GlobalFree(hMemBmp);
MessageBox( "为空 ");
return NULL;
}
m_DeskImage.Save(pStmImage,Gdiplus::ImageFormatJPEG);

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

//CFile mfile( "234.jpg ",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
GlobalUnlock(hMemBmp);
//mfile.Write(pbyBmp,GlobalSize(hMemBmp));
//mfile.Close();
int msize=GlobalSize(hMemBmp);
int seek=0;
int sndcount=0;
m_gpackage.ncount=msize;
while (1)
{
memcpy(m_gpackage.m_buf,pbyBmp+seek,3072);
sndcount=m_clientsock.Send(&m_gpackage,sizeof(package));
seek+=3072;
//TRACE( "%d,seek:%d,size:%d\n ",sndcount,seek,msize);
if(msize-seek <=3072)
{
memcpy(m_gpackage.m_buf,pbyBmp+seek,msize-seek);
sndcount=m_clientsock.Send(&m_gpackage,sizeof(package));
break;
}

}

pStmImage-> Release();
GlobalFree(hMemBmp);
if(m_DeskImage)
{
m_DeskImage.Detach();
::DeleteObject(hBitmapc);
m_DeskImage.Destroy();

}
::DeleteObject(hBitmap);

//::ReleaseDC(hDeskWnd,MemDC)
::DeleteObject(MemDC);
::DeleteDC(MemDC);


::ReleaseDC(hDeskWnd,hScreenDC);
::DeleteDC(hScreenDC);
[解决办法]
MARK

读书人网 >VC/MFC

热点推荐