使用GDI+在图片上叠加文字

jacky198554 2010-05-17 10:29:03
我想请问一下,如何使用GDI+在图片上叠加文字。
也就是说将文字写到图片上,最生成的还是一张图片。
谢谢大家了!
...全文
851 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fd0123456789 2010-11-03
  • 打赏
  • 举报
回复
我想问问楼主问题解决了没啊?我也遇到了类似的问题啊
wltg2001 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fandh 的回复:]
直接选中图片,然后,在DC上面drawtext;当然,在drawtext以前,必须设置一下DC,SetBkMode(TRANSPARENT),最后,保存图片!
选中与保存图片,网上有很多例子!
[/Quote]
这个是GDI的,基本想法就是将图先贴到一个内存DC中,然后用TextOut去写字,最后保存文件。
下面给段将HBITMAP对象保存为BMP文件的代码:
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;
蒋晟 2010-05-17
  • 打赏
  • 举报
回复
GDI+的话用Graphics::FromImage创建一个Graphics之后在上面画
jacky198554 2010-05-17
  • 打赏
  • 举报
回复
谢谢您了
fandh 2010-05-17
  • 打赏
  • 举报
回复
这是gdi,你自己转换为gdi+
fandh 2010-05-17
  • 打赏
  • 举报
回复
HBITMAP hbmp= (HBITMAP)::LoadImage(AfxGetInstanceHandle(),filename,IMAGE_BITMAP,
SCREEN_WIDTH,SCREEN_HEIGHT,LR_LOADFROMFILE);
CBitmap bmpBackground;
bmpBackground.Attach(hbmp);

CDC *pDC = GetDC();
CBitmap* pOldBitmap = pDC->SelectObject(&bmpBackground);
int oldmode = pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(...);
pDC->SetBKMode(oldmode);
pDC->SeleteObject(pOldBitmap);
下面是保存,你自己搞定!
jacky198554 2010-05-17
  • 打赏
  • 举报
回复
谢谢您了,您能不能给我提供一下代码啊
C瓜哥 2010-05-17
  • 打赏
  • 举报
回复
楼上正解!
fandh 2010-05-17
  • 打赏
  • 举报
回复
直接选中图片,然后,在DC上面drawtext;当然,在drawtext以前,必须设置一下DC,SetBkMode(TRANSPARENT),最后,保存图片!
选中与保存图片,网上有很多例子!
jacky198554 2010-05-17
  • 打赏
  • 举报
回复
各为能不能给我已个全的代码啊,谢谢大家了

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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