前言:
学习笔记,随时更新。如有谬误,欢迎指正。
说明:
- 红色字体为较为重要部分。
- 绿色字体为个人理解部分。
原文链接:https://learn.microsoft.com/en-us/windows/win32/gdi/bitmaps
Microsoft Windows 的图形设备接口( Graphics Device Interface, GDI )使应用程序能够在显示设备上展示图形和格式化文本。基于 Windows 的应用程序不直接访问图形硬件,GDI 代表应用程序与设备驱动程序进行交互。
1 位图
- 位图是一种图形对象,用于创建、操作(缩放、滚动、旋转和绘制)图像,并可以将图像作为文件存储在磁盘上。
1.1 关于位图
-
位图是 GDI 对象之一,可以选择到设备上下文( Device contexts, DC )中。设备上下文是定义一组图形对象及其相关属性和影响输出的图形模式的结构。下表描述了可以被选择到设备上下文中的 GDI 对象类型。
GDI 对象 描述 位图( Bitmaps ) 创建、操作(缩放、滚动、旋转和绘制)图像,并将图像作为文件存储在磁盘上。 画刷( Brushes ) 绘制多边形、椭圆和路径的内部。 字体( Fonts ) 在输出设备上绘制文本 逻辑调色板( Logical Palette ) 由应用程序创建并与给定设备上下文相关联的调色板。 路径( Paths ) 形状或轮廓。 笔( Pens ) 应用程序用来绘制直线和曲线的图形工具。 区域( Regions ) 可以被填充、绘制、反转等,并可以用于执行命中测试(测试光标位置)的封闭形状。
1.1.1 位图分类
-
设备无关位图( Device-independent bitmaps, DIB ):使用一个应用程序创建的位图图形可以加载并显示在另一个应用程序中,同时保留与原始应用程序相同的外观。
-
设备依赖位图( Device-dependent bitmaps, DDB ):也被称为 GDI 位图,是 16 位 Windows 早期版本( 3.0 版本之前)中唯一可用的位图。有更好的 GDI 性能,但随着技术的发展,它有很多缺陷。
1.1.2 位图数据结构类型
-
位图有四种基本数据结构类型: BITMAPCOREHEADER 、 BITMAPINFOHEADER 、
BITMAPV4HEADER 、 BITMAPV5HEADER ,类型由每个结构中的第一个成员 Size 来区分。 -
BITMAPV5HEADER 是 BITMAPV4HEADER 的扩展结构,他们都是 BITMAPINFOHEADER 的扩展结构。
-
BITMAPCOREHEADER 和 BITMAPV4HEADER 格式已分别被 BITMAPINFOHEADER 和 BITMAPV5HEADER 格式取代。 BITMAPCOREHEADER 和 BITMAPV4HEADER 格式的存在是为了保持完整性和向后兼容性。
-
DIB 的格式如下(有关详细信息,请参阅位图存储):
1.1.3 特定位图函数和结构的 JPEG 和 PNG 扩展
-
在某些版本的 Microsoft Windows 上, StretchDIBits 和 SetDIBitsToDevice 函数允许 JPEG 和 PNG 图像作为源图像传递到打印机设备。这个扩展不是为了给应用程序提供一般的 JPEG 和 PNG 解压缩,而是允许应用程序将 JPEG 和 PNG 压缩的图像直接发送到硬件支持 JPEG 和 PNG 图像的打印机。
BITMAPINFOHEADER 、 BITMAPV4HEADER 和 BITMAPV5HEADER 结构被扩展到允许指定双压缩值( biCompression ),来表明位图数据是 JPEG 或 PNG 图像。当 hdc 参数指定打印机设备时,这些压缩值仅对 SetDIBitsToDevice 和 StretchDIBits 有效。为了支持打印机的元文件假脱机,应用程序不应该依赖返回值来确定设备是否支持 JPEG 或 PNG 文件。在调用 SetDIBitsToDevice 和 StretchDIBits 之前,应用程序必须发出 QUERYESCSUPPORT 和相应的转义。如果验证转义失败,那么应用程序必须依靠自己的 JPEG 或 PNG 支持来将图像解压缩为位图。
1.1.4 位图、设备上下文和绘图面
-
设备上下文( DC )是一种数据结构,它定义了图形对象、它们的相关属性以及影响设备输出的图形模式。要创建 DC ,请调用 CreateDC 函数;要获取 DC ,请调用 GetDC 函数。
-
在返回标识该 DC 的句柄之前,系统选择一个绘制面到 DC 中。如果应用程序调用 CreateDC 函数为 VGA 显示创建设备上下文,则该绘制面的尺寸为 640 × 480 像素。如果应用程序调用 GetDC 函数,则尺寸反映客户端区域的大小。
-
在应用程序开始绘制之前,它必须通过调用 SelectObject 函数选择具有适当宽度和高度的位图到 DC 中。当应用程序将 DC 句柄传递到某 GDI 绘制函数时,所想要的输出(画面)将显示在 DC中所选择的绘制面上。
-
有关详细信息,请参阅内存设备上下文。
1.1.5 位图创建
-
创建位图使用 CreateBitmap 或 CreateBitmapIndirect 或 CreateCompatibleBitmap 或 CreateDIBitmap 和 CreateDiscardableBitmap 函数。
-
创建位图后,无法更改其大小、颜色平面数或标识颜色所需的位数。
-
如果不再需要位图,请调用 DeleteObject 函数将其删除。
1.1.6 位图旋转
- 要将位图复制到平行四边形中,使用 PlgBlt 函数,它执行从源设备上下文中的矩形到目标设备上下文中的平行四边形的位块传输。要旋转位图,应用程序必须以世界单位来提供用于平行四边形各角的坐标。(有关旋转和世界单位的更多信息,请参阅坐标空间和变换。)
1.1.7 位图缩放
- StretchBlt 函数通过执行从源设备上下文中的矩形到目标设备上下文中的矩形的位块传输来缩放位图。然而,与 BitBlt 函数不同的是, BitBlt 在目标矩形中直接复制源矩形的尺寸, StretchBlt 允许应用程序指定源矩形和目标矩形的尺寸。当目标位图小于源位图时,系统将位图中的行或列(或两者)颜色数据合并,然后在显示设备上呈现相应的图像。系统根据指定的拉伸模式组合颜色数据,应用程序通过调用 SetStretchBltMode 函数来定义拉伸模式。当目标位图大于源位图时,系统相应地缩放或放大生成图像中的每个像素。
1.1.8 位图作为画刷
-
许多函数使用当前选择到设备上下文中的刷画来执行位图操作。例如, PatBlt 函数在窗口内的矩形区域复制画刷,而 FloodFill 函数在指定颜色边界的窗口区域内复制画刷(与 PatBlt 不同, FloodFill 填充非矩形形状)。
FloodFill 函数在指定颜色的区域内复制画刷。然而,与 PatBlt 函数不同的是, FloodFill 不会将画刷的颜色数据与显示器上像素的颜色数据结合起来;它只是将显示器上封闭区域内所有像素的颜色设置为当前选择到设备上下文中的画刷的颜色。
1.1.9 位图存储
- 图应保存在使用已建立的位图文件格式的文件中,并以三个字符的 .bmp 扩展名命名。已建立的位图文件格式由 BITMAPFILEHEADER 结构和 BITMAPINFOHEADER 或 BITMAPV4HEADER 或 BITMAPV5HEADER结构(三者之一)组成。 RGBQUAD 结构数组(也称为颜色表)紧随其后。颜色表后面是颜色表索引数组(实际的位图数据)。
1.1.10 位图压缩
-
Windows 支持用每像素 8 位或 4 位来定义颜色的位图压缩格式。压缩减少了位图所需的磁盘和内存存储。
-
当位图信息结构的 bxxxCompression 成员为 BI_RLE8 时,使用 RLE 格式压缩 8 位位图。此格式可以以编码或绝对模式进行压缩。
-
当位图信息结构的 bxxxCompression 成员为 BI_RLE4 时,将使用 4 位位图的运行长度编码格式压缩位图,该格式也使用编码模式和绝对模式。
1.1.11 Alpha 混合
-
Alpha 混合用于显示 alpha 位图,它是具有透明或半透明像素的位图。除了红、绿、蓝三色通道外, alpha 位图中的每个像素都有一个称为 alpha 通道的透明度组件。 alpha 通道通常包含与颜色通道一样多的位。
-
通过调用引用 BLENDFUNCTION 结构的 AlphaBlend 来调用 Alpha 混合机制。
-
有关示例,请参阅 Alpha 混合位图。
1.1.12 平滑着色
-
平滑着色是一种用颜色梯度对区域进行着色的方法(产生颜色渐变效果)。
-
使用 GradientFill 来实现平滑着色效果。 GradientFill 使用 TRIVERTEX 、 GRADIENT_RECT 和 GRADIENT_TRIANGLE 结构。
-
有关示例,请参阅绘制着色三角形。
1.1.13 已启用 ICM 的位图函数
-
尽管设备之间的成像技术和色彩功能存在差异, Microsoft 的图像颜色管理( Image Color Management, ICM )也能确保彩色图像、图形对象或文本对象在任何设备上的呈现尽可能接近其原始意图。在任何设备上, ICM 2.0 都有助于保持颜色的一致性和准确性。有关 ICM 的详细信息,请参阅 Windows 颜色系统。
-
以下位图函数启用了对 ICM 的支持: BitBlt 、 CreateDIBitmap 、CreateDIBSection 、 MaskBlt 、 SetDIBColorTable 、 StretchBlt 、 SetDIBits 、 SetDIBitsToDevice 、 StretchDIBits 。
1.2 使用位图
1.2.1 捕获图像
- 详细信息,请参考捕获图像。
1.2.2 缩放图像
- 详细信息,请参考缩放图像。
1.2.3 存储图像
- 详细信息,请参考存储图像。
1.2.4 Alpha 混合位图
- 详细信息,请参考 Alpha 混合位图。
1.2.5 绘制着色矩形
- 详细信息,请参考绘制着色矩形。
1.2.6 绘制着色三角形
- 详细信息,请参考绘制着色三角形。
1.2.7 测试打印机是否支持 JPEG 或 PNG
- 详细信息,请参考测试打印机是否支持 JPEG 或 PNG 。
1.2.8 调整 JPEG 或 PNG 图像的大小
- 详细信息,请参考调整 JPEG 或 PNG 图像的大小。
1.3 位图参考
1.3.1 位图函数
- 详细信息,请参考位图函数。
1.3.2 位图结构体
- 详细信息,请参考位图结构体。
1.3.3 位图宏
- 详细信息,请参考位图宏。