在view类中添加以下三个函数:
BOOL CTestestView::WriteWindowToDIB(LPTSTR szFile, CWnd *pWnd)
{
CBitmap bitmap;
CWindowDC dc(pWnd);
CDC memDC;
CRect rect;
memDC.CreateCompatibleDC(&dc);
pWnd->GetWindowRect(rect);
bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
CBitmap* pOldBitmap=memDC.SelectObject(&bitmap);
memDC.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
CPalette pal;
if(dc.GetDeviceCaps(RASTERCAPS)&RC_PALETTE)
{
UINT nSize=sizeof(LOGPALETTE)+(sizeof(PALETTEENTRY)*256);
LOGPALETTE* pLP=(LOGPALETTE*)new BYTE[nSize];
pLP->palVersion=0x300;
pLP->palNumEntries=GetSystemPaletteEntries(dc,0,255,pLP->palPalEntry);
pal.CreatePalette(pLP);
delete[] pLP;
}
memDC.SelectObject(pOldBitmap);
HANDLE hDIB=DDBToDIB(bitmap,BI_RGB,&pal);
if(hDIB==NULL)
return FALSE;
WriteDIB(szFile,hDIB);
GlobalFree(hDIB);
return TRUE;
}
HANDLE CTestestView::DDBToDIB(CBitmap &bitmap, DWORD dwCompression, CPalette *pPal)
{
BITMAP bm;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
DWORD dwLen;
HANDLE hDIB;
HANDLE handle;
HDC hDC;
HPALETTE hPal;
ASSERT(bitmap.GetSafeHandle());
if(dwCompression==BI_BITFIELDS)
return NULL;
hPal=(HPALETTE)pPal->GetSafeHandle();
if(hPal==NULL)
hPal=(HPALETTE)GetStockObject(DEFAULT_PALETTE);
bitmap.GetObject(sizeof(bm),(LPSTR)&bm);
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=bm.bmWidth;
bi.biHeight=bm.bmHeight;
bi.biPlanes=1;
bi.biBitCount=bm.bmPlanes*bm.bmBitsPixel;
bi.biCompression=dwCompression;
bi.biSizeImage=0;
bi.biXPelsPerMeter=0;
bi.biYPelsPerMeter=0;
bi.biClrImportant=0;
bi.biClrUsed=0;
int nColors=(1<<bi.biBitCount);
if(nColors>256)
nColors=0;
dwLen=bi.biSize+nColors*sizeof(RGBQUAD);
hDC=::GetDC(NULL);
hPal=SelectPalette(hDC,hPal,FALSE);
RealizePalette(hDC);
hDIB=GlobalAlloc(GMEM_FIXED,dwLen);
if(!hDIB)
{
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
lpbi=(LPBITMAPINFOHEADER)hDIB;
*lpbi=bi;
GetDIBits(hDC,(HBITMAP)bitmap.GetSafeHandle(),0L,(DWORD)bi.biHeight,(LPBYTE)NULL,(LPBITMAPINFO)lpbi,(DWORD)DIB_RGB_COLORS);
bi=*lpbi;
if(bi.biSizeImage==0)
{
bi.biSizeImage=((((bi.biWidth*bi.biBitCount)+31)& ~31)/8)*bi.biHeight;
if(dwCompression!=BI_RGB)
bi.biSizeImage=(bi.biSizeImage*3)/2;
}
dwLen+=bi.biSizeImage;
if(handle=GlobalReAlloc(hDIB,dwLen,GMEM_MOVEABLE))
hDIB=handle;
else
{
GlobalFree(hDIB);
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
lpbi=(LPBITMAPINFOHEADER)hDIB;
BOOL bGotBits=GetDIBits(hDC,(HBITMAP)bitmap.GetSafeHandle(),0L,(DWORD)bi.biHeight,(LPBYTE)lpbi+(bi.biSize+nColors*sizeof(RGBQUAD)),
(LPBITMAPINFO)lpbi,(DWORD)DIB_RGB_COLORS);
if(!bGotBits)
{
GlobalFree(hDIB);
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return NULL;
}
SelectPalette(hDC,hPal,FALSE);
::ReleaseDC(NULL,hDC);
return hDIB;
}
BOOL CTestestView::WriteDIB(LPTSTR szFile, HANDLE hDIB)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
if(!hDIB)
return FALSE;
CFile file;
if(!file.Open(szFile,CFile::modeWrite|CFile::modeCreate))
return FALSE;
lpbi=(LPBITMAPINFOHEADER)hDIB;
int nColors=1<<lpbi->biBitCount;
hdr.bfType=((WORD)('M'<<8)|'B');
hdr.bfSize=::GlobalSize(hDIB)+sizeof(hdr);
hdr.bfReserved1=0;
hdr.bfReserved2=0;
hdr.bfOffBits=(DWORD)(sizeof(hdr)+lpbi->biSize+nColors*sizeof(RGBQUAD));
file.Write(&hdr,sizeof(hdr));
file.Write(lpbi,GlobalSize(hDIB));
return TRUE;
}
在保存时调用函数WriteWindowToDIB()
void CTestestView::OnFileSave()
{
// TODO: Add your command handler code here
WriteWindowToDIB("D://My.bmp",this);
}
本人测试过,确实直接加上就可以了,但是注意类名要改为和你的一致的
转载声明: 本文转自http://wmnmtm.blog.163.com/blog/static/38245714200963032449/
==================================================================
VC实现自绘图形输出到bmp文件
在用vc做程序时候,经常需要把输出的文本和图形保存到位图文件,当然可以有现成的控件来实现,但总不能如自己所愿,还是自己动手写吧!如下图:
一、实现方法
要把文本和图形保存到位图文件,只要对掌握位图结构有一定的了解,一切都ok呢。先必须要创建内存设备环境,然后内存设备环境创建的DIB区域,别忘了还要创建个CBitmap对象,CBitmap对象必须和DIB区域关联起来,把CBitmap对象选择到当前设备环境,然后在当前设备环境输出文本和图形就可以了。
二、具体实现代码如下
void CTestSaveBmpView::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 800;
int iHeight = 600;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;
//创建位图数据
HDC hdc,hdcMem;
HBITMAP hBitMap = NULL;
CBitmap *pBitMap = NULL;
CDC *pMemDC = NULL;
BYTE *pBits;
hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
pBitMap = new CBitmap;
pBitMap->Attach(hBitMap);
pMemDC = new CDC;
pMemDC->Attach(hdcMem);
pMemDC->SelectObject(pBitMap);
//
CRect rc(0,0,iWidth,iHeight);
pMemDC->SetBkMode(TRANSPARENT);
//添加自绘图形
DrawCurve(pMemDC,rc);
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
*((char *)&bmfh.bfType) = ''B'';
*(((char *)&bmfh.bfType) + 1) = ''M'';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8;
strcpy(szBMPFileName,filename);
CFile file;
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,iBMPBytes);
file.Close();
}
pMemDC->DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL;
}
//输出文本和图形
void CTestSaveBmpView::DrawCurve(CDC *pDC, CRect rcClient)
{
//页面背景色
CBrush brushCtl;
brushCtl.CreateSolidBrush(RGB(255,255,255));
pDC->Rectangle(rcClient);
pDC->FillRect(rcClient,&brushCtl) ;
brushCtl.DeleteObject();
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(255,0,0));
CPen *oldPen = pDC->SelectObject(&pen);
double xMin = 10.00f, xMax = 100.00f;
double yMin = 10.00f, yMax = 200.00f;
double dbX1 = (xMax- xMin)/100 + xMin;
double dbY1 = 600/dbX1 ;
for (int i=1; i<100; i++) //曲线
{
double dbX2 = (xMax- xMin)*i/100 + xMin;
double dbY2 = 600/dbX2 ;
pDC->MoveTo(int(rcClient.left+(dbX1 - xMin)*rcClient.Width()/(xMax- xMin)),
int(rcClient.bottom-(dbY1- yMin)*rcClient.Height()/(yMax- yMin)));
pDC->LineTo(int(rcClient.left+(dbX2 - xMin)*rcClient.Width()/(xMax- xMin)),
int(rcClient.bottom-(dbY2- yMin)*rcClient.Height()/(yMax- yMin)));
dbX1=dbX2;
dbY1=dbY2;
}
pDC->SelectObject(oldPen);
pen.DeleteObject();
oldPen = NULL;
}
//保存的实现
void CTestSaveBmpView::OnRButtonDown(UINT nFlags, CPoint point)
{
CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"位图文件(*.bmp)|*.bmp|",
NULL);
if (dlg.DoModal()!= IDOK) return;
CString filename = dlg.GetFileName() + ".bmp";
SaveAsBmp(filename);
CView::OnRButtonDown(nFlags, point);
}
转载声明: 本文转自http://wmnmtm.blog.163.com/blog/static/38245714200963005616282/
==================================================================
相关推荐
在VC++环境中,将窗口客户区的内容保存为BMP文件是一项常见的需求,特别是在进行图形编程或者屏幕截图时。本文将详细介绍这一过程,并提供相应的源代码分析。 首先,我们需要理解BMP文件格式。BMP(Bitmap)是...
在计算机图形处理领域,图像文件格式的转换...总的来说,从VC++实现BMP到JPG的转换涉及图像处理、颜色空间转换、文件I/O和压缩算法等多个知识点。理解和掌握这些内容对于提升你在图像处理领域的编程技能是非常有益的。
在这个场景下,"vc中将客户区图像保存为bmp位图文件"是一个常见的需求,这通常涉及到对Windows图形设备接口(GDI)的深入理解以及对特定API函数的熟练应用。以下是一些关键知识点: 1. **Windows设备上下文(Device...
2. **设置VC++6.0的路径**:将`Includes`和`Lib`中的文件分别复制到VC6的安装目录下的`VC98\include`和`lib`文件夹中。 3. **创建MFC项目**:新建一个MFC单文档应用程序,例如命名为`show`。 4. **配置项目**: -...
通过这种方式,我们可以将图像格式转换功能封装到一个独立的DLL中,使得VC++项目可以轻松地实现BMP到JPG和JPG到BMP的转换。这有助于代码的可维护性和复用性,特别是在大型项目中,这样的设计原则尤为重要。
在VC++编程环境中,实现BMP位图图形和菜单是一项常见的任务,这涉及到Windows API的图形设备接口(GDI)和菜单系统。本教程将深入探讨如何在VC++中使用这些技术来创建具有美观BMP位图背景的自定义菜单。 首先,我们...
在VC++6.0开发环境中,读取和处理BMP(Bitmap)文件是常见的图形处理任务,这主要涉及到Windows API中的图像处理函数。BMP是一种未经压缩的位图格式,通常用于存储各种图像数据。本篇文章将深入探讨如何在VC++6.0中...
在本文中,我们将深入探讨如何使用VC++来读取和显示BMP位图文件,这是计算机图形处理领域的一个基础任务。BMP(Bitmap)是一种常见的位图图像格式,广泛应用于Windows操作系统和其他软件中。理解如何操作BMP文件是...
这个项目涉及到了位图的处理,特别是如何通过代码来剪切BMP位图并将其保存为新的文件。以下是对这个主题的详细阐述: 1. **BMP文件格式**:BMP文件是一种未经压缩的位图格式,它包含了图像的颜色信息和像素数据。每...
在VC++编程环境中,将对话框的客户区保存为BMP图片是一项常见的需求,这通常涉及到Windows图形设备接口(GDI)的使用。本篇将详细介绍如何实现这一功能,以及涉及的关键技术点。 首先,我们需要了解BMP文件格式。...
在VC++ 6.0环境下,开发一个BMP图像读取和灰度化的程序涉及到对位图文件格式的理解以及图像处理的基本算法。首先,我们来深入理解BMP图像格式。 BMP(Bitmap)是Windows操作系统中的一种位图图形文件格式,它存储的...
在VC++环境中,读取和显示BMP(Bitmap)文件是一项常见的图像处理任务。BMP是一种未经压缩的图像文件格式,通常用于存储位图图像。本文将深入探讨如何使用VC++来实现这一功能,主要涉及的知识点包括: 1. BMP文件...
在本文中,我们将深入探讨如何使用VC++ 6.0打开和显示位图(BMP)文件。位图文件是一种常见的图像格式,广泛应用于各种图形处理应用中。VC++ 6.0是一款经典的Microsoft Visual Studio集成开发环境,它提供了丰富的...
首先,当我们在VC++中加载和绘制BMP图像时,如果没有进行透明处理,图像的背景将会覆盖在其之上的其他图像,导致视觉效果不佳。以下是一个简单的例子,X轴和Y轴的BMP图片重叠时,由于X轴图片的背景未设为透明,所以...
在VC++编程环境中,实现BMP图像透明窗体是一项常见的任务,这主要涉及到Windows API的图形设备接口(GDI)和窗口消息处理。本示例通过利用BMP图像的特性来创建一个看似透明的窗体,实际上是一种伪透明效果。下面我们...
在VC++编程环境中,实现多文档预览DWG(AutoCAD图形数据格式)文件并将其保存为BMP(位图)文件是一项具有挑战性的任务,涉及到图形界面设计、文件读取与解析、图像处理等多个技术领域。下面我们将深入探讨这个过程...
### VC++实现BMP位图打开和显示:深入解析与实践 #### 一、课程背景与目标 在《数字图像处理》课程中,通过实践项目加深对C++编程语言的理解和应用,尤其聚焦于图像处理领域。本次实验旨在让学生掌握如何使用C++...
在VC++环境中,打开并显示BMP图片是一个基础的图形用户界面编程任务,通常涉及到Windows API函数和MFC(Microsoft Foundation Classes)库的使用。BMP是微软操作系统中的一种位图图像格式,它包含了图像的颜色数据和...