📄 2.2.+
字号:
----------------------------------------------------------------------
2.2 灰度图类 TCnByteMap
----------------------------------------------------------------------
by 与月共舞(yygw@163.com) 2002.06.01
2.2.1 功能介绍
--------------
TCnByteMap 为 8 位不带调色板的灰度位图类。取名为 ByteMap,是因为它的图
像数据为一张 Byte 类型的映象图。TCnByteMap 从 TCnGraphic 中派生而来。
TCnByteMap 不带调色板,并不设计用来表示彩色图像,它的主要用途有:
* 存储 256 级灰度的位图图像。
* 存储彩色图像中 R、G、B、Alpha 等单一通道的数据。
* 在平滑字体绘制中使用。
* 用在图像分析、模式识别等应用中。
* 用来表示二值图像。
2.2.2 数据存储
--------------
与操作系统的位图兼容,TCnByteMap 中扫描线的实际存储长度也是按 4 字节对
齐的,RowInc 属性即扫描线的存储长度,计算公式为:
RowInc := (Width + 3) div 4 * 4;
Gap := RowInc - Width;
图像数据块的大小为:
Size := RowInc * Height;
在 DoSetSize 方法的实现中,计算以上参数,分配内存。
图像数据按扫描线从上到下(Top-Down)进行存储,如果需要使用 GDI 功能时,
注意 TBitmapInfoHeader.biHeight 应该为负值。
TCnByteMap 覆盖了 UseBuff 和 FreeBuff 方法以实现内部缓冲区操作。
2.2.3 快速的扫描线和象素访问
----------------------------
除了从 TCnGraphic 中继承来的数据访问方式,TCnByteMap 中还提供了另一种
基于扫描线数组的方法以支持随机象素访问。
为了快速地访问每一行扫描线地址和象素,定义
PCnByteLines = ^TCnByteLines;
TCnByteLines = array[0..65535] of PByteArray;
TByteMap 中定义了两个只读的扫描线数组指针属性:
* property XScanLine: PCnByteLines read FScanLine;
图像数据扫描线地址数组
* property XScanBuff: PCnByteLines read FScanBuff;
内部缓冲区扫描线地址数组
在分配图像数据内存后,为扫描线数组指针分配数组内存,并计算每行扫描线的
地址赋值给数组元素。
这种方法可以实现用一条汇编指令取扫描线地址,二条指令访问象素的速度:
注:以下的代码中省略了数组指针后面的 ^ (由 Delphi 支持)
* PLine := Bmp.XScanLine[y];
获得图像扫描线 y 的地址(PByteArray类型)
* AByte := Bmp.XScanLine[y][x];
取图像坐标为(x, y)点象素的值(Byte类型)
* AByte := Bmp.XScanLine[y, x];
取图像坐标为(x, y)点象素的值(不推荐)
* Bmp.XScanLine[y][x] := AByte;
设图像坐标为(x, y)点象素的值
* PAByte := @Bmp.XScanLine[y][x];
取图像坐标为(x, y)点象素的地址
* PAByte := @Bmp.XScanLine[y, x];
取图像坐标为(x, y)点象素的地址(不推荐)
需要注意的是,这些直接数据访问方式是没有范围检测保护的,请小心使用。
2.2.4 带范围检查的数据访问
--------------------------
除了以上的象素访问方式,TCnByteMap 还提供了常规访问方法:
* property ScanLine[Row: Integer]: PByteArray;
扫描线地址数组属性。如果位图为空或范围超限,将出现异常,只读属性。
* property ScanBuff[Row: Integer]: PByteArray;
缓冲区扫描线地址数组属性,如果位图或缓冲区为空或范围超限,将出现异
常,只读属性。
* property Pixels[x, y: Integer]: Byte;
位图象素属性。如果位图为空或范围超限,将出现异常,支持读写访问。
虽然增加了范围检查,但它们的运行速度仍然比 TBitmap、TCanvas 中的方法快
很多。
2.2.5 数据交换接口
------------------
TCnByteMap 覆盖 AssignTo 和 Assign 方法,支持与以下类型的对象赋值:
* 赋 nil 值清除当前位图数据。
* 与 TCnByteMap 对象相互赋值。
* 与其它的 TCnGraphic 对象相互赋值。
从 RGB 位图中取数据时使用以下公式计算灰度值:
Gray := Red * 0.30 + Green * 0.59 + Blue * 0.11
* 与 TGraphic 图像相互赋值。
* 与 TPicture 相互赋值。
TCnByteMap 实现了 LoadFromStream 和 SaveToStream 方法,使用自己的格式
定义图像数据。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -