像素格式
当通过
Screen或
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中,通过的颜色值是
And,例如
&hFF.
关于透明度的注意事项
对于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像素的大小。实际的像素数据跟随标题,并且被压缩成一排像素;不考虑数据对齐。然后可以使用公式计算块的最终大小:
size = 4 + ( width * height * bytes_per_pixel )
新风格块头由32个字节组成。第一个双字(32位)必须等于值7,允许GfxLib识别新类型的块。第二个双字包含每像素一个字节的图像颜色深度。第三和第四个dwords分别包含图像的宽度和高度,有效地消除了旧式图像块执行的图像大小限制。第五个双字包含以字节为单位的像素行间距;这告诉图像中一行像素占用多少字节。新风格块中的节距始终填充为16的倍数,以允许像素的行数据在段落边界上对齐。标题的剩余3个双字(总共12个字节)目前未使用并保留供将来使用。图像的最终大小是:
size = 32 + ( ( ( ( width * bytes_per_pixel ) + &hF ) and not &hF ) * height )
由
ImageCreate和
Get创建的图片格式取决于所使用的方言。在
-lang fb 方言中,将使用新样式标题创建图像。在
-lang fblite 和
-lang qb 方言中,将创建旧样式的图像标题。
所有图形图元都可以使用旧样式和新样式的图像块。为了方便访问图像信息,
ImageInfo可用于获取图像缓冲区的有用属性,例如其尺寸,颜色深度,间距和指向像素数据的指针 - 无论使用哪种格式。
也可以直接访问图像头来访问此信息。有关获取标题结构的更多信息,请参阅
这个例子.
参考