请问能否把在CDC中画的矢量图,如一条直线或圆转换成bmp形式??????

dirdir 2002-01-18 08:32:58
...全文
204 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzh_haiz 2002-03-13
  • 打赏
  • 举报
回复
学习!
azuo_lee 2002-01-19
  • 打赏
  • 举报
回复
to Jady:

1。DC中的确是DDB,但是把一个DIB位图选入DC完全合法;
2。BitBlt的名字是“位块拷贝”,但它实际执行操作的对象是DC,而不是BITMAP。

基于以上两点,以下流程绝对不会有问题:
1。CreateDIBSection创建一个DIB,但并不填入实际像素数据;
2。CreateCompatibleDC创建一个内存DC;
3。将DIB选入内存DC;// SelectObject
4-1。如果直接在此内存DC上绘制,4-2与5两步可以略过;// Draw
4-2。如果在屏幕DC上绘制图形,则必须执行5;// Draw
5。使用BitBlt将屏幕DC复制到内存DC;
6。现在刚刚创建的DIB中存储的就是绘制的图形,而且由于DIB是我们创建的,我们有它的所有结构和像素点数据指针,存储到bmp文件非常方便。

再考虑您使用GetDIBits的流程:
1。创建一个位图;
2。CreateCompatibleDC创建一个内存DC;
3。将位图选入内存DC;
4-1。如果直接在此内存DC上绘制,4-2与5两步可以略过;
4-2。如果在屏幕DC上绘制图形,则必须执行5;
5。使用BitBlt将屏幕DC复制到内存DC;
6。对刚才内存DC中选入的位图调用GetDIBits函数;
7。根据GetDIBits中指定的DIB类型得到DIB数据,将它保存到bmp文件。

很显然,GetDIBits要多一道步骤(如果把绘制图形算作一次函数调用,第一种方法调用4或5次函数即可存盘,第二种方法要调用5或6次)。并且有如下结论:如果直接绘制到内存中,则BitBlt不需要使用;但如果是画在屏幕上,BitBlt必须使用。

以上两种方法的区别在于:第一种方法,系统效率主要消耗在SelectObject的时候,即GDI不得不把DIB位图转换为DDB位图,这在DIB规定的位图格式与DC中像素格式不符时是一个费时的操作;第二种方法系统效率主要消耗在GetDIBits的时候,GDI不得不作与上述过程相反的操作。

对于需要频繁使用SelectObject而存盘只有一次的情形,使用第二种方法显然效率会高一些——但无论如何,在使用第一种方法必须调用BitBlt的情况下,使用第二种方法也不可能避免BitBlt的使用。我不知道我说BitBlt错在哪里?
有品的和弦 2002-01-18
  • 打赏
  • 举报
回复
我建议你直接用位图画,虽然麻烦点,但挺好玩的
spark_zh 2002-01-18
  • 打赏
  • 举报
回复
先生成一个内存dc,在上面画图,最后再把它换出来。
CDC * pDC;
pDC = GetDC()
CBitmap bmp;
CBitmap *oldBmp,*newBmp;
oldBmp = new CBitmap;
newBmp = new CBitmap;
bmp.CreateCompatibleBitmap(pDC,宽,高);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
oldBmp = memDC.SelectObject(&bmp);
memDC.FillSolidRect(CRect( ),RGB( ));//画上底色要不然是黑的
//画线
memDC.LineTo...
.
.
newBmp = memDC.SelectObject(oldBmp);

这个newBmp就是画了图的CBitmap指针
Jady 2002-01-18
  • 打赏
  • 举报
回复
CDC中的是设备有关的位图,而bmp是设备无关的。BitBlt只是进行设备有关的位图之间的copy。当要bmp文件时需要设备有关的位图转换到设备无关的位图;所以参看MSDN的GetDIBits函数。azuo_lee不要误人子弟。

-Jady
masterz 2002-01-18
  • 打赏
  • 举报
回复
http://www.codeguru.com/bitmap/ImageHandler.html
http://www.codeguru.com/bitmap/window_to_file.shtml
Jady 2002-01-18
  • 打赏
  • 举报
回复
当然可以。
参看MSDN的GetDIBits函数。

-Jady
azuo_lee 2002-01-18
  • 打赏
  • 举报
回复
CDC中没有矢量图。凡是画到CDC上的东西本身就是BMP。BitBlt把它拷贝出来就行了。

1,660

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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