位图的转换与保存

harryxusu 2009-11-08 08:45:03
我已经将字符串的输出值抓换位位图形式,希望将位图保存起来,
CDC* pDC=GetDC();
LOGFONT logfont;
lstrcpy((LPSTR)logfont.lfFaceName,(LPSTR)"华文行楷");
logfont.lfWeight=0;
logfont.lfWidth=0;
logfont.lfHeight=60;
logfont.lfEscapement=0;
logfont.lfUnderline=FALSE;
logfont.lfItalic=FALSE;
logfont.lfStrikeOut=FALSE;
logfont.lfCharSet=GB2312_CHARSET;
TEXTMETRIC tm;
//pDC->GetTextMetrics(&tm);
CFont font;
font.CreateFontIndirect(&logfont);
CFont *pOldFont=pDC->SelectObject(&font);
//CString mystr;
CPoint mypoint(0,50);
//WCHAR wc[ 0x100 ] = { 0x4E00, 0 };
char ac[ 0x100 ] = "";
//WideCharToMultiByte( CP_ACP, 0, wc, 1, ac, 2, NULL, NULL );
//pDC->TextOut( mypoint.x,mypoint.y,ac,2);
unsigned int i;
//CString mystr=" ";
for(i=0x4E00;i<=0x4E09;i++)
{
WCHAR wc[ 0x100 ] = { i, 0 };
WideCharToMultiByte( CP_ACP, 0, wc, -1, ac, 2, NULL, NULL );
//mystr+=ac
pDC->GetTextMetrics(&tm);
//mypoint.x+=60;
mystr+=ac;
//pDC->TextOut( mypoint.x, mypoint.y, ac);
/*if((i-17)%21==0)
{
mypoint.y+=60;
mypoint.x=0;
}*/

}
pDC->TextOut( mypoint.x, mypoint.y, mystr);
//pDC->SelectObject(pOldFont);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1); // 载入你的位图
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
CBitmap* pOldBitmap=dcMemory.SelectObject(&bmp); // 将位图选入内存DC
dcMemory.TextOut(mypoint.x,mypoint.y,mystr); // 在内存DC上输出文字,此时内存中已有位图存在了
pDC->BitBlt(0,150,bmpInfo.bmWidth,bmpInfo.bmHeight,&dcMemory,
0,0,SRCCOPY); // 将内存DC中的改造后的位图传送到本DC
dcMemory.SelectObject(pOldBitmap);
pDC->SelectObject(pOldFont);
LPRECT lpRect;
这里根据字符串创建的位图是DDB形式还是DIB形式,如果是DDB形式,想将其保存为DIB位图,是不是要先将其转换为DIB位图,然后再保存呢???哪位高手遇到过类似的情况,请不吝赐教。如果有相应的代码,能不能分享一下。
...全文
75 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
harryxusu 2009-11-08
  • 打赏
  • 举报
回复
搞定了,谢谢1楼的兄弟。
harryxusu 2009-11-08
  • 打赏
  • 举报
回复
GetObject(hBitmap,sizeof(BITMAP),(void *)&bitmap);//得到BITMAP结构。

这里的hBitmap是指位图的句柄吧,我在程序中定义了CBitmap bmp;如果想获得hBitmap是不是可以用
hBitmap=HBITMAP bmp;来获得当前显示的位图句柄??
wltg2001 2009-11-08
  • 打赏
  • 举报
回复
你的问题是将一个HBITBMP位图转化为BMP文件吧,网上有现成的代码,给你一份吧:

一个位图对象也就是存在内存中的位图,它与存在硬盘上的BMP文件相比,唯一的区别就是它没有BITMAPFILEHEADER这个文件信息头,其余部分是完全相同的,所以我们要做的就是先构造一个文件信息头,写入文件中,然后将内存中的位图写入文件。
源代码如下:(只写主要部分)
WORD wbitsCount;//位图中每个像素所占字节数。
DWORD dwpalettelsize=0;//调色板大小
DWORD dwbmdibitsize,dwdibsize,dwwritten;
BITMAP bitmap;//定义了位图的各种的信息。
BITMAPFILEHEADER bmfhdr;//定义了大小、类型等BMP文件的信息。
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh,fdib;
GetObject(hBitmap,sizeof(BITMAP),(void *)&bitmap);//得到BITMAP结构。
//以下代码是用BITMAP的信息填充BITMAPINFOHEADER结构
wbitsCount=bitmap.bmBitsPixel;
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=bitmap.bmWidth;
bi.biHeight=bitmap.bmHeight;
bi.biPlanes=1;
bi.biBitCount= bitmap.bmBitsPixel ;
bi.biClrImportant=0;
bi.biClrUsed=0;
bi.biCompression=BI_RGB;
bi.biSizeImage=0;
bi.biYPelsPerMeter=0;
bi.biXPelsPerMeter=0;
//以下代码是获取调色板的长度,调色板现在的用处很少,因为256色的位图已经不多了。
if(wbitsCount<=8)
dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);
//计算位图的大小,并分配相应的内存空间,注意的是没有分配BITMAPFILEHEADER。
dwbmdibitsize=((bitmap.bmWidth*wbitsCount+31)/8)*bitmap.bmHeight;
fdib=GlobalAlloc(GHND,dwbmdibitsize+dwpalettelsize+sizeof(BITMAPINFOHEADER));
lpbi=(LPBITMAPINFOHEADER)::GlobalLock(fdib);
*lpbi=bi;//将bi中的数据写入分配的内存中。
hdc=::GetDC(NULL);
GetDIBits(hdc,hBitmap,0,(UINT)bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwpalettelsize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
/*GetDIBits是最重要的函数,真正获得位图数据的工作就由它完成,它第一个参数为HDC,第二个参数为位图句柄,第三个参数为扫描行的开始行,一般为0,第四个为结束行,一般就是高度,第四个参数最重要,它表示接收数据的起始地址,这个地址一般是在调色板之后。第五个参数指的是接收BITMAPINFO结构的地址,这个结构上面没有写,它其实就是BITMAPINFO结构加上调色板信息。最后一个参数是格式。一般是DIB_RGB_COLORS*/
//创建文件以及文件信息头
fh=CreateFile(FileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(fh==INVALID_HANDLE_VALUE)
return FALSE;
bmfhdr.bfType=0x4d42;//BMP类型,一定要这样写
dwdibsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwbmdibitsize+dwpalettelsize;//文件总长,由几个部分组成
bmfhdr.bfSize=dwdibsize;
bmfhdr.bfReserved1=0;
bmfhdr.bfReserved2=0;
bmfhdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwpalettelsize;//位图数据相对于文件头的偏移量
//将文件信息头写入文件
WriteFile(fh,(LPSTR)&bmfhdr,sizeof(BITMAPFILEHEADER),&dwwritten,NULL);
//将数据写入文件,包含BITMAPINFO结构、调色板、数据
WriteFile(fh,(LPSTR)lpbi,dwdibsize,&dwwritten,NULL);
//关闭相关句柄
::GlobalUnlock(fdib);
::GlobalFree(fdib);
::CloseHandle(fh);
return TRUE;


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wltg2001/archive/2008/04/17/2300258.aspx

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧