Difference between revisions of "BGRABitmap/es"

From Free Pascal wiki
Jump to navigationJump to search
m (Reverted edits by Reverse22 (Talk); changed back to last version by Circular)
m (Text replace - "delphi>" to "syntaxhighlight>")
Line 15: Line 15:
 
===Using BGRABitmap===
 
===Using BGRABitmap===
 
You must copy BGRABitmap units and link them to your project:
 
You must copy BGRABitmap units and link them to your project:
<delphi>
+
<syntaxhighlight>
 
Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;
 
Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;
</delphi>
+
</syntaxhighlight>
  
 
The unit BGRABitmapTypes contains all necessary definitions, but one can declare only BGRABitmap in order to load and show a bitmap. Then, the first step is to create a TBGRABitmap object:
 
The unit BGRABitmapTypes contains all necessary definitions, but one can declare only BGRABitmap in order to load and show a bitmap. Then, the first step is to create a TBGRABitmap object:
<delphi>
+
<syntaxhighlight>
 
var bmp: TBGRABitmap;
 
var bmp: TBGRABitmap;
 
begin
 
begin
Line 28: Line 28:
 
   bmp.FillRect(40,40,80,80,BGRA(0,0,255,128), dmDrawWithTransparency); //draws a transparent blue square
 
   bmp.FillRect(40,40,80,80,BGRA(0,0,255,128), dmDrawWithTransparency); //draws a transparent blue square
 
end;
 
end;
</delphi>
+
</syntaxhighlight>
  
 
Finally to show the bitmap:
 
Finally to show the bitmap:
<delphi>
+
<syntaxhighlight>
 
procedure TFMain.FormPaint(Sender: TObject);
 
procedure TFMain.FormPaint(Sender: TObject);
 
begin
 
begin
 
   bmp.Draw(Canvas, 0, 0, True); // draw the bitmap in opaque mode (faster)
 
   bmp.Draw(Canvas, 0, 0, True); // draw the bitmap in opaque mode (faster)
 
end;
 
end;
</delphi>
+
</syntaxhighlight>
  
 
===Notions===
 
===Notions===
Line 72: Line 72:
 
To access pixels, there are two properties, ''Data'' and ''Scanline''. The first gives a pointer to the first pixel of the image, and the second gives a pointer to the first pixel of a given line.
 
To access pixels, there are two properties, ''Data'' and ''Scanline''. The first gives a pointer to the first pixel of the image, and the second gives a pointer to the first pixel of a given line.
  
<delphi>
+
<syntaxhighlight>
 
var  
 
var  
 
   bmp: TBGRABitmap;
 
   bmp: TBGRABitmap;
Line 90: Line 90:
 
     bmp.Free;
 
     bmp.Free;
 
end;
 
end;
</delphi>
+
</syntaxhighlight>
  
 
It is necessary to call the function ''InvalidateBitmap'' to rebuild the image in a next call to ''Draw''' for example. Notice that the line order can be reverse, depending on the ''LineOrder'' property.
 
It is necessary to call the function ''InvalidateBitmap'' to rebuild the image in a next call to ''Draw''' for example. Notice that the line order can be reverse, depending on the ''LineOrder'' property.

Revision as of 13:50, 24 March 2012

Deutsch (de) English (en) español (es) français (fr) русский (ru) 中文(中国大陆)‎ (zh_CN)

bgrabitmap logo.jpg

See also: Developing with Graphics

Description

BGRABitmap is a set of units designed to modify and create images with transparency (alpha channel). Direct pixel access allows fast image processing. The library has been tested on Windows, Ubuntu and Mac OS X, with widgetsets win32, gtk1, gtk2 and carbon.

The main class is TBGRABitmap, which is derived from TFPCustomImage. There is also TBGRAPtrBitmap which allows to edit BGRA data that are already allocated. This format consists of 4 bytes for each pixel (blue, green, red and alpha in that order).

Tutorial

Go to the tutorial.

There are also examples in testbgrafunc folder of LazPaint archives (see download section).

Using BGRABitmap

You must copy BGRABitmap units and link them to your project:

Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;

The unit BGRABitmapTypes contains all necessary definitions, but one can declare only BGRABitmap in order to load and show a bitmap. Then, the first step is to create a TBGRABitmap object:

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;

Finally to show the bitmap:

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

Notions

Pixels in a bitmap with transparency are stored with 4 values, here 4 bytes in the order Blue, Green, Red, Alpha. The last channel defines the level of opacity (0 signifies transparent, 255 signifies opaque), other channels define color and luminosity.

There are basically two drawing modes. The first consists in replacing the content of the pixel information, the second consists in blending the pixel already here with the new one, which is called alpha blending.

BGRABitmap functions propose 4 modes:

  • dmSet : replaces the four bytes of the drawn pixel, transparency not handled
  • dmDrawWithTransparency : draws with alphablending and with gamma correction (see below)
  • dmFastBlend or dmLinearBlend : draws with alphablending but without gamma correction (faster but entails color distortions with low intensities).
  • dmXor : apply Xor to each component including alpha (if you want to invert color but keep alpha, use BGRA(255,255,255,0) )

Integrated drawing functions

  • draw/erase pixels
  • draw a line with or without antialiasing
  • floating point coordinates
  • floating point pen width
  • rectangle (frame or fill)
  • ellipse and polygons with antialiasing
  • spline computation (rounded curve)
  • simple fill (Floodfill) or progressive fill
  • color gradient rendering (linéaire, radial...)
  • round rectangles
  • texts with transparency

Drawing with the 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.

Direct access to pixels

To access pixels, there are two properties, Data and Scanline. The first gives a pointer to the first pixel of the image, and the second gives a pointer to the first pixel of a given line.

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;  //invert red canal
          inc(p);
     end;
     bmp.InvalidateBitmap;  //note that we have accessed directly to pixels
     bmp.Draw(Canvas,0,0,True);
     bmp.Free;
end;

It is necessary to call the function InvalidateBitmap to rebuild the image in a next call to Draw' for example. Notice that the line order can be reverse, depending on the LineOrder property.

See also the comparison between direct pixel access methods.

Image manipulation

Available filters:

  • Radial blur : non directional blur
  • Motion blur : directional blur
  • Custom blur : blur according to a mask
  • Median : computes the median of colors around each pixel, which softens corners
  • Smooth : soften whole image, complementary to Sharpen
  • Sharpen : makes contours more accute, complementary to Smooth
  • Contour : draws contours on a white background (like a pencil drawing)
  • Emboss : draws contours with shadow
  • EmbossHighlight : draws contours of a selection defined with grayscale
  • Grayscale : converts colors to grayscale with gamma correction
  • Normalize : uses whole range of color luminosity
  • Rotate : rotation of the image around a point
  • SmartZoom3 : resizes the image x3 and detects borders, to have a useful zoom with ancient games sprites

Images combination

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

Screenshots

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

Licence

modified LGPL

Download

Sourceforge with LazPaint and BGRABitmap : https://sourceforge.net/projects/lazpaint/files/

Old link : http://consume.o2switch.net/lazarus/

Installation

Add BGRABitmap and BGRABitmapTypes to the uses clause.