Difference between revisions of "fcl-image"

From Lazarus wiki
Jump to navigationJump to search
Line 246: Line 246:
 
* psPattern
 
* psPattern
 
* psClear
 
* psClear
 +
 +
=== Drawing text ===
 +
 +
Here is an example, how to create a 200x100 image, painting a white background and some text and saving it as .png:
 +
<Delphi>
 +
program fontdraw;
 +
 +
{$mode objfpc}{$H+}
 +
 +
uses
 +
  Classes, SysUtils, FPimage, FPImgCanv, ftfont, FPWritePNG, FPCanvas;
 +
 +
procedure TestFPImgFont;
 +
var
 +
  Img: TFPMemoryImage;
 +
  Writer: TFPWriterPNG;
 +
  ms: TMemoryStream;
 +
  ImgCanvas: TFPImageCanvas;
 +
  fs: TFileStream;
 +
  AFont: TFreeTypeFont;
 +
begin
 +
  Img:=nil;
 +
  ImgCanvas:=nil;
 +
  Writer:=nil;
 +
  ms:=nil;
 +
  fs:=nil;
 +
  AFont:=nil;
 +
  try
 +
    // initialize free type font manager
 +
    ftfont.InitEngine;
 +
    FontMgr.SearchPath:='/usr/share/fonts/truetype/ttf-dejavu/';
 +
    AFont:=TFreeTypeFont.Create;
 +
 +
    // create an image of width 200, height 100
 +
    Img:=TFPMemoryImage.Create(200,100);
 +
    Img.UsePalette:=false;
 +
    // create the canvas with the drawing operations
 +
    ImgCanvas:=TFPImageCanvas.create(Img);
 +
 +
    // paint white background
 +
    ImgCanvas.Brush.FPColor:=colWhite;
 +
    ImgCanvas.Brush.Style:=bsSolid;
 +
    ImgCanvas.Rectangle(0,0,Img.Width,Img.Height);
 +
 +
    // paint text
 +
    ImgCanvas.Font:=AFont;
 +
    ImgCanvas.Font.Name:='DejaVuSans';
 +
    ImgCanvas.Font.Size:=20;
 +
    ImgCanvas.TextOut(10,30,'Test');
 +
 +
    // write image as png to memory stream
 +
    Writer:=TFPWriterPNG.create;
 +
    ms:=TMemoryStream.Create;
 +
    writer.ImageWrite(ms,Img);
 +
    // write memory stream to file
 +
    ms.Position:=0;
 +
    fs:=TFileStream.Create('testfont.png',fmCreate);
 +
    fs.CopyFrom(ms,ms.Size);
 +
  finally
 +
    AFont.Free;
 +
    ms.Free;
 +
    Writer.Free;
 +
    ImgCanvas.Free;
 +
    Img.Free;
 +
    fs.Free;
 +
  end;
 +
end;
 +
 +
begin
 +
  TestFPImgFont;
 +
end.
 +
</Delphi>
  
 
== Links ==  
 
== Links ==  
  
 
Go to back [[Package_List|Packages List]]
 
Go to back [[Package_List|Packages List]]

Revision as of 07:26, 30 July 2010

English (en) | 日本語 (ja)

Introduction

FCL-Image started life as "fpimage", pretty much as an attempt to implement a generally portable TImage like class, without the deep win32 and VCL ties.

Current file list

The central units are fpimage and fpcanvas and these are further enhanced by OOP derivation.

  • bmpcomn A few structures and constants for the BMP fileformat
  • clipping Some utility routines that help with clipping and intersecting of rects.
  • ellipses Drawing of ellipses and arcs, and filling ellipses and pies.
    • TEllipseInfo
  • extinterpolation interpolation filters for TFPCanvas.StretchDraw (
    • TBlackmanInterpolation
    • TBlackmanSincInterpolation
    • TBlackmanBesselInterpolation
    • TGaussianInterpolation
    • TBoxInterpolation
    • THermiteInterpolation
    • TLanczosInterpolation
    • TQuadraticInterpolation
    • TCubicInterpolation
    • TCatromInterpolation
    • TBilineairInterpolation
    • THanningInterpolation
    • THammingInterpolation
  • fpcanvas Generic Canvas classes.
    • TFPCanvasException
    • TFPPenException
    • TFPBrushException
    • TFPFontException
    • TFPCustomCanvas
    • TFPCanvasHelper
    • TFPCustomFont
    • TFPCustomFontClass
    • TFPCustomPen
    • TFPCustomPenClass
    • TFPCustomBrush
    • TFPCustomBrushClass
    • TFPCustomInterpolation
    • TFPBaseInterpolation
    • TMitchelInterpolation
    • TFPCustomCanvas
    • TFPCustomDrawFont
    • TFPEmptyFont
    • TFPCustomDrawPen
    • TFPEmptyPen
    • TFPCustomDrawBrush
    • TFPEmptyBrush
  • fpcolhash an implementation of a color hash table.
    • TFPColorHashException
    • TFPColorHashTable
  • fpditherer contains classes used to dither images.
    • FPDithererException
    • TFPBaseDitherer
    • TFPFloydSteinbergDitherer
  • fpimage fpImage base definitions and classes
    • TFPCustomImageReader
    • TFPCustomImageWriter
    • TFPCustomImage
    • FPImageException
    • TFPPalette
    • TFPCustomImage
    • TFPMemoryImage
    • TFPCustomImageHandler
    • TFPCustomImageReader
    • TFPCustomImageWriter
    • TIHData
    • TImageHandlersManager
  • fpimgcanv Image Canvas - canvas which draws on an image.
    • TFPImageCanvas
  • fpimgcmn Image Common: small procedural Helpers (swap,crc)
  • fppixlcanv
    • TPixelCanvas
  • fpquantizer classes used to quantize images.
  • freetype Encapsulating classes over freetype
  • freetypeh Freetype header translation
  • ftfont More freetype related font classes
  • pcxcomn PCX fileformat records and types
  • pixtools Pixel drawing routines.
  • pngcomn PNG fileformat records and types
  • pscanvas TPostScriptCanvas implementation.
  • targacmn Targa fileformat records and types

Readers and writers for various image formats

  • fpreadbmp
  • fpreadjpeg
  • fpreadpcx
  • fpreadpng
  • fpreadpnm
  • fpreadtga
  • fpreadxpm
  • fpwritebmp
  • fpwritejpeg
  • fpwritepcx
  • fpwritepng
  • fpwritepnm
  • fpwritetga
  • fpwritexpm

INC files uses in fpcanvas

  • fpbrush
  • fpcanvas
  • fpcdrawh
  • fpfont
  • fphelper
  • fpinterpolation
  • fppen

INC files uses in fpmake

  • fpcolors
  • fpimage
  • fphandler
  • fpcolcnv
  • fppalette

Demoes

  • drawing
  • imgconv

Known Issues and limitations

  • fcl-image is written for maximal portability and maintainability and is quite slow. The main storage type is 16-bit RGBA, storing always 64-bit per pixel, and a function is called to get each pixel.
  • pngwriter doesn't implement automatic detection of filters, and thus is always "filter none"

Walk-through

Basic Canvas Setup

You'll need a few things to start up. A canvas, image, and writer. The writer is to write images like PNG. The sample below will give you a 100x100 black png.

{$mode objfpc}{$h+}
program demo;
 
uses classes, sysutils,
     FPImage, FPCanvas, FPImgCanv,
     FPWritePNG;
 
var canvas : TFPCustomCanvas;
    image : TFPCustomImage;
    writer : TFPCustomImageWriter;
begin
  { Create an image 100x100 pixels}
  image := TFPMemoryImage.Create (100,100);
  
  { Attach the image to the canvas }
  Canvas := TFPImageCanvas.Create (image);
  
  { Create the writer }
  Writer := TFPWriterPNG.Create;
  
  { Save to file }
  image.SaveToFile ('DrawTest.png', writer);
  
  { Clean up! }
  Canvas.Free;
  image.Free;
  writer.Free;
end.

Drawing a Circle

Drawing a circle requires a bit more then just giving a width. You'll need to setup the pen style, mode, width, and color to do this. FCL-Image comes with a few pen modes and styles, it will really be up to you to decide which you'll need. Its best for now to try with a few modes and styles to get a better understanding of what FCL-Image can do.


{$mode objfpc}{$h+}
program demo;
 
uses classes, sysutils,
     FPImage, FPCanvas, FPImgCanv,
     FPWritePNG;
 
var canvas : TFPcustomCanvas;
    image : TFPCustomImage;
    writer : TFPCustomImageWriter;
    { 
      Colors range from 0 to 65535 in each primary color. 
      They can also show as hexideciaml:
      $FFFF = 65535, $0000 = 0 
    }
    passionRed: TFPColor = (Red: 65535; Green: 0; Blue: 0; Alpha: 65535);
begin
  image := TFPMemoryImage.Create (100,100);
  Canvas := TFPImageCanvas.Create (image);
  Writer := TFPWriterPNG.Create;

  { Set the pen styles }
  with canvas do
  begin
    pen.mode    := pmCopy;
    pen.style   := psSolid;
    pen.width   := 1;
    pen.FPColor := passionRed;
  end;

  { Draw a circle }
  canvas.Ellipse (10,10, 90,90);
  
  { Save to file }
  image.SaveToFile ('DrawTest.png', writer);
  
  { Clean up! }
  Canvas.Free;
  image.Free;
  writer.Free;
end.

Pen Modes

The pen mode is how the pixel drawn will react to the pixels beneath it. So if its a white pixel and you draw a red pixel over it with the mode of pmXor then you'll get a vibrate blue pixel.

  • pmBlack
  • pmWhite
  • pmNop
  • pmNot
  • pmCopy
  • pmNotCopy
  • pmMergePenNot
  • pmMaskPenNot
  • pmMergeNotPen
  • pmMaskNotPen
  • pmMerge
  • pmNotMerge
  • pmMask
  • pmNotMask
  • pmXor
  • pmNotXor


Pen Styles

  • psSolid
  • psDash
  • psDot
  • psDashDot
  • psDashDotDot
  • psinsideFrame
  • psPattern
  • psClear

Drawing text

Here is an example, how to create a 200x100 image, painting a white background and some text and saving it as .png: <Delphi> program fontdraw;

{$mode objfpc}{$H+}

uses

 Classes, SysUtils, FPimage, FPImgCanv, ftfont, FPWritePNG, FPCanvas;

procedure TestFPImgFont; var

 Img: TFPMemoryImage;
 Writer: TFPWriterPNG;
 ms: TMemoryStream;
 ImgCanvas: TFPImageCanvas;
 fs: TFileStream;
 AFont: TFreeTypeFont;

begin

 Img:=nil;
 ImgCanvas:=nil;
 Writer:=nil;
 ms:=nil;
 fs:=nil;
 AFont:=nil;
 try
   // initialize free type font manager
   ftfont.InitEngine;
   FontMgr.SearchPath:='/usr/share/fonts/truetype/ttf-dejavu/';
   AFont:=TFreeTypeFont.Create;
   // create an image of width 200, height 100
   Img:=TFPMemoryImage.Create(200,100);
   Img.UsePalette:=false;
   // create the canvas with the drawing operations
   ImgCanvas:=TFPImageCanvas.create(Img);
   // paint white background
   ImgCanvas.Brush.FPColor:=colWhite;
   ImgCanvas.Brush.Style:=bsSolid;
   ImgCanvas.Rectangle(0,0,Img.Width,Img.Height);
   // paint text
   ImgCanvas.Font:=AFont;
   ImgCanvas.Font.Name:='DejaVuSans';
   ImgCanvas.Font.Size:=20;
   ImgCanvas.TextOut(10,30,'Test');
   // write image as png to memory stream
   Writer:=TFPWriterPNG.create;
   ms:=TMemoryStream.Create;
   writer.ImageWrite(ms,Img);
   // write memory stream to file
   ms.Position:=0;
   fs:=TFileStream.Create('testfont.png',fmCreate);
   fs.CopyFrom(ms,ms.Size);
 finally
   AFont.Free;
   ms.Free;
   Writer.Free;
   ImgCanvas.Free;
   Img.Free;
   fs.Free;
 end;

end;

begin

 TestFPImgFont;

end. </Delphi>

Links

Go to back Packages List