windows图形编程笔记

来源:互联网 发布:Mac mysql导入sql文件 编辑:程序博客网 时间:2024/05/22 05:33

位图和BitBlt


1.DDB,设备相关位图,每个像素的组成位本身便指示一种颜色的编号,这种颜色编号由显卡定义, 或者说颜色对照表由显卡定义, 这就是设备依赖性.
2.BitBlt和StrenchBlt的最后一个参数, 位映像模式, 指示如何操纵源位图(Source), 目标位图(Destination), DC的当前画刷(Pattern).不同的参数值代表的是某种三者的位运算.
3.创建了一个GDI对象, GDI必然开辟一块内存存放信息, 但是应用程序不能直接引用这块内存, 只能通过句柄访问.DeleteObject便是清除这块内存.
4.假如某个位图每像素含有PixelNum个位, 有PlaneNum个位面, 则每个位面的字节数是(cx*PixelNum)/8, 整个位图的字节数是((cx*PixelNum)/8)*PlaneNum, 设备的位面PlaneNum的值可以通过GetDeviceCaps获取, 显然这个函数的使用很麻烦, 为此使用CreateCompatibleBitmap默认采用当前设备的像素位数和位面值来创建位图. DIB中位面始终是1.
5.设备内容指的是特殊的图形输出设备(例如视讯显示器或者打印机)及其设备驱动程序
6.1位/8位/16位的DIB文件中本身包含色彩对照表, 每个像素的"位组合"是"颜色对照表"的一个索引. 24位的DIB文件不包含颜色对照表
而是每24位的3个字节代表了红/绿/蓝的颜色值.
7.灰阶: 颜色的深度, 比如红色, 有深红色/粉红色/浅红色......
8.DIB分为"灰阶DIB(gray shades)"和"调色板DIB(palletized color)", 灰阶DIB就是只使用部分颜色, 而且R/G/B的值是一样的, 比如
对于8位DIB, 按理说可以支持256种颜色, 如果设置biClrUsed=64, 则只使用其中的64种: 00-00-00 04-04-04 08-08-08...; 调色板
DIB, 其颜色值对应于调色板.
9.设备无关性, 实际上关键是在于显卡驱动, 显卡驱动会把DIB每个像素的颜色值的位表示转换为自己的颜色值的位表示
10.DIB是一个文件或内存块, 而DDB是一个GDI对象只能通过句柄访问.
11.CreateDIBitmap应该叫做CreateDDBitmap; CreateDIBSection应该叫做CreateDIBitmap

单色,则每个像素需要1位

16色,则每个像素需要4位
256色,则每个像素需要8位
真彩色,则每个像素有24位

位面

早期的时候,由于CPU地址总线位数的限制,使得CPU无法一次读取显卡的内容(如20位地址总线,一次只能读1k,而1024*768、256色的显卡有768K),于是显卡厂商就给显存分成了数个区域,这些区域就称作位面。每个像素点的位分布在不同的位面里,CPU在显示这个像素的时候,需要把所有位面读一遍。


像素

“The value of each pixel in the bitmap indicates the average color of the image within a unit of this grid”,可以这么理解,像素就是颜色,它的值指明了它代表的这一小块区域的颜色


DDB和DIB

DDB(设备相关位图)是Windows最早的用于表示图像的方式,它是GDI对象的一种,分为单色位图或者是与某种特定设备相联系的位图(如每个像素占几位/多少种颜色等)

DIB(设备无关位图)是Windows后来发明的一种图像格式,后缀名为.bmp,简单的说,DIB可以认为是说的一个图像文件。DIB不是GDI对象,因此也不能为它创建句柄。

原创粉丝点击