【MFC图片显示】MFC的位图显示

HBitMap是位图句柄或者是位图文件描述符(指向BITMAP结构),CBitMap是位图类(包括BITMAP信息和操作方法),BITMAP是位图结构类型(位图文件具体数据)
三者可相互转换。
bitmap.Attach(hBitmap);//由HBITMAP 得到关联的CBitmap
bitmap.GetBitmap(&bm); // 由CBitmap 得到关联的BITMAP 
hBitmap=(HBITMAP)bitmap.GetSafeHandle();//由CBitmap得到相关的HBITMAP

windows不建议用户直接操作具体数据,所以封装了类的方法或者提供句柄参数供一些api使用来操作BITMAP结构中的数据,当转换为BITMAP时,用户就可以根据需要自定义处理函数(比如读出位图颜色表以制定调色板)。

       在Windows中,应用程序是通过一个或多个逻辑调色板来使用系统调色板(物理调色板)。在256色系统调色板中,Windows保留了20种颜色作为静态颜色,这些颜色用作显示Windows界面,应用程序一般不能改变。缺省的系统调色板只包含这20种静态颜色,调色板的其它项为空。应用程序要想使用新的颜色,必须将包含有所需颜色的逻辑调色板实现到系统调色板中。在实现过程中,Windows首先将逻辑调色板中的项与系统调色板中的项作完全匹配,对于逻辑调色板中不能完全匹配的项,Windows将其加入到系统调色板的空白项中,系统调色板总共有236个空白项可供使用,若系统调色板已满,则Windows将逻辑调色板的剩余项匹配到系统调色板中尽可能接近的颜色上。
  每个设备上下文都拥有一个逻辑调色板,缺省的逻辑调色板只有20种保留颜色,如果要使用新的颜色,则应该创建一个新的逻辑调色板并将其选入到设备上下文中。但光这样还不能使用新颜色,程序 只有把设备上下文中的逻辑调色板实现到系统调色板中,新的颜色才能实现。在逻辑调色板被实现到系统调色板时,Windows会建立一个调色板映射表。 当设备上下文用逻辑调色板中的颜色绘图时,GDI绘图函数会查询调色板映射表以把像素值从逻辑调色板的索引转换成系统调色板的索引,这样当像素被输出到视频内存中时就具有了正确的颜色值。
在win os中存在三种调色板,,硬件调色板,逻辑调色板,系统调色板,winos用"调色板管理器"机制来管理调色板,调色板存在于一个位图文件中,一个窗体的DC中,或OS中,硬件调色板就是显卡适配器所能实际表达的颜色深度,逻辑调色板就是winos通过调色板管理机制为每个窗体应用程序DC分配的调色板(系统调色板只有一个,而逻辑调色板可以有多个,它的本质就是一块内存中的区域用于描述当前应用使用到的调色板,我们都知道调色板是一个结构),所以逻辑调色板的用途在于模拟硬件调色板,以使windows作为一个os可以为界面显示,图像显示等应用提供它们各自专用的活动的调色板,当逻辑调色板色深小于或大小硬件调色板时,winos通过调色板管理机制自动让二者谐和,系统调色板就是winos当前正在使用到的调色板,逻辑调色板可以通过调色板管理机制转变为当前系统调色板,但是不管winos的调色板管理机制如何,最终的调色板都要靠硬件调色板来实现
我的理解:一个客户区可以有多个逻辑调色板,根据位图位深选择CreatePalette(手动填写色板表)或者CreateHalftonePalette(系统自动建立)创建逻辑调色板,通过SelectPalette选择指定的逻辑调色板到一个设备环境中,RealizePalette从当前逻辑调色板中映射调色板入口点到系统调色板中(调色板修改后,无法直接产生效果,必须调用realize,使最终颜色映射到系统调色板里( 因为最终用来画图的是系统调色板里的颜色,而不是逻辑调色板),随后调用InvalidateRect对客户区重绘,会将逻辑调色板映射到硬件调色板中去。
由此,可以知道,位深为8位以下的位图才使用调色板,超过8位会直接使用rgb格式存储位图像素数据,系统支持16、24、32位位图。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值