求教!关于双缓冲和Bitbit

gameice 2009-11-18 04:51:17
用双缓冲的话 BitBlt 是不是不支持png图像从缓冲DC复制到DC?


那该怎么处理啊?

一开始我用GDI+的方式操作,但是显示不出图像.后来

我试着用atlimage.h里的

CImage cimg;
cimg.Load(fileName);
HBITMAP hbmp=cimg.Detach();

这样据说可以像操作 BMP 图片一样处理图片 读是读出来了,可那样得到的是一个不具有透明通道的bmp图像,也就是说还是没办法正常使用

win32应用
...全文
151 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gameice 2009-11-18
  • 打赏
  • 举报
回复
谢谢楼上的热心帮助 gdi+的操作没有问题,这点小弟可以确认了. bmp图像的透明处理小弟也懂点.

不过终于知道了问题.

我在单独的win32 aply里没有这样做显示没有问题,所以也没想过会是这里的问题

问题出在使用GDI+之前,需调用GdiplusStartup初始化GDI+函数库.

虽然我不知道为何我的测试工程里没有问题 也许是BeginPaint EndPaint里可以忽略?

但是GdiplusStartup之后确实解决了问题.
xg198804 2009-11-18
  • 打赏
  • 举报
回复
楼主,我首先要知道你想用GDI还是GDI+.如果用的GDI+你可以这样:
//先从文件名(即你的PNG图像文件)创建一个Bitmap对象
Bitmap bmp=new Bitmap("filename.png");
//然后再获取一个Graphics对象(它表示要显示的图像的绘图表面)用其DrawImage方法
Graphics graphic =e.Graphics;
graphic.DrawImage(bmp,0,0);
wwwxhb 2009-11-18
  • 打赏
  • 举报
回复
.bmp的透明显示
先把你要处理的图片复制一张,对这两张图片这样处理。一张:除要显示的位置以外的区域用黑色填充,另一张:把要显示的位置用黑色填充,其余区域用白色填充。完了之后就可以用bitbit显示了。
HBITMAP pic1;
HBITMAP pic2;
///导入图片(这里也可以加入到资源里用LoadBitmap(hInst, MAKEINTRESOURCE(ID号));)
pic1 = (HBITMAP)LoadImage(NULL, "图片1位置", IMAGE_BITMAP, 图片长, 图片宽
, LR_LOADFROMFILE);
pic2 = (HBITMAP)LoadImage(NULL, "图片2位置", IMAGE_BITMAP, 图片长, 图片宽
, LR_LOADFROMFILE);

HDC mapdc;
HDC buffdc;
HDC hdc;

hdc = GetDC(hWnd);
mapdc = CreateCompatibleDC(hdc);
buffdc = CreateCompatibleDC(hdc);
SelectObject(buffdc , pic1);
BitBlt(mapdc, 0, 0, 图片长, 图片宽, buffdc, 0, 0, SRCAND);
SelectObject(buffdc , pic2);
BitBlt(mapdc, 0, 0, 图片长, 图片宽, buffdc, 0, 0, SRCPAINT);
///
BitBlt(hdc, 0, 0, 图片长, 图片宽, mapdc, 0, 0, SRCPAINT);


试试效果吧,透明效果搞定,双缓冲搞定,加载图片时不要加反了哈,反了可达不到效果哦。~_~

不知道是不是LZ想要的。。。。


xg198804 2009-11-18
  • 打赏
  • 举报
回复
不好意思,PNG格式的我也没试过,不过照理论上说,只要PNG图像能够被解析能够被载入到内存绘图表面,那应该就可以进行位块传输,你可以一试。
gameice 2009-11-18
  • 打赏
  • 举报
回复
谢谢2楼的回答

BitBlt(hWndDC,0,0,800,600,bufferDC,0,0,SRCCOPY);

如果我把png图像加载进了缓冲区DC,并且在上面画了出来 ,然后我再用Bitbit 把缓冲区DC复制到DC上 , png可以被复制吗?
gameice 2009-11-18
  • 打赏
  • 举报
回复
你的意思是AlphaBlend吧? 那png的话没有办法实现吗?
xg198804 2009-11-18
  • 打赏
  • 举报
回复
GDI+是支持PNG图像格式的。所谓双缓存是指在绘图之前先在内存中创建一块虚拟的绘图表面(相当于画布),也就是位图绘图表面,然后把要进行的图形图像操作都在这个内存位图绘图表面上进行,把所有的图形图像操作都做完了之后再用位块传输函数BitBlt一次性的把源绘图表面(即在内存中创建的虚拟绘图表面)调到目的绘图表面(即显示屏幕)上来显示。用这种方法可以克服频繁重绘时所引起的屏幕闪烁,而且效率相当高。知道了这个过程后,楼主可以先创建一个内存位图绘图表面,然后再把所要载入的图片载入到这个内存绘图表面来,需要的话还可以对这个载入的图片进行操作,比如缩放,旋转,在这个图片上再进行一些给图操作都可以,对图片的所有操作都进行完了之后再,再用BitBlt函数进行位块传输即可。
icefairy 2009-11-18
  • 打赏
  • 举报
回复
可以调用bmp图片 然后在 透明处理下
有函数可以做透明处理 只要背景色是单色就行

19,472

社区成员

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

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