在BMP图片数据上叠加字符,不是用于显示,而是真正叠加到图片中去(图像为640*480*3)

YFY 2005-04-06 08:30:32

在BMP图片数据上叠加字符,不是用于显示,而是真正叠加到图片中去,需要可以选择叠加字符的
字体类型、字体大小、颜色。

已经用字库点阵的方式实现了把8*16汉字点阵宋体字符叠加到图片上,只能选叠加字体颜色不过 别人不满意。

不能使用如Picture或Image控件实现叠加,这个我也试过了,最后不好控制压缩成Jepg后的质量,
而且中间过程费时。

查阅了一下,发现有人说:
先创建memDC,然后把文字写到memDC上(可以使用DrawText把文字写到位图上),这时就可以把 memDC转换为DIB了。

不熟悉图像方面的API函数,求助于各位了,^_^。
...全文
618 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
YFY 2005-04-14
  • 打赏
  • 举报
回复
^_^ 近日抽空做了一下,已搞定。
dongpy 2005-04-07
  • 打赏
  • 举报
回复
我觉得可以这样:

1.打开位图文件,并且显示在屏幕上。

2.用DrawText函数(可以设置字体类型、字体大小、颜色)把需要的字写到屏幕上,字体在位图上

的相对区域是已知的。

3.用GetPixel取这个区域的象素值,存入一个数组,然后把这个数组写到BMP数据区的相应区域中。
YFY 2005-04-07
  • 打赏
  • 举报
回复
在 VC 版 http://community.csdn.net/Expert/topic/3913/3913228.xml?temp=.4229395
有一些回答。
不过对hMemDC的更改好像也不会影响原始数据区。
老夏Max 2005-04-07
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1106
YFY 2005-04-07
  • 打赏
  • 举报
回复
为了控制速度在50毫秒以内,最好20毫秒以内,所有操作都要在内存中完成,
包括图像数据也是内存中的,没有hDC这样的句柄,不知道怎么能用已知长度和高度的图像数据,
建立一个对应的hDC,然后往里面写完数据后,把以叠加字符的图像数据取出来啊。
sandrowjw 2005-04-07
  • 打赏
  • 举报
回复
就是用后台的Bitmap,
hMemDC = CreateCompatibleDC(hDC);
然后创建相应的后台位图
hMemBmp = CreateCompatibleBitmap(hMemDC, 600, 400);
然后选用
SelectObject(hMemDC, hMemBmp);
然后用MemDC写字,然后存一下就可以了,自己写Bitmap文件格式不用调色板的话还是比较简单的。
YFY 2005-04-06
  • 打赏
  • 举报
回复
sttony(冥界来客) 是否可说的详细一些。

本来也可以去查资料做的,事情比较紧急一些,没有时间做了。
YFY 2005-04-06
  • 打赏
  • 举报
回复
好几个兄弟都说去VC版问,我也去那里发个贴好了。

把文字信息直接写入图片,不需要读出来。

我是在应用程序中调用一个自己写的动态库,传入BMP图片数据的地址,
把字符叠加后的BMP图像数据传出来,再做可用参数控制的压缩处理,最后生成可控制质量的Jpeg图片。

arrowcy(长弓手) 提供的建立内存MemDC的方法好像不能直接用啊。
sttony 2005-04-06
  • 打赏
  • 举报
回复
创建一个hDC,内存的或是可以实际画出来的都行,
HBITMAP hBitmap= LoadImage(原来的Bitmap);
SelectObject(hDC,hBitmap);
创建需要的字体Font hFont;
DrawText(hDC, "Hello world!");
然后将这个hDC重新生成一个位图文件,需要自己创建文件头。
searoom 2005-04-06
  • 打赏
  • 举报
回复
楼主的意思是不是将文字信息添加在 bmp 文件中,显示时可以通过特定的过程将文字读出
还是说直接就将文字覆盖掉 bmp 一定位置的图像?

如果是第二个,我觉得直接将文字写在 bmp 图像上就可以啦,难道会很麻烦吗?
YFY 2005-04-06
  • 打赏
  • 举报
回复
自己顶一下。
arrowcy 2005-04-06
  • 打赏
  • 举报
回复
查了一个双缓存的,应该可以通过它了解到建立memdc的方法了吧

3、如何实现双缓冲

首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:

CDC MemDC; //首先定义一个显示设备对象

CBitmap MemBitmap;//定义一个位图对象

//随后建立与屏幕显示兼容的内存显示设备

MemDC.CreateCompatibleDC(NULL);

//这时还不能绘图,因为没有地方画 ^_^

//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小

MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);



//将位图选入到内存显示设备中

//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上

CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

//先用背景色将位图清除干净,这里我用的是白色作为背景

//你也可以用自己应该用的颜色

MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

//绘图

MemDC.MoveTo(……);

MemDC.LineTo(……);



//将内存中的图拷贝到屏幕上进行显示

pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

//绘图完成后的清理

MemBitmap.DeleteObject();

MemDC.DeleteDC();

上面的注释应该很详尽了,废话就不多说了。
arrowcy 2005-04-06
  • 打赏
  • 举报
回复
其实应该到vc版问这个问题,当然,用纯粹C/C++的办法也可以解决
实际上bmp图像格式是很简单的,数据区里面全是按顺序排列的颜色值,如果你能够获取到每个字符由哪些颜色,在哪些位置那就好办了。
这是完全“手工”的方法
如果调用API的话
就是你说的建立memDC了,我也记不清具体步骤,可以参考一下双缓存的实现方法嘛
里面的第一步就是要在内存中绘图
xuwedo2003 2005-04-06
  • 打赏
  • 举报
回复
不懂不过,支持一下。查查MSDN应该会有收获。
pcboyxhy 2005-04-06
  • 打赏
  • 举报
回复
只要知道BMP图像文件的格式和需要的文字的字库
还是不难的
zengwujun 2005-04-06
  • 打赏
  • 举报
回复
你这个到vc版去问,肯定能帮你解决的,不太难。
YFY 2005-04-06
  • 打赏
  • 举报
回复
其他可以实现目的方法都可以了,不过我要把这个功能用VC做到动态库中去的。
富莱工作室 2005-04-06
  • 打赏
  • 举报
回复
在我的代码中, 没有使用字体, 不过, 可以在中是添加代码进创建字体
富莱工作室 2005-04-06
  • 打赏
  • 举报
回复
CBitmap bitmap;
bitmap.m_hObject =(HBITMAP) ::LoadImage(NULL, "D:\\Facebmp.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE);
CDC mdc;
CClientDC dc(this);
mdc.CreateCompatibleDC(&dc);
CBitmap *oldbitmap = mdc.SelectObject(&bitmap);
mdc.SetBkMode(TRANSPARENT);
mdc.SetTextColor(RGB(255, 0, 0));
mdc.TextOut(100, 100, "hello, word");

BITMAP m_bit;
bitmap.GetObject(sizeof (m_bit), &m_bit);
long length = m_bit.bmHeight * m_bit.bmWidthBytes;
unsigned char *Array = new unsigned char [length];
unsigned char *tempArray = new unsigned char[length];

bitmap.GetBitmapBits(length, Array);
//int * pi = (int*) tempArray;

for(int i = 0; i < length ; i++)
{
tempArray[i] = Array[length - 1 - i];
}

int Ln = m_bit.bmHeight, Col = m_bit.bmWidthBytes;

for(i = 0; i < Ln; i++)
{
for(int j = 0; j < Col / 2; j++)
{
unsigned char temp = tempArray[i * Col + j];
tempArray[i * Col + j] = tempArray[(i + 1) * Col -1 - j];
tempArray[(i + 1) * Col - 1 - j]= temp;
}
}


BITMAPFILEHEADER newheader;
newheader.bfType = 0x4d42;
newheader.bfSize = sizeof(newheader);
newheader.bfOffBits = sizeof(newheader) + sizeof(BITMAPINFOHEADER);

BITMAPINFOHEADER newInfo;
newInfo.biSize = sizeof(newInfo);
newInfo.biHeight = m_bit.bmHeight;
newInfo.biWidth = m_bit.bmWidth;
newInfo.biCompression = 0;
newInfo.biPlanes = 1;
newInfo.biBitCount = 24;

CFile ofile("D:\\dx.bmp", CFile::modeReadWrite | CFile::modeCreate);
ofile.Write(&newheader, sizeof(newheader));
ofile.Write(&newInfo, sizeof(newInfo));
ofile.Write(tempArray, length);
ofile.Close();
delete []Array;
delete []tempArray;
浩辰ICAD2008i 全程放心使用 www.hccad.net   浩辰ICAD2008i从性能到功能都有了较大提高,在国产CAD平台中仍遥遥领先。   • 浩辰ICAD2008i打开文件速度提高30%,保存文件速度提升50%,操作更顺畅。   • 打印系统有质的飞跃,从功能、出图效率和出图正确性都有极大提高,接近国际顶尖的CAD的水平。   • 全新“自定义用户界面”,与AutoCAD2008完全兼容。   • 完善了对文字的处理,功能、性能和兼容性明显增强。   • 改进填充、设计中心、代理对象的显示和编辑、OLE对象支持等功能,现有功能更完美。   • 增加了设置图纸密码、图纸发布、PDF文件输出、多夹点编辑、远程文本、弧形文字、区域覆盖、SPLINEDIT、CONVERT等大量实用功能,使用户操作更得心应手。 一、全能的打印输出系统   浩辰ICAD2008i打印系统主要有下面几大特点:   • 高精度打印,打印尺寸更精确。   • 全新打印操作,与国际主流的CAD完全相同。   • 全新打印预览,精确, 高速。   • DWG打印布局数据兼容。   • 完美兼容CTB与STB打印方式,国内独家提供颜色相关与名称相关等两种打印样式处理机制。   • 打印系统的重大改进主要包括下面几方面:   1、改进打印操作环境   为了让用户更加方便的操作浩辰ICAD2008i打印系统,浩辰ICAD2008i实现了与AutoCAD最新版本近乎一致的操作界面,给用户基本一致的操作感觉,无需重新熟悉。   设置界面上新增了预览窗口,用户可直观的了解到当前设置打印的大致情形。在选择打印窗口时浩辰ICAD2008i会将当前已经打印区域亮显,方便用户确认选择。   为了让用户更加便于控制打印样式,浩辰ICAD2008i提供了与AutoCAD2008一致的打印样式表设置环境,使用可以非常方便的操作浩辰ICAD2008i打印样式系统。   2、 隆重加入HDI第三方打印驱动接口   浩辰ICAD2008i在国内首次实现了打印驱动框架接口(Haochen Device Interface ,HDI),同时向二次开发商提供HDI开发接口,方便国内用户控制及实现打印功能。   浩辰使用HDI框架实现了常用的打印驱动。实现的驱动包括:HP绘图机,PS\EPS,PDF,EMF/WMF,常用光栅格式(BMP,JPEG,PNG,GIF,TIF)。   同时,浩辰ICAD即将实现打印生成DXB等等AutoCAD定义的格式和PCL HP小型打印机驱动。下面将对以上驱动做详细介绍。   HDI驱动有其灵活的挂接上也明显提高,HDI驱动没有繁索的安装过程,且所有的设置参数与原有的系统设置并存,可以进行预览,笔宽,线型,纸张等等参数的设置。   3、智能化打印优化驱动   浩辰ICAD2008i新加入了智能打印优化驱动挂接系统驱动,可使近乎所有的系统绘图机从出图效率与出图正确性自动得到不同层次的提高。通过特殊的打印处理流程,使几乎任何系统绘图机均可自动得到较高的出图效率与精度,其出图精度达到1像素级别即300/1英寸。用户在不需做任何特殊设置即可使近乎所有系统绘图机出图效率与精度与国际顶尖的CAD软件相近的程度。   4、完全支持CTB和STB   浩辰ICAD2008i国内独家同时支持了CTB(颜色相关)与STB(名称相关)两种打印颜色映射方式,并支持所有参数,包括:颜色、抖动、灰度、笔号、虚拟笔号、淡显、线型、自适应、笔宽、端点、连接、填充。这使浩辰ICAD2008i进一步确立了打印出图的国内领先地位。   5、基于PC3的打印设备个性化配置系统   浩辰ICAD2008i国内首创支持了真正意义上的 PC3 打印配置系统,用户可使用PC3文件纪录下打印设备特有设置信息,如:打印机自定义纸张、出图分辨率等,并可灵活挂接多种HDI驱动打印出图。其PC3设置与Autocad2008是完全一至的,极大的方便了用户打印出图。   透过 PC3 打印配置系统,用户可将如:自定义纸张、打印横纵向、着墨清晰度、进纸器选择、颜色叠加方式等数十个打印设备个性化设置存储在PC3文件中,如同AutoCAD一样当用户在打印机列表选择该PC3文件时,系统将自动使用已经存储的设置初始化打印设备并进行打印。 二、多行文字系统全面改进   在浩辰ICAD以前的版本中,兼容性是比较突出的问题。浩辰ICAD2008i版从底层对文字、多行文字进行了系统的技术改进,在文字系统在功能和性能上基本接近于最新版本的AutoCAD,相比国内同类产品,浩辰ICAD2008i的兼容性有了显著提高。这些重要技术改进体现在以下几个主要方面:   • 全新的多行文字解码系统。新的解码系统不仅功能更加完善,支持目前所有的文字格式,而且容错性良好。   • 全新的字模解析功能。新的字模解析功能有助于提高文字显示性能,并且尺寸控制更精准,文本行的长宽和AutoCAD完美兼容。   • 全新的多行文字排版布局系统。增加了对段落缩进和制表位的支持,完善了排版布局功能,大大增强多行文字显示输出兼容形。   • 改进字体管理系统。全新的字体和字形缓存机制,有效地减少了内存占用,并且显示性能更高。 三、全新的自定义用户界面   浩辰ICAD2008i新的“自定义用户界面”与AutoCAD2008的“自定义用户界面”兼容,方便简洁的展示了所有的界面元素、图标、和程序所支持的命令。自定义文件采用目前流行的XML格式,同时支持老的的菜单文件格式(mnu、mns) 。   “自定义用户界面”对话框包含一系列动态显示窗格,可随意隐藏或改变其大小,以达到用户理想的显示效果。在左边的窗格中,以树形结构层次分明的列出了所有的用户界面 (UI) 元素,选择其中某个元素后,就可以在右边的窗格中查看其说明并修改其中可以用户自定义的属性。   除了可以通过“自定义用户界面”对话框修改已有的界面元素外,用户还可以通过提供的拷贝、粘贴、复制、删除、新建等命令简单快捷地创建新的用户界面元素。在新的界面元素创建后,可从命令列表中选择特定的命令拷贝或拖拽到其下,以完成界面元素与命令的关联。   对于二次开发用户,“自定义用户界面”对话框提供了方便的命令自定义方式,只需在图标列表单击选择就可方便地更改与命令对应的图标。除了选择已有的图标,用户还可以方便地调用“按钮编辑器”修改或创建新的图标,并将其与特定的命令相关联。 四、改进功能   1、自动恢复管理器   增强型图形恢复管理器提供了修复由于程序异常等未正确保存的图形文件功能。当程序异常退出,图形文件没有被保存时,程序再次启动,将显示图形恢复管理器,列出没有保存文件的最近保存版本和自动备份文件,以供用户从最近保存的备份文件中恢复。   新的图形修复管理器界面和ACAD兼容,对未正常保存的文件进行分类显示和管理,方便用户在程序出现异常时,修复上次没有正常保存的图形文件。   异常突发保存功能,在程序发生一些未知异常的情况下会提示用户尝试保存数据,如果保存成功,会在自动恢复管理器上列出。给用户最大限度的安全感受。   2、自动备份功能增强   浩辰ICAD2008i提供了自有的快速自动备份机制,以比较大的磁盘空间冗余备份,提供较强的自动备份机制。增强的自动备份功能,提供了对快速自动备份文件的压缩功能,对生成的dwh自动备份文件进行压缩存储,节省大量自动备份文件占用的磁盘空间,并且当磁盘空间剩余空间减少到一定数量时,及时给用户以提示信息,提示用户进行磁盘清理。   3、完善填充功能   增加指定图案填充原点、重新创建边界、是否孤岛检测、绘图次序、创建独立的填充图案、支持面域等功能,界面进一步兼容AutoCAD,增加-bhatchedit命令。   4、支持填充剪切   填充可以作为剪切的边界,并可以被修剪。   5、完善的设计中心   新的设计中心实现了和AutoCAD从界面、功能和操作习惯上的兼容,方便用户的使用。设计中心支持如下功能:   • 浏览用户计算机、网络驱动器和 Web 页上的图形内容(例如图形或符号库)。   • 在定义表中查看图形文件中命名对象(例如块和图层)的定义,然后将定义插入、附着、复制和粘贴到当前图形中。   • 创建指向常用图形、文件夹和 Internet 网址的快捷方式。   • 向图形中添加内容(例如外部参照、块和填充)。   • 在新窗口中打开图形文件。   • 将块拖动到工具选项板上以便于访问。   如下是设计中心界面:   6、完善Arx接口调用   浩辰ICAD ARX 在一年的补充完善后,于浩辰ICAD2008i实现了完整的ICADARX SDK开发环境,二次开发商可以使用SDK像在AutoCAD上做二次开发一样,开发ICADARX程序,并可方便的移植AutoCAD二次开发程序到浩辰ICAD下。   7、改善Appload对话框,提高二次开发程序的加载和管理   Appload对话框区分已加载的应用程序和历史记录列表,更加直观明了;增加启动组,程序启动时自动加载,相应应用程序,方便快捷;增加加载VBA应用程序,全面支持vba。   8、LISP加密   浩辰ICAD2008i支持LSP文件加密,命令:encrylisp。加密方式可选择ACAD、AES、DES、3DES。   9、改善代理对象的支持   浩辰ICAD2008i改写了代理实体的显示流程,显示的正确性明显提高。浩辰ICAD2008i全面改进代理实体的处理流程,能够将代理实体分解为其显示图元(直线、圆弧、文字等),并能对代理实体和其它实体一样进行平移、旋转和缩放,正确保存编辑后的图形。   10、增加DDUCS对话框、Rename对话框   DDUCS对话框实现如下功能:显示选定 UCS 的坐标轴和原点的相关信息,显示和修改已定义但未命名的用户坐标系,恢复命名且正交的 UCS,指定视口中 UCS 图标和 UCS 设置 。   Rename采用对话框模式,修改UCS、图块、文字样式、线型等的名称更加方便。 五、 新增功能   1、图纸加密功能   修改文件或保存文件时,可以向图形添加口令,之后保存该图形,图形文件将被加密。除非输入口令,否则图形文件将无法重新打开。这样能保证用户图纸的安全性。若有多个图形文件,应该为每个需要加密的图形分别附加口令。   加密算法完全兼容AutoCAD,即ICAD和AutoCAD加密的图形文件可以双向存取。   2、发布(Publish)   创建单页或多页图形集以发布到一个单独的多页DWF文件。   3、图纸导出 PDF 功能   导出当前图形到 PDF(Portable Document Format) 文件。通过输入 EXPORT 命令即可。   4、增加HPGL/2的标准Plt文件转换为Dwg文件的功能。   5、简繁体互转   浩辰ICAD2008i提供了对图中文字相关实体的字符集转换功能,用户可方便的转化字符到BIG5或GB2312。命令:gb2big5。   6、新增实体支持   动态反应文字:rtext,可将一个文本文件的内容或一个DIESEL表达式的计算结果作为文字对象显示在图中。   弧形文字:arctext,将文字沿着一条弧线绘制。   区域覆盖:Wipeout,方便快捷地创建多边形区域,该区域将用当前背景色屏蔽其下面的对象。   7、多夹点编辑功能   可以同时操控多个实体的多个夹点。可以使用多个夹点作为基夹点来使选定夹点之间的对象形状保持不变。 选择夹点时按下 SHIFT 键。   8、新增splinedit命令   样条线编辑支持带热夹点编辑,操作方式和AutoCAD兼容。新增splinedit命令,使用该命令可以进行如下编辑操作:   • 拟合数据。编辑定义样条曲线的拟合点数据,不包括修改公差。   • 闭合。将开放样条曲线修改为连续闭合的环。   • 移动顶点。将拟合点移动到新位置。   • 细化。通过添加、权值控制点及提高样条曲线阶数来修改样条曲线定义。   • 反转。修改样条曲线方向。   9、新增tracking,mtp等命令修饰符   Tracking: 从一系列临时点中定位点;   Mtp: 定位两点的中点。   10、convert命令   convert命令目前实现了多段线的转换,可以将将旧格式的二维多段线(POLYLINE)转换成新格式的多段线(LWPOLYLINE)。对包含在块中的多段线也进行转换。   11、3D connexion 三维鼠标接口   浩辰ICAD2008i独家提供了对3D connexion三维鼠标的支持,用户可使用3D connexion三维鼠标操作ICAD3D视图,浏览3D模型。ICAD可以接收三维鼠标发来的X,Y,Z三轴旋转与位移信息,并对其正确处理,实现只有高端CAD产品所具有的3自由度,3D实体操作,极大的方便了用户在3D空间内操作,使用户实现3DCAD设计的效率更高、更加方便。

64,673

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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