社区
图形处理/算法
帖子详情
求教!关于双缓冲和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
打赏
收藏
求教!关于双缓冲和Bitbit
用双缓冲的话 BitBlt 是不是不支持png图像从缓冲DC复制到DC? 那该怎么处理啊? 一开始我用GDI+的方式操作,但是显示不出图像.后来 我试着用atlimage.h里的 CImage cimg; cimg.Load(fileName); HBITMAP hbmp=cimg.Detach(); 这样据说可以像操作 BMP 图片一样处理图片 读是读出来了,可那样得到的是一个不具有透明通道的bmp图像,也就是说还是没办法正常使用 win32应用
复制链接
扫一扫
分享
转发到动态
举报
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图片 然后在 透明处理下
有函数可以做透明处理 只要背景色是单色就行
2021 Java面试真题集锦
目录 … 1 大厂面试的基本流程 17 字节跳动 17 阿里 17 腾讯 18 网易游戏 18 面试前需要准备: 18 面试中可以借鉴的套路 19 用简历争取到更多的面试机会 19 自我介绍时,立即全面抛出技术栈和亮点 20 先介绍项目背景,打消面试官疑问 21 通过说项目管理工具,说明你不仅会写代码 22 用 SPRING BOOT 项目举例,说明你的技术基本面 23 用实例说明你在内存调优方面的经验 24 展示你在数据库调优方面的经验 25 总结前文说辞 26 准备项目说辞时,更可以准备后继面试官的问
CAN总线学习:zlg关于can帖子汇总
很值得看看 zlg关于can帖子汇总 SJA1000的常用标准波特率设置,为什么基本上都是单次采样?即使是低速的时候也是这样的,既然TSEG1的设置周期都很大,比如都大于10了,为什么不让他采样三次呢? 答: 是不好理解,但那是CiA推荐的值。用51系列芯片和两个SJA1000接口还要外扩一个RAM,请问51的ALE能否同时与三个芯片的ALE管脚相连(地址不同)? 有哪位高手做过双SJA1000
CAN总线学习心得:zlg关于can帖子汇总【转】【强烈推荐】
很值得看看 zlg关于can帖子汇总 SJA1000的常用标准波特率设置,为什么基本上都是单次采样?即使是低速的时候也是这样的,既然TSEG1的设置周期都很大,比如都大于10了,为什么不让他采样三次呢? 答: 是不好理解,但那是CiA推荐的值。 用51系列芯片和两个SJA1000接口还要外扩一个RAM,请问51的ALE能否同时与三个芯片的ALE管脚相连(地址不同)? 有哪
[译]NeHe教程 - 创建一个OpenGL窗体
原文:Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的OpenGL硬件加速驱动的时候.我马上意识到我必须学习OpenGL.不幸的是,当时在网上很难找到关于OpenGL的书和资料.我花了数小时来编写可运行的代码,并且花了更多时间去发邮件和在IRC上...
关于linux交换分区大小的问题
有点看不懂,先转来,日后慢慢研究 [精华] 关于linux交换分区大小的问题 http://www.chinaunix.net 作者:wangrujun发表于:2008-08-04 17:44:50 【发表评论】【查看原文】【Linux讨论区】【关闭】 我在debian和fedora的文档中,都...
图形处理/算法
19,472
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章