社区
图形处理/算法
帖子详情
怎样在图像上绘制文字?
gbstar2021
2002-12-22 12:39:17
- 有一个包含图像的缓冲区,如何向它的上面绘制文字?
- 怎样才能直接在一个缓冲区创建一个 DC 呢?(就像 DirectDraw 中直接可以使用 GetDC 创建一个可以访问表面的 DC)
...全文
348
18
打赏
收藏
怎样在图像上绘制文字?
- 有一个包含图像的缓冲区,如何向它的上面绘制文字? - 怎样才能直接在一个缓冲区创建一个 DC 呢?(就像 DirectDraw 中直接可以使用 GetDC 创建一个可以访问表面的 DC)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gbstar2021
2002-12-24
打赏
举报
回复
上面 忘了点事情,没有dc是不能用 TransparentBlt()的,看来只能一个 BYTE by BYTE 的复制内存了,不过这样好像效率更低。
gbstar2021
2002-12-24
打赏
举报
回复
to cmzxlinhai
几个问题
1、我是在 directshow 中创建的 filter 中处理这个缓冲区,不能使用 directdraw 的表面。
2、在位图上创建 dc 可以实现,这需要做一次图像的复制,效率太低(一个 20f/s 的播放程序中,这种复制就是 20 次/秒)
3、创建一个专门用于写字的 dc 应该是个好方法,不过贴图的时候如何去掉文字的背景呢?TransparentBlt() 效率应该没有问题吧?
cmzxlinhai
2002-12-24
打赏
举报
回复
我有一个建议,看看行不行:
用memcpy拷贝您的Filter缓冲区待写字部分区域到Bmp缓冲,利用DC向Bmp写字,再回拷Bmp缓冲到您的Filter缓冲区,当然也可以考虑用汇编解决这一小段代码,但不知会快多少。
cmzxlinhai
2002-12-23
打赏
举报
回复
还没解决?
顺便做个更正,在下以上所说,如果与DirectX有关创建一个表面在上面写字后Blt或操作象素。
还有:
很难直接在缓冲中画字,在下觉得可以建立一个BMP和DC并写字,找出BMP的位地址,并将文字象素拷贝至您的缓冲
gbstar2021
2002-12-23
打赏
举报
回复
顶一下
flysundy
2002-12-23
打赏
举报
回复
那么多颗红星??!!!俺要何年何月才能出头,管理员也不给俺加个三角星来鼓励鼓励!!呵呵~~
小元宝
2002-12-23
打赏
举报
回复
你可以现在内存中将要画的字画上,然后用memDC.GetPixel()取得每个像素点的颜色,然后根据不同位的位图来取得它的颜色表重新负值就行了!
saucer
2002-12-22
打赏
举报
回复
yes, you need to get it the back through API GetDIBits or GetBitmapBits
see
http://www.codeguru.com/bitmap/ddb_to_dib.shtml
or
http://groups.google.com/groups?selm=8taqke%24ckb%241%40j1-035.rd.j-mac.co.jp&oe=UTF-8&output=gplain
gbstar2021
2002-12-22
打赏
举报
回复
to saucer:
这是我的一段测试代码:
BYTE* pBits=new BYTE[100*100*2];
ZeroMemory(pBits,100*100*2);
bmp.CreateBitmap(100,100,1,16,pBits);
memdc.CreateCompatibleDC(NULL);
memdc.SelectObject(&bmp);
memdc.FillSolidRect(0,0,100,100,RGB(255,255,0));
memdc.TextOut(0,0,"hello");
...
问题是 CreateBitmap 之后 CBitmap 好像是创建了一份图像的副本,在 memdc 上的操作并不能影响 pBits 指向的内存空间。
cmzxlinhai
2002-12-22
打赏
举报
回复
1、如果您的程序与DirectX有关,可以用Windows GDI的TextOut写完文字到一个位图后再复制过去(Blt方法)或直接操作像素复制过去,在我所碰到的文字记载中多数都是用Blt操作的。
2、您一定是先调入某个图象并且获得它的句柄,例如上面例子中的BMP图像句柄HBITMAP bmp,并得到它的图像缓冲区: c的方法是 用SelectObject(HDC,GDIObject) 然后TextOut(HDC......)
3、如果您用MFC 把HBITMAP Attach到CBitmap 再操作 而后CDC::SelectObject(&CBitmap)
在下只知道这些
gbstar2021
2002-12-22
打赏
举报
回复
to cmzxlinhai(老头)
图像缓冲区我已经可以获得,问题就是怎样才能在上面画文字,直接操作像素的方法画文字很困难。
zhenxizhou
2002-12-22
打赏
举报
回复
gz
cmzxlinhai
2002-12-22
打赏
举报
回复
补充一下:有了位图的句柄后您就很容易在位图上写文字,有了地址又可以定位、操作某个象素了,献丑!
cmzxlinhai
2002-12-22
打赏
举报
回复
这是一个32位位图的例子,24位、16位、8位位图类似
long * CBmp32View::GetBmp32PixAddress(HBITMAP bmp, int x, int y)
{
BITMAP bm;
BYTE* b;
long *address=NULL;
GetObject(bmp,sizeof(bm),&bm);
while(bm.bmWidthBytes %4 )bm.bmWidthBytes++;
b=(BYTE *)bm.bmBits + (bm.bmHeight-1) * bm.bmWidthBytes;
b=b-(y+1)*bm.bmWidthBytes+x*4;
address=(long *)b;
return address;
}
得到位图的内存地址
gbstar2021
2002-12-22
打赏
举报
回复
to saucer
谢谢你的回答,我是想创建一个 directshow 的 filter 在 mediasample 上绘制文字(字幕),如果使用上面的方法应该可以实现这个功能,不过可能效率太低(要额外的复制一份图像),有没有更好的方法呢?
cbc
2002-12-22
打赏
举报
回复
gz
Rigel
2002-12-22
打赏
举报
回复
今晚好多星星啊!
saucer
2002-12-22
打赏
举报
回复
create a memory DC, select your bitmap into it, get the DC handle, use TextOut or similar functions to draw text....
for example, see
http://www.vclife.com/makeprog.htm
Java写的为图片添加水印的软件(含源代码)
Java写的为图片添加水印的软件(含源代码) 具体可以参看:http://blog.csdn.net/cannel_2020/article/details/7525047
WindowsXP自带画图工具
WindowsXP自带画图工具 不用安装
java 绘图板 java源代码
java 小小绘图板 各种图形的
绘制
和
文字
的写入,也可以调整
文字
画笔的粗细 。还可以保存
图像
c# GDI+ 完整例子
超完整的C# GDI+例子,包含所有可能的功能,各种画笔的用法,含简单的图形学算法,浮雕效果、锐化、底片、渐变显示、坐标变换、旋转
文字
、箭头等 非常全的一个例子。
OpenCV在
图像
上
绘制
文字
示例
这个函数可以简单地在
图像
上
绘制
一些
文字
,由text指定的
文字
将在以左上角为原点的
文字
框中以color指定的颜色
绘制
出来,除非bottomLeftOrigin标志设置为真,这种情况以左下角为原点,使用的字体由fontFace参数决定。衬线体的特征是在字的笔画开始、结束的地方有额外的装饰,而且笔画的粗细会有所不同。这类字体通常是机械的和统一线条的,它们往往拥有相同的曲率、笔直的线条和锐利的转角。OpenCV中除了提供
绘制
各种图形的函数外,还提供了一个特殊的
绘制
函数,用于在
图像
上
绘制
文字
。
图形处理/算法
19,468
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章