⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2.2.+

📁 1、CnPack是一个Delphi第三方开发包
💻 +
字号:
----------------------------------------------------------------------
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 + -