BGRABitmap/zh CN

From Free Pascal wiki
Jump to: navigation, search

Deutsch (de) English (en) español (es) français (fr) 中文(中国大陆)‎ (zh_CN)

说明

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绘图

开始使用一个Canvas 对象进行绘图, 使用通常的功能,但不具有反锯齿功能. 通过CanvasOpacity 属性定义绘制的透明度. 这张方法是很慢的,因为它需要进行图像转换. 如果你可以,改用 CanvasBGRA,它允许透明度和抗锯齿功能,同时与 TCanvas 具有相同的函数名。

直接像素访问

要想访问像素, 要用到两个属性, DataScanline. 前一个给出图像第一个像素的指针, 第二个给出指定行的第一个像素的指针.

var 
  bmp: TBGRABitmap;
  p: PBGRAPixel;
  n: integer;
 
begin
  bmp := TBGRABitmap.Create('image.png');
  p := bmp.Data;
  for n := bmp.NbPixels-1 downto 0 do
  begin
    p^.red := not p^.red;  //反转 红色 通道
    inc(p);
  end;
  bmp.InvalidateBitmap;  //注意 这里我们直接访问像素
  bmp.Draw(Canvas,0,0,True);
  bmp.Free;
end;

该例中,在后面调用Draw之前调用函数InvalidateBitmap来重建图像是有必要的. 注意行的顺序可以反转, 取决于LineOrder 属性.

另请参阅 直接像素访问方法.

图像处理

可用滤镜 (prefixed with Filter) :

  • Radial blur : 非定向模糊
  • Motion blur : 定向模糊
  • Custom blur : 根据掩码模糊
  • Median : 计算每个像素周围颜色的中位数,并具有边角柔化
  • Pixelate : 用同色矩形简化图像
  • Smooth : 柔化整个图像, complementary to Sharpen(锐化补充?)
  • Sharpen : 色彩锐化, complementary to Smooth(柔化补充?)
  • Contour : 在白色背景上绘制轮廓(像铅笔画)
  • Emboss : 绘制带阴影的轮廓
  • EmbossHighlight : 绘制由灰度定义的所选内容的轮廓
  • Grayscale : 将色彩转换为灰度值,带有gamma矫正
  • Normalize : uses whole range of color luminosity 使用全域色彩亮度
  • Rotate : 以一点为圆心旋转图像
  • Sphere : 扭曲图像,使其看上去像在球体上的投影
  • Twirl : 旋转扭曲图像
  • Cylinder : 扭曲图像,使其看上去像在圆柱上的投影
  • Plane : computes a high precision projection on a horizontal plane. This is quite slow.
  • SmartZoom3 : resizes the image x3 and detects borders, to have a useful zoom with ancient games sprites

Some functions are not prefixed with Filter, because they do not return a newly allocated image. They modify the image in-place :

  • VerticalFlip : 垂直翻转图像
  • HorizontalFlip : 水平翻转图像
  • Negative : 负片
  • LinearNegative : 负片,不带gamma矫正
  • SwapRedBlue : 交换红色和蓝色通道 (在 BGRA 和 RGBA之间转换)
  • ConvertToLinearRGB : 从 sRGB 转换为 RGB. 注意,当使用dmDrawWithTransparency时,BGRABitmap用sRGB格式,而使用dmLinearBlend时,BGRABitmap用RGB格式.
  • ConvertFromLinearRGB : 从RGB转换为sRGB.

图像混合

PutImage is the basic image drawing function and BlendImage allows to combine images, like layers of image editing softwares. Available modes are the following:

  • LinearBlend : simple superimposition without gamma correction (equivalent to dmFastBlend)
  • Transparent : superimposition with gamma correction
  • Multiply : multiplication of color values (with gamma correction)
  • LinearMultiply : multiplication of color values (without gamma correction)
  • Additive : addition of color values (with gamma correction)
  • LinearAdd : addition of color values (without gamma correction)
  • Difference : difference of color values (with gamma correction)
  • LinearDifference : difference of color values (without gamma correction)
  • Negation : makes common colors disappear (with gamma correction)
  • LinearNegation : makes common colors disappear (without gamma correction)
  • Reflect, Glow : for light effects
  • ColorBurn, ColorDodge, Overlay, Screen : misc. filters
  • Lighten : keeps the lightest color values
  • Darken : keeps the darkest color values
  • Xor : exclusive or of color values

These modes can be used in TBGRALayeredBitmap, which makes it easier because BlendImage only provides the basic blending operations.

屏幕快照

Lazpaint contour.png Lazpaint curve redim.png Bgra wirecube.png Bgra chessboard.jpg

许可

修改的 LGPL

作者: Johann ELSASS (Facebook)

下载

Sourceforge 包含 LazPaint 和 BGRABitmap : http://sourceforge.net/projects/lazpaint/files/src/

GitHub: https://github.com/bgrabitmap/lazpaint/

就链接 : http://lazarus.johann-elsass.net/

如果你没有找到所需的信息或有任何建议, 可以 在这里提供反馈.