怎样在图像上绘制文字?

gbstar2021 2002-12-22 12:39:17
- 有一个包含图像的缓冲区,如何向它的上面绘制文字?
- 怎样才能直接在一个缓冲区创建一个 DC 呢?(就像 DirectDraw 中直接可以使用 GetDC 创建一个可以访问表面的 DC)
...全文
335 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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

19,472

社区成员

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

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