4874|10

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

BitBlt的画图问题 [复制链接]

各位:
  我用一个临时DC来选图片,然后把到放到内存DC指定位置,然后把内存DC的图片拷到显示DC里去。
刚开始的时候显示DC里是一个纯黑的图,BitBlt过去后,彩色图片变成白色了。
后来我把显示DC清空,直接把内存DC的拷到显示DC里去,发现原来从临时DC到内存DC的时候图片就花的了。
这个问题好像是BitBlt在把彩色图拷到单色图时的问题,不过不知道怎么处理。(因为我直接把图选到内存DC,在从内存DC到显示DC,图片显示是正常的,好像显示DC也是单色,晕了。。。)

可能说的不清楚,不知道怎么解决?

最新回复

这个问题专业,就需要AlphaBlend了, 需要32位的位图,,针对每个点做alpha通道. PC机上好像PNG用得比较多,就是因为png有alpha通道   详情 回复 发表于 2009-11-27 16:40
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
那你希望是什么样子的呢?
你难道是要把彩色图显示的时候变成单色图?
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
没有啊 就彩色显示出来啊。
问题是现在搞过去后,背景都跟着花了,整个就变成了黑白的。
不知道怎么上图 不然上个图给你看
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 

  1. //这是在ShowWindow之前把图片加载好,并画到内存DC中。
  2.         TCHAR szPath[100];

  3.         wsprintf(szPath, _T("%s%s"), g_szImagePath, _T("bkImage_bk.jpg"));
  4.         g_stIcon[0].bitmapUp = SHLoadImageFile(szPath);
  5.         g_stIcon[0].position.left = 0;
  6.         g_stIcon[0].position.top = 0;
  7.         g_stIcon[0].position.right = SCREENWIDTH;
  8.         g_stIcon[0].position.bottom = SCREENHIGHT;

  9.         wsprintf(szPath, _T("%s%s"), g_szImagePath, _T("button_up.png"));
  10.         g_stIcon[1].bitmapUp = SHLoadImageFile(szPath);
  11.         wsprintf(szPath, _T("%s%s"), g_szImagePath, _T("button_down.png"));
  12.         g_stIcon[1].bitmapDown = SHLoadImageFile(szPath);
  13.         g_stIcon[1].position.left = 0;
  14.         g_stIcon[1].position.top = 0;
  15.         g_stIcon[1].position.right = 60;
  16.         g_stIcon[1].position.bottom = 74;
  17.        


  18.         HDC hdc = GetDC(hwnd);
  19.         g_hMerDC = CreateCompatibleDC(hdc);
  20.         HBITMAP Canvas = CreateCompatibleBitmap(g_hMerDC, 720, 400);
  21.         SelectObject(g_hMerDC, Canvas);
  22. //        SetBkColor(g_hMerDC, RGB(0, 0, 0));
  23. //        SetBkMode(g_hMerDC, TRANSPARENT);

  24.         HDC hTempDC = CreateCompatibleDC(hdc);
  25.         SelectObject(hTempDC, g_stIcon[1].bitmapUp);
  26.         BitBlt(g_hMerDC, g_stIcon[1].position.left, g_stIcon[1].position.top, g_stIcon[1].position.right, g_stIcon[1].position.bottom,
  27.                 hTempDC, 0, 0, SRCCOPY);


  28. //        SelectObject(g_hMerDC, g_stIcon[IMG_CALL].bitmapUp);
  29.         ReleaseDC(hwnd, hdc);
  30.         return TRUE;


  31. //下面是在wm_paint的时候
  32.                                 //把背景显示到屏幕上
  33.                                 HDC hTempDC = CreateCompatibleDC(hdc);

  34.                                 SelectObject(hTempDC, g_stIcon[0].bitmapUp);
  35.                                 BitBlt(hdc, 0, 0, SCREENWIDTH, SCREENHIGHT, hTempDC, 0, 0, SRCCOPY);
  36.                                 g_once = FALSE;

  37.                                

  38.                                 DeleteDC(hTempDC);

  39. //                                 SetBkColor(g_hMerDC, RGB(0, 0, 0));
  40. //                                 SetBkMode(g_hMerDC, TRANSPARENT);               
  41. //内存DC的拷到显示DC
  42.                                 BitBlt(hdc, 0, 0, SCREENWIDTH, SCREENHIGHT, g_hMerDC, (g_dwCurPage - 1) * 240, 0, SRCCOPY);
复制代码



就这些代码
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
你怎么选图的,memdc缺省的bitmap是个1x1单色的bitmap,你要为它创建一个合适的bitmap.就像下面这样:
HDC memDC = CreateCompatibleDC ( hDC );     
HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );
SelectObject ( memDC, memBM );
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
这个处理过了 给了一个屏幕还大的BITMAP
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
    HDC hdc = GetDC(hwnd);
    g_hMerDC = CreateCompatibleDC(hdc);
    HBITMAP Canvas = CreateCompatibleBitmap(g_hMerDC, 720, 400);

正确的代码应该是:

    HDC hdc = GetDC(hwnd);
    g_hMerDC = CreateCompatibleDC(hdc);
    HBITMAP Canvas = CreateCompatibleBitmap(hdc, 720, 400);
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢WceUi
好像问题就出在这。
我记BitBlt可以把源图片中 除了某色以外的色彩传送到目标图片吧,就是指背景色为透明。请问这个怎么做?这是我在书上看的,但BitBlt的参数中没找到这个。
能不能讲一下,谢谢
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
试试TransparentBlt,最后一个参数就是你说的关键色
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
用这个方法的话,背景和彩色交界出有渐变的话,旁边还是会有一点背景色呢。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

11
 
这个问题专业,就需要AlphaBlend了,
需要32位的位图,,针对每个点做alpha通道.

PC机上好像PNG用得比较多,就是因为png有alpha通道
引用 9 楼 kaiyi1986 的回复:
用这个方法的话,背景和彩色交界出有渐变的话,旁边还是会有一点背景色呢。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表