请问下MFC中如果我有一个CBitmap文件,如果不把它保存成文件,怎么用CFile对它进行读写,或者其他方法也行

请问下MFC中如果我有一个CBitmap文件,如果不把它保存成文件,怎么用CFile对它进行读写,或者其他方法也行,第1张

你好。CBitmap类没有压缩功能。我实现过先在内存中压缩成JPG格式,然后通过UDP发送的功能。

但是需要使用GDI+

其中 CPicture是一个网上流行的图片类。你可以自己找一下

(我的CBitmap对象定义在文档类中的)

头文件中的定义:

private:

CImagem_Image //频道1 CImage对象,岁雹用户在内存中进行图片压缩

CPicture m_Picture //用于加载图片和显示图片

CDC* m_pDC1 //频道1物理DC的指针

CDCm_MemDC1 //频道1内存DC

CServerDoc* m_pDoc//文档类指针

HBITMAP m_hBitmap //位图句柄

CStringm_ImagePath//图片路径

BYTE m_Buffer[65536]//频道1缓冲区

SIZE_Tm_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

}

}

"自己定义一手森漏个类",是不是在一个新的cpp文件中,这个文件没有包含必要的头文件。

参照其它类cpp文件头文件包含,加上两个:

#include "stdafx.h"

#include "YourApp.h" //你程序APP类头文件,后面一行再加上你自定春歼义类头文毕烂件。

如果位图已经通过LoadBitmap加载到内存,则内存中的图像与显示码配设备紧密相关,比如原图是彩色图片,显示器是黑白色,通过bmp.LoadBitmap(我的图片)后,内存中的图像数据是黑白色的数据,而且还与显示器位数有关耐掘。如果需要在原位图数据上进行图像处理,就不要bmp.LoadBitmap来加载位图,而是打开文件获取位图数据。如果仅仅是在当前显示设备下进行效果处理,则可以使用bmp.LoadBitmap加载位图,通过CBitmap的GetBitmapBit函数可以获取位图数据,如果是24位显示器,则每3个字节表示一个像素,其中第一个字节是B,第二个字节是G,第3个字节是R如果是32位的显示器,每4个字节表示一个像素,一般前3个字节与24位显示器一样,第4个字节一般没有什么意义。

Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)昌模核是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互 *** 作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。

它以拥有“语法高亮”,IntelliSense(自动完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8206078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存