`
coding1688
  • 浏览: 236854 次
  • 来自: 上海
社区版块
存档分类
最新评论

VC/MFC怎样将位图CBitmap对象保存成为bmp格式文件?(你在网上找的不一定灵,看我的一定灵)

阅读更多

VC/MFC怎样将位图CBitmap对象保存成为bmp格式文件?

 

虽然说现在写程序主要依靠 Internet ,特别是 Google 搜索(不过有时候 被墙,只能凑合着用百度)。编程技术人员的普遍经验都是:Google 在搜索技术资料的时候确实比 百度 要强。

 

废话少说,今晚找了些资料,终于搞定了 将CBitmap表示的位图对象保存成为正宗的 bmp 格式文件。不过其中有些小的曲折,总结一下,网上大体提供了以下几种方式:

 

1. 用 CImage 来解决,就几行,但需要 .net 支持;

				// http://blog.csdn.net/benpluslib/article/details/3975774
				// 使用下面的代码,可以把CBitmap类中的图像保存到图像文件中。支持格式:BMP、JPG、GIF和PNG。 
				// 但CImage只在.net下有
				// CImage imgTemp;      // CImage是MFC中的类。
				// imgTemp.Attach(Bitmap.operator HBITMAP());
				// imgTemp.Save(strFilePath);
 

2. 很多网站提供的 void WriteBmp(CBitmap   *PBitmap, char m_FileName[])  原代码,要放在 某个 Windows 类中作为成员函数才行。但很不幸,不怎么灵。

// http://blog.csdn.net/xs813/article/details/6321924
// 保存CBitmap到文件 
// 经过测试,这个方法是不灵的:
// 有时候能正确保存,
// 有时候保存之后打开报“绘图失败”,
// 有时候程序执行非法操作
void CTestClipboardDlg::WriteBmp(CBitmap   *PBitmap, char m_FileName[])   
// 代码省略,网上有(既然不灵,也就没必要贴出来了)

// 调用方式
				//WriteBmp(cbm, "clipboard1.bmp");	// 这个方法不行
 

3. 也还有 bool SaveBitmapToFile(CBitmap* bitmap, LPSTR lpFileName) 此方法甚好,就用它了。下面贴出完整的经本人辛苦格式化的代码,再此向作者致敬(虽然原作者已无从考证)。

// http://blog.sina.com.cn/s/blog_6ee382440100moeu.html
// http://apps.hi.baidu.com/share/detail/32878068
// bitmap 位图CBitmap对象指针
// lpFileName 为位图文件名  
bool SaveBitmapToFile(CBitmap* bitmap, LPSTR lpFileName)
{            
	HBITMAP hBitmap;	// 为刚才的屏幕位图句柄
	HDC hDC; //设备描述表  
	int iBits; //当前显示分辨率下每个像素所占字节数  
	WORD wBitCount; //位图中每个像素所占字节数	
	DWORD dwPaletteSize = 0, //定义调色板大小
		dwBmBitsSize,  //位图中像素字节大小   
		dwDIBSize,	 //位图文件大小
		dwWritten;  //写入文件字节数
	BITMAP Bitmap; //位图属性结构  
	BITMAPFILEHEADER bmfHdr; //位图文件头结构  
	BITMAPINFOHEADER bi; //位图信息头结构    
	LPBITMAPINFOHEADER lpbi; //指向位图信息头结构  
	HANDLE fh,	 //定义文件
		hDib,	 //分配内存句柄
		hPal,	//调色板句柄
		hOldPal = NULL;
	
	//计算位图文件每个像素所占字节数  
	hBitmap = (HBITMAP)*bitmap;  
	hDC = CreateDC("DISPLAY",NULL,NULL,NULL);  
	iBits =	GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);  
	DeleteDC(hDC);
	
	if (iBits <= 1)  
		wBitCount =	1;	
	else if	(iBits <= 4)  
		wBitCount =	4;	
	else if (iBits <= 8)  
		wBitCount =	8;	
	else if	(iBits <= 24)  
		wBitCount =	24;  
	else if (iBits <= 32)
		wBitCount = 32;
	
	//计算调色板大小  
	if (wBitCount <= 8)  
		dwPaletteSize =	(1 << wBitCount) * sizeof (RGBQUAD);
	
	//设置位图信息头结构  
	GetObject(hBitmap, sizeof (BITMAP), (LPSTR)&Bitmap);
	bi.biSize = sizeof (BITMAPINFOHEADER);  
	bi.biWidth = Bitmap.bmWidth;  
	bi.biHeight = Bitmap.bmHeight;  
	bi.biPlanes = 1;	
	bi.biBitCount =	wBitCount;	
	bi.biCompression = BI_RGB;  
	bi.biSizeImage = 0;  
	bi.biXPelsPerMeter = 0;  
	bi.biYPelsPerMeter = 0;  
	bi.biClrUsed = 0;  
	bi.biClrImportant = 0;  
	
	dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31) / 32) * 4 * Bitmap.bmHeight;  
	
	//为位图内容分配内存  
	hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof (BITMAPINFOHEADER));  
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);  
	*lpbi =	bi;
	
	// 处理调色板 	   
	hPal = GetStockObject(DEFAULT_PALETTE);  
	if (hPal)  
	{  
		hDC = ::GetDC(NULL);	
		hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);	
		RealizePalette(hDC);
	}  
	
	//	 获取该调色板下新的像素值  
	GetDIBits(hDC, hBitmap,	0, (UINT) Bitmap.bmHeight,	
		(LPSTR)lpbi + sizeof (BITMAPINFOHEADER)	+ dwPaletteSize,
		(LPBITMAPINFO)lpbi,	DIB_RGB_COLORS);  
	
	//恢复调色板		
	if (hOldPal)	
	{  
		SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);  
		RealizePalette(hDC);  
		::ReleaseDC(NULL, hDC);
	}  
	
	//创建位图文件			
	fh = CreateFile(lpFileName, GENERIC_WRITE,
		0, NULL, CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL |	FILE_FLAG_SEQUENTIAL_SCAN, NULL);  
	
	if (fh == INVALID_HANDLE_VALUE)
		return FALSE;  
	
	//	 设置位图文件头  
	bmfHdr.bfType =	0x4D42; 	//	 "BM"  
	dwDIBSize = sizeof (BITMAPFILEHEADER)	  
		+ sizeof (BITMAPINFOHEADER)  
		+ dwPaletteSize	+ dwBmBitsSize;	   
	bmfHdr.bfSize =	dwDIBSize;	
	bmfHdr.bfReserved1 = 0;  
	bmfHdr.bfReserved2 = 0;  
	bmfHdr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER)	  
		+ (DWORD)sizeof (BITMAPINFOHEADER)  
		+ dwPaletteSize;	
	
	//	 写入位图文件头  
	WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten,	NULL);	
	
	//	 写入位图文件其余内容  
	WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
		&dwWritten, NULL);
	
	//清除		  
	GlobalUnlock(hDib);  
	GlobalFree(hDib);  
	CloseHandle(fh);  

	return TRUE;	
}  

 

使用的方式也相当的简单。

				SaveBitmapToFile(cbm, "clipboard.bmp");
 

4. 其他第三方库:比如 CxImage ,现在还没有来得及研究。

 

下一步准备将 CBitmap 保存为 jpg 格式,或将已保存的 bmp 格式文件 转为 jpg 格式文件。

 

 

 

4
1
分享到:
评论

相关推荐

    窗口DC保存至BMP,JPG

    - 对于BMP格式,GDI+的Bitmap类提供了Save方法,可以直接将位图保存为BMP文件。BMP是无损的,但文件通常较大。 - 对于JPG格式,由于GDI+也支持JPEG编码,同样可以通过Bitmap的Save方法,指定ImageFormatJPEG作为...

    数字图像处理 MFC bmp格式图片打开与保存,VC6.0

    在本文中,我们将深入探讨如何使用Microsoft Foundation Classes (MFC) 在VC6.0环境下进行数字图像处理,特别是关于BMP格式图片的打开与保存。MFC是Microsoft为Windows应用程序开发提供的一组C++类库,它简化了...

    C++将CBitmap类中的图像保存到文件的方法

    在这个问题中,我们专注于如何利用MFC中的CBitmap类以及CImage类将图像数据保存到文件。以下是关于这一主题的详细解释。 首先,`CBitmap`是MFC提供的一个类,它封装了Windows API中的`BITMAP`结构,用于处理位图...

    VC屏幕截图, 并保存为bmp格式的图片

    本文将深入探讨如何使用Visual C++(VC)结合Windows API来实现屏幕截图,并将其保存为BMP格式的图片。 首先,我们要了解Windows API中的基本概念。API(Application Programming Interface)是一组预定义的函数、...

    用vc打开BMP格式

    总结来说,实现“用vc打开BMP格式”的程序,你需要掌握以下几个关键知识点: 1. BMP文件格式的结构,包括BITMAPFILEHEADER和BITMAPINFOHEADER。 2. 使用fstream库读取二进制文件。 3. 理解色彩深度和像素数据的解析...

    vc MFC bmp 图像处理

    在VC++环境中,MFC(Microsoft Foundation Classes)库为开发者提供了强大的图形用户界面(GUI)开发支持,同时也包含了处理图像,如BMP位图的功能。本文将深入探讨如何利用MFC进行BMP图像处理,主要关注灰度变换、...

    VC6.0实现浏览bmp文件

    本篇文章将详细探讨如何使用VC6.0来实现一个简单的浏览并显示.bmp文件的功能。 首先,我们要了解.bmp文件。BMP是Bitmap的缩写,是一种常见的位图图像格式,广泛用于Windows操作系统。它以未经压缩的形式存储图像...

    VC下8、16、24、32位位图的数据解析与显示

    在Windows环境下,尤其是在Visual C++ (VC++) 开发中,处理和显示位图(BMP)文件是一项常见的任务。BMP是一种无损的图形文件格式,广泛用于存储图像数据。本篇文章将深入探讨如何在VC++ 6.0 MFC(Microsoft ...

    VC中将客户区保存为BMP图片

    5. **保存位图为BMP文件**:有了位图数据后,我们可以调用`CImage`类的成员函数`Save`来将内存中的位图保存为BMP文件。`CImage`是MFC库中用于处理图像的类,它提供了方便的图像操作接口。`Save`函数接受文件路径和...

    用MFC画图 打印 保存

    在MFC中,保存图形通常涉及到将图形数据保存到文件,如BMP、JPEG或PNG等图像格式。可以使用CFile类来处理文件I/O,然后使用位图对象(CBitmap)和内存设备上下文(CMemDC)来实现。以下是一个简单的例子,将窗口内容...

    24位bmp位图转灰度图(MFC实现)

    在图像处理领域,将24位彩色BMP位图转换为灰度图是一个常见的操作。24位BMP位图通常包含红、绿、蓝三种颜色通道,每种颜色通道有8位,总共24位表示一个像素的颜色信息。灰度图则是通过将彩色图像中的每个像素转换为...

    VC_bitmap.rar_Bitmap save _vc Bitmap_保存位图

    在提供的"VC保存位图.doc"文档中,应该详细阐述了以上步骤,并可能包含示例代码,帮助开发者理解如何在具体项目中实现位图的保存功能。通过学习这个文档,你可以掌握在VC++环境下处理和保存位图的关键技术,从而提升...

    vc6,分割视图显示位图

    位图通常以.BMP格式存储,可以作为资源嵌入到程序中,也可以在运行时从文件加载。你可以使用CBitmap类来处理位图对象,并使用CDC类(设备上下文类)的方法来绘制位图。CBitmap::LoadBitmap函数用于从资源加载位图,...

    一个在VC下显示位图的源程序

    本文将详细讲解如何使用CBitmap类在VC6.0下显示位图,并结合提供的文件名称"Bmp"来讨论位图文件的基本知识。 CBitmap类是MFC(Microsoft Foundation Classes)库中的一个关键组件,它提供了处理Windows GDI...

    VC读位图的MFC实现

    本教程将详细讲解如何利用MFC实现读取BMP位图并在单文档应用的客户区进行绘制。 首先,我们需要了解BMP文件格式。BMP是一种未经压缩的图像文件格式,它包含图像的颜色数据以及有关图像大小、分辨率等元信息。MFC...

    VC通过路径加载位图源码例子

    在加载和处理位图时,应检查可能出现的错误,如文件不存在、无效的位图格式等。可以使用`GetLastError`获取系统错误代码,并使用`FormatMessage`将错误代码转化为可读的错误信息。 8. **内存管理**: 记住释放...

    vc6 动态位图的加载

    在VC6环境下,动态加载位图是一项常见的任务,特别是在开发Windows应用程序时,我们可能需要根据用户的操作或程序的运行状态动态地改变界面中的图像。本文将深入探讨如何在VC6中实现这一功能,主要涉及Win32 API和...

    VC打开多种图像格式(bmp,jpg,gif,tif,raw)

    1. **BMP格式**:MFC中的CImage类可以直接支持BMP图像的加载和显示。只需包含`#include &lt;atlimage.h&gt;`,然后使用CImage对象的Load()函数加载BMP文件,再将其绑定到CStatic控件或CDC上显示。 2. **JPG和GIF格式**:...

    bmp图像文件的显示

    在计算机图形学领域,BMP(Bitmap)是一种常见的位图图像格式,用于存储像素数据。在Windows操作系统中,BMP文件被广泛支持,且通常不包含任何压缩,因此可以直接读取和显示。本主题将深入探讨如何使用C++在...

Global site tag (gtag.js) - Google Analytics