Difference between revisions of "BGRABitmap/zh CN"

From Lazarus wiki
Jump to navigationJump to search
Line 77: Line 77:
 
* 圆角矩形
 
* 圆角矩形
 
* 带透明特性的文本
 
* 带透明特性的文本
 +
 +
===使用Canvas绘图===
 +
 +
It is possible to draw with a ''Canvas'' object, with usual functions but without antialiasing. Opacity of drawing is defined by the ''CanvasOpacity'' property. This way is slower because it needs image transformations. If you can, use CanvasBGRA instead, which allows transparency and antialiasing while having the same function names as with TCanvas.

Revision as of 16:26, 4 April 2015

说明

BGRABitmap 是一个用来创建和更改透明图像(具有alpha 通道)的单元集. 直接像素访问允许进行快速的图像处理. 这个库已在 Windows, Ubuntu 和 Mac OS X 平台测试通过(最后的版本不能在 Mac平台工作), 以及各平台的小部件集 win32, gtk1, gtk2 和 carbon.

其中主要的类是 TBGRABitmap, 派生自 TFPCustomImage. 还有一个类 TBGRAPtrBitmap 允许编辑已经分配的 BGRA 数据. 每个像素的格式包括4个字节 (顺序为 蓝, 绿, 红 和 alpha.

使用 BGRABitmap

教程

概述

为了便于理解,函数的命名比较长. 其中的任何功能如函数或使用TBGRABitmap对象的属性都是容易理解的. 例如, 你可以使用CanvasBGRA作为画布,这和TCanvas类似 (但具有透明度和反锯齿),并且可以使用Canvas2D来实现类似 HTML canvas的一些功能.

一些特定的功能需要依赖一些单元的引用, 但你可能不需要使用它们 :

  • TBGRAMultishapeFiller 实现多边形的反锯齿节点(交叉点),在 BGRAPolygon 单元中
  • TBGRATextEffect 在 BGRATextFX 单元中
  • 2D 转换在 BGRATransform 单元中
  • TBGRAScene3D 在 BGRAScene3D 单元中
  • 如果你需要用到层, BGRALayers 单元提供了 TBGRALayeredBitmap

双缓冲并不包含在 BGRABitmap 单元中, 因为其更多的是关于如何处理窗口. 如果要使用双缓冲技术, 你可以使用 TBGRAVirtualScreen ,包含在 BGRAControls 组件包中. 此外, BGRABitmap中双缓冲和其它任何缓冲用法一样. 你需要一个位图来存储你的绘图,然后使用一条绘图指令将其显示出来.

简单示例

你必须在你的工程中引用 BGRABitmap 单元:

Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;

单元 BGRABitmapTypes 包含所有必要的定义, 对于仅仅加载和显示位图,可以只声明引用 BGRABitmap. 然后, 首先创建一个 TBGRABitmap 对象:

var bmp: TBGRABitmap;
begin
  bmp := TBGRABitmap.Create(100,100,BGRABlack); //creates a 100x100 pixels image with black background

  bmp.FillRect(20,20,60,60,BGRAWhite, dmSet); //draws a white square without transparency
  bmp.FillRect(40,40,80,80,BGRA(0,0,255,128), dmDrawWithTransparency); //draws a transparent blue square
end;

最后显示位图:

procedure TFMain.FormPaint(Sender: TObject);
begin
  bmp.Draw(Canvas, 0, 0, True); // draw the bitmap in opaque mode (faster)
end;

概念

位图中带有透明特性的像素被保存为4个值, 这里是4个字节,其顺序为 蓝, 绿, 红, Alpha. 最后一个通道定义了透明度 (0 代表 完全透明, 255 代表完全不透明), 其它通道定义了颜色和亮度.

基本上又两种绘图模式. 第一种是直接替换像素信息, 第二种是已有的像素和新的进行混合, 称为alpha通道混合.

BGRABitmap 的函数提供4种模式:

  • dmSet : 替换绘制像素的4个字节, 不处理透明度
  • dmDrawWithTransparency : 使用 alpha混合绘制并进行 gamma 矫正 (see below)
  • dmFastBlend or dmLinearBlend : 使用alpha混合绘制但不进行gamma矫正 (更快速 但会带有轻度的颜色畸变).
  • dmXor : 对个组件进行异或(Xor)操作,包括alpha (如果只反相颜色而保持alpha, 使用 BGRA(255,255,255,0) )

集成的绘图功能

  • 绘制/擦除 像素
  • 画线(带或不带抗锯齿)
  • 浮点坐标
  • 浮点画笔宽度
  • 矩形 (边框 或 填充)
  • 椭圆 和 多边形 (带有抗锯齿)
  • 样条计算 (园曲线)
  • 简单填充 (Floodfill) 或 渐进式填充
  • 颜色渐变渲染 (线性, 放射...)
  • 圆角矩形
  • 带透明特性的文本

使用Canvas绘图

It is possible to draw with a Canvas object, with usual functions but without antialiasing. Opacity of drawing is defined by the CanvasOpacity property. This way is slower because it needs image transformations. If you can, use CanvasBGRA instead, which allows transparency and antialiasing while having the same function names as with TCanvas.