内部图形格式
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=GfxInternalFormats
- 最后更新: 2023-07-09
FreeBASIC 用于表示图形的内部格式信息。
像素格式
通过 Screen (Graphics) 或 ScreenRes 函数设置图形模式时,GfxLib 还会在标准系统内存中创建帧缓冲区,并为该模式设置适当的内部像素格式。基本上有三种内部像素格式,根据屏幕颜色深度选择,如下表所述:
| 屏幕颜色深度 | 内部每像素字节数 | 范围位掩码 | 像素格式 |
|---|---|---|---|
| 1bpp | 1 | &h1 | 调色板颜色索引 |
| 2bpp | 1 | &h3 | 调色板颜色索引 |
| 4bpp | 1 | &hF | 调色板颜色索引 |
| 8bpp | 1 | &hFF | 调色板颜色索引 |
| 15/16bpp | 2 | &hFFFF | RRRRRGGGGGGBBBBB |
| 24/32bpp | 4 | &hFFFFFFFF | AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB |
所有绘图操作都在此 RAM 帧缓冲区上执行;当需要更新实际显示时,GfxLib 会将帧缓冲区的内容复制到真实显示内存,并在此过程中自动将当前内部像素格式转换为真实显示所使用的像素格式。通过将内部像素格式限制为 3 种,该库使您无需处理繁多的真实显示格式。
颜色值
调用接受颜色参数的图形基元时,可以通过两种方式指定颜色。在 8bpp 或更低模式下,颜色值必须是当前调色板中的直接 8 位颜色索引,这与这些模式的内部像素格式相匹配。在更高颜色深度下,颜色值应始终采用 &hAARRGGBB 的形式。这是 RGB 和 RGBA 宏返回的值,等同于 24/32bpp 内部像素格式表示。如果当前颜色深度为 24 或 32bpp,这意味着颜色值将原样传入。如果使用 15/16bpp 模式,每个基元内部会自动将颜色从 &hAARRGGBB 形式转换为 RRRRRGGGGGGBBBBB 内部像素格式(注意在此过程中 alpha 通道会丢失,因为 15/16bpp 模式不支持它)。一旦颜色值采用三种像素格式之一,基元会使用位与 And 操作和范围位掩码将其范围限制为当前颜色深度支持的范围。例如在 8bpp 模式下,传入的颜色值会与 &hFF 进行 And 运算。
透明度说明
对于 8bpp 或更低模式,颜色索引 0 始终被视为支持透明度的 Put 模式的透明色。对于更高颜色深度,RGB(255, 0, 255) 始终表示透明色。在 15/16bpp 模式下,这转换为内部值 &hF81F,而在 24/32bpp 模式下则变为 &hFFFF00FF。请注意,在 24/32bpp 模式下,Put 通过仅查看颜色值的红色、绿色和蓝色分量来识别透明色,而 alpha 值可以是任意值。这意味着在 24/32bpp 模式下,例如 &h00FF00FF、&h10FF00FF、&hABFF00FF 和 &hFFFF00FF 都代表透明色,因为低 24 位始终是 &hFF00FF。
缓冲区格式
在 FreeBASIC 中,图像可以作为数组(如 QB 中)或指针使用。无论哪种方式,图像数据都包含在一个连续的内存块中。该块由头部和图像数据组成。头部可以是两种类型(旧式和新式),并决定后续图像数据的格式。
旧式块头部由 4 个字节(32 位,即 4 字节)组成。前 3 位包含图像颜色深度(以每像素字节数表示,8 位颜色深度→1;16 位颜色深度→2;32 位颜色深度→4)。接下来的 13 位包含图像宽度。最后 16 位包含图像高度。请注意,头部的固有性质仅允许最大 8191 * 65535 像素的尺寸:
start GeSHi
' inside FB namespace (extracted from fbgfx.bi)
Type _OLD_HEADER Field = 1
bpp : 3 As UShort
Width : 13 As UShort
height As UShort
End Typeend GeSHi
实际像素数据紧随头部之后,一行像素接一行像素紧凑排列;不假设数据对齐。
块的最终大小可以用以下公式计算:
size = 4 + ( width * height * bytes_per_pixel )
新式块头部由 32 字节组成。第一个双字(32 位)必须等于值 7,使 GfxLib 能够识别新类型的块。第二个双字包含图像颜色深度(以每像素字节数表示)。第三和第四个双字分别包含图像宽度和高度,有效消除了旧式图像块强制的图像大小限制。第五个双字包含以字节为单位的像素行间距;这表示图像中一行像素占用多少字节。新式块中的间距始终填充为 16 的倍数,以允许像素行数据在段边界上对齐。头部其余 3 个双字(共 12 字节)目前未使用,保留供将来使用:
start GeSHi
' inside FB namespace (extracted from fbgfx.bi)
Type IMAGE Field = 1 '' in FB namespace
Union
old As _OLD_HEADER
Type As ulong
End Union
bpp As Long
Width As ulong
height As ulong
pitch As ulong
_reserved(1 To 12) As UByte
End Typeend GeSHi
图像的最终大小为:
size = 32 + ( ( ( ( width * bytes_per_pixel ) + &hF ) and not &hF ) * height )
ImageCreate 和 Get 创建的图像格式取决于所使用的方言。在 -lang fb 方言中,图像将使用新式头部创建。在 -lang fblite 和 -lang qb 方言中,将创建旧式图像头部。
所有图形基元都可以处理旧式和新式图像块。为方便访问图像信息,可以使用 ImageInfo 获取图像缓冲区的有用属性——例如其尺寸、颜色深度、间距以及指向像素数据的指针——无论使用哪种格式。
也可以直接访问图像头部来获取此信息。有关访问头部结构的更多信息,请参阅此示例。
参见
Screen (Graphics)ScreenResGet (Graphics)Put (Graphics)ImageCreateImageInfoTransAlpha
返回 程序员指南
返回 目录