如何在BMP图片上贴文字?

cctime 2003-12-26 03:53:28
有一个BMP文件,还有一个STATIC的文字(有字体如楷体),
如何把文字贴到BMP上,并生成一个新bmp文件?
...全文
295 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cctime 2003-12-27
  • 打赏
  • 举报
回复
HANDLE hImage = ::LoadImage(AfxGetApp()->m_hInstance,
"c:\\doctmp\\a.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HDC hMemDC = CreateCompatibleDC(NULL);

然后如何把hImage放到hMemDC里?
wrcluomo 2003-12-26
  • 打赏
  • 举报
回复
也好办:
int nOldBKMode=pdc->SetBkMode(TRANSPARENT);
pMemDC->SetBkMode(TRANSPARENT);
cctime 2003-12-26
  • 打赏
  • 举报
回复
如果文字要透明的效果呢,就是没笔画的地方不能覆盖图片
xinyu 2003-12-26
  • 打赏
  • 举报
回复
补充一句:
TextOut(hBufDC,"Static 文字")
bluebohe 2003-12-26
  • 打赏
  • 举报
回复
m_hBitmap = (HBITMAP)::LoadImage (NULL, szFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)

加载BMP文件
bluebohe 2003-12-26
  • 打赏
  • 举报
回复
第一个函数是根据dc的内容得到位图,第二个函数是把位图存成文件

// CReadWriteBmpView message handlers
HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight)
{
HDC hBufDC;
HBITMAP hBitmap, hBitTemp;

//创建设备上下文(HDC)
hBufDC = CreateCompatibleDC(hDC);

//创建HBITMAP
hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);

//得到位图缓冲区
StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,
hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);

//得到最终的位图信息
hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);

//释放内存

DeleteObject(hBitTemp);
::DeleteDC(hBufDC);

return hBitmap;
}

BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;

//计算位图文件每个像素所占字节数
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 wBitCount = 24;

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.biClrImportant = 0;
bi.biClrUsed = 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, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);

//恢复调色板
if (hOldPal)
{
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}

//创建位图文件
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; // "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;
}
bluebohe 2003-12-26
  • 打赏
  • 举报
回复
只要把这个BMP文件LoadImage加载到位图句炳,然后把该位图替换内存DC的位图,然后在内存位图中写字,绘图完后取回该位图,然后在使用该位图生成一个文件即可
broadoceans 2003-12-26
  • 打赏
  • 举报
回复
如果你用过DirectDraw,就更方便了。
broadoceans 2003-12-26
  • 打赏
  • 举报
回复
用一个图片框,加载bmp文件
然后得到其DC,CDC *pDC;
然后设置
pDC->SetBkMode(TRANSPARENT);
设置字体
pDC->TextOut(...)写入即可。

最后将其保存为文件
能简介: 文件管理功能: 1.支持的文件格式包括:BMP、GIF、ICO、TGA、PCX、WBMP、WMF、JPEG、PNG、MNG、TIFF、JBIG、PNM,PPM,PGM、RAS,DXF ,DWF、DWG 、IGS, MIF,PLT,PRN,HPGL/HPGL2、DGN, SHP, SAT, PS/IGES 2.打开图形图像文件;支持从URL网上打开;3.打印文件:全部打印和选择打印,打印预览, 打印到文件;4.保存和读取自定义格式文件;5.将矢量图以指定的尺寸保存为光珊图或者复制到系统粘板上; 显示功能: 1.显示平移,自由缩放,框选放大,最佳显示;2.回溯显示;3.支持显示透明命令操作;4.支持三维文件格式显示;5.鸟瞰,鹰眼,放大镜功能; 元素支持功能:1.点;直线,折线,射线;圆,圆弧;椭圆,椭圆弧;.样条线;函数曲线;填充区域;多义线;2.文字标注;3.尺寸标注(水平,竖直,对齐,角度,半径,直径尺寸等);4.块插入;5.图片插入;6.多边形;7.引线;8.基本三维元素创建;9.图层;10.块定义;图片操作功能:1.支持多种图像文件格式的转换;2.图片的旋转,缩放变换;3.图片的alpha混合度调节;4.图片的色彩明暗调节;5.图片的多种效果支持,锐化,柔化,浮雕效果等;6.图片的合并与切割;7.读取粘板上的图片;8.指定大小尺寸保存图片; 属性功能:1.几何属性,颜色,线型,线宽;2.图层属性:显示,隐藏,冻结;3.尺寸属性:颜色,箭头,尺寸线属性,尺寸引线属性,尺寸文字属性,显示单位等;4.文字属性:字体和颜色;字体包括:字体名称,字体高度宽度,是否重显,倾斜,字符集,大小型文件字体(兼容AutoCAD shx字体文件)等;5.块属性:名称,基点,旋转角度,缩放比例;6.剖面线属性:名称,旋转角度,缩放比例; 创建功能: 1.创建点线圆几何等元素;2.两点或三点创建圆或圆弧;3.两点或三点创建椭圆或椭圆弧;4.相应的方式创建常见的各种元素; 编辑构造功能: 1.可以修改元素的几何或显示属性;2.复制,粘,删除;移动,旋转,镜像,阵列,打断,延伸等功能; 选择和捕捉功能: 1.单选,多选,框选,过滤选择;2.可以捕捉所有元素及其延长线;3.关键点捕捉:支持起点,终点,中点,中心点,切点,交点,相线点,平行,垂直,延长线相交点; 计算功能:1.两点距离,几何长度,周长的计算;2.面积计算;3.角度计算;4.点是否在区域内;5.交点计算;6.点选封闭区域,填充算法;7.最大,最小封闭区域算法;8.最短路径算法; 系统属性设置功能:1.系统缺省的属性设置; 接口函数: 1.所有功能都提供接口函数供二次开发者使用;2.每个元素都有唯一的ID号;用户可以根据ID号把图形系统和自己的系统联系起来;3.接口以DLL库和OCX两种两种方式提供; 其他功能:1.将windowsTuretype字体转换为矢量图形(TTF2DXF);2. 生成插入块的缩略图;

19,471

社区成员

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

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