展开全部
使用GDI+实现的在内存轮岩行中进行图片格式转换。
这是我自己写的代码,绝对是可以使用的。
其中 CPicture是一个网上流行的图片类。你可以自己找一下
头文件中的定义:
private:
CImage m_Image; //频道1 CImage对象,用户在内存中进行图片压缩
CPicture m_Picture; //用于加载图片和显示图片
CDC* m_pDC1; //频道1物理DC的指针
CDC m_MemDC1; //频道1内存DC
CServerDoc* m_pDoc; //文档类指针
HBITMAP m_hBitmap; //位图句柄
CString m_ImagePath; //图片路径
BYTE m_Buffer[65536]; //频道1缓冲区
SIZE_T m_BufferSize;
该函数实现:
1:创建内存设备句柄,并与物理DC关联
2:读取磁盘上的图片文件到内存中,并画在内存DC中
3:把内存DC中的图片显示到物理DC中
4:把内存中的图片转换为JPG格式并存储到一块连续的内存区域
5:把4中连续的枣野内存区域拷贝到频道1发送缓冲区中
*/
void CCh1View::Ch1Draw(void)
{
if(m_ServerStart==TRUE)
{
CDocument* pDoc = GetDocument();
m_pDC1=GetDC(); //获得频道1物理DC指针
m_MemDC1.CreateCompatibleDC(NULL); //创建内存DC
m_pDoc = (CServerDoc*)GetDocument();
m_pDoc->m_Bmp1.DeleteObject();
m_pDoc->m_Bmp1.CreateCompatibleBitmap(m_pDC1,320,240); //创建与频道1物理DC关联的位图
HBITMAP hBitmap=HBITMAP(m_pDoc->m_Bmp1);//获得位图的句柄
HGDIOBJ hOldBMP = ::SelectObject(m_MemDC1,hBitmap); //把该位图选入内存DC
//加载选中图片到内存
if(m_ImagePath==_T("default"))
m_Picture.Load(IDR_DEFAULT,_T("JPG"));
else
m_Picture.Load(m_ImagePath);
m_Picture.UpdateSizeOnDC(&m_MemDC1);
m_Picture.Show(&m_MemDC1, CPoint(0,0), CPoint(320,240), 0,0);//腊哗把图片画在内存DC中
m_pDC1->BitBlt(0,0,320,240,&m_MemDC1,0,0,SRCCOPY); //把内存DC中的图片拷贝到物理DC中显示出来
m_Picture.FreePictureData();//释放资源
hBitmap=(HBITMAP)::SelectObject(m_MemDC1,hOldBMP); //获得内存中上述位图的句柄
m_Image.Attach(hBitmap); //CImage对象与上述位图关联
IStream* pStmImage = NULL; //初始化流对象
HGLOBAL hMemBmp = GlobalAlloc(GMEM_MOVEABLE,0);//申请可移动的缓冲区
if (hMemBmp == NULL) return;
CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmImage);//将可移动缓冲区作为流的起始
if (pStmImage == NULL)
{
GlobalFree(hMemBmp);
return ;
}
m_Image.Save(pStmImage,Gdiplus::ImageFormatJPEG); //把位图转换为JPG格式并保存在流对象缓冲区中
BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);//得到缓冲区的起始地址
GlobalUnlock(hMemBmp);
m_BufferSize=GlobalSize(hMemBmp); //得到格式转换后图片的大小
memcpy((void*)m_Buffer,(void*)pbyBmp,m_BufferSize);//把内存中的JPG格式图片数据拷贝到频道1发送缓冲区中
pStmImage-> Release(); //释放流对象资源
GlobalFree(hMemBmp); //释放可移动缓冲区资源
if(m_Image)
m_Image.Destroy(); //销毁CImage对象
m_MemDC1.DeleteDC();//删除内存DC
m_pDC1->DeleteDC();//删除物理DC
}
}
这是我自己写的代码,绝对是可以使用的。
其中 CPicture是一个网上流行的图片类。你可以自己找一下
头文件中的定义:
private:
CImage m_Image; //频道1 CImage对象,用户在内存中进行图片压缩
CPicture m_Picture; //用于加载图片和显示图片
CDC* m_pDC1; //频道1物理DC的指针
CDC m_MemDC1; //频道1内存DC
CServerDoc* m_pDoc; //文档类指针
HBITMAP m_hBitmap; //位图句柄
CString m_ImagePath; //图片路径
BYTE m_Buffer[65536]; //频道1缓冲区
SIZE_T m_BufferSize;
该函数实现:
1:创建内存设备句柄,并与物理DC关联
2:读取磁盘上的图片文件到内存中,并画在内存DC中
3:把内存DC中的图片显示到物理DC中
4:把内存中的图片转换为JPG格式并存储到一块连续的内存区域
5:把4中连续的枣野内存区域拷贝到频道1发送缓冲区中
*/
void CCh1View::Ch1Draw(void)
{
if(m_ServerStart==TRUE)
{
CDocument* pDoc = GetDocument();
m_pDC1=GetDC(); //获得频道1物理DC指针
m_MemDC1.CreateCompatibleDC(NULL); //创建内存DC
m_pDoc = (CServerDoc*)GetDocument();
m_pDoc->m_Bmp1.DeleteObject();
m_pDoc->m_Bmp1.CreateCompatibleBitmap(m_pDC1,320,240); //创建与频道1物理DC关联的位图
HBITMAP hBitmap=HBITMAP(m_pDoc->m_Bmp1);//获得位图的句柄
HGDIOBJ hOldBMP = ::SelectObject(m_MemDC1,hBitmap); //把该位图选入内存DC
//加载选中图片到内存
if(m_ImagePath==_T("default"))
m_Picture.Load(IDR_DEFAULT,_T("JPG"));
else
m_Picture.Load(m_ImagePath);
m_Picture.UpdateSizeOnDC(&m_MemDC1);
m_Picture.Show(&m_MemDC1, CPoint(0,0), CPoint(320,240), 0,0);//腊哗把图片画在内存DC中
m_pDC1->BitBlt(0,0,320,240,&m_MemDC1,0,0,SRCCOPY); //把内存DC中的图片拷贝到物理DC中显示出来
m_Picture.FreePictureData();//释放资源
hBitmap=(HBITMAP)::SelectObject(m_MemDC1,hOldBMP); //获得内存中上述位图的句柄
m_Image.Attach(hBitmap); //CImage对象与上述位图关联
IStream* pStmImage = NULL; //初始化流对象
HGLOBAL hMemBmp = GlobalAlloc(GMEM_MOVEABLE,0);//申请可移动的缓冲区
if (hMemBmp == NULL) return;
CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmImage);//将可移动缓冲区作为流的起始
if (pStmImage == NULL)
{
GlobalFree(hMemBmp);
return ;
}
m_Image.Save(pStmImage,Gdiplus::ImageFormatJPEG); //把位图转换为JPG格式并保存在流对象缓冲区中
BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);//得到缓冲区的起始地址
GlobalUnlock(hMemBmp);
m_BufferSize=GlobalSize(hMemBmp); //得到格式转换后图片的大小
memcpy((void*)m_Buffer,(void*)pbyBmp,m_BufferSize);//把内存中的JPG格式图片数据拷贝到频道1发送缓冲区中
pStmImage-> Release(); //释放流对象资源
GlobalFree(hMemBmp); //释放可移动缓冲区资源
if(m_Image)
m_Image.Destroy(); //销毁CImage对象
m_MemDC1.DeleteDC();//删除内存DC
m_pDC1->DeleteDC();//删除物理DC
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询