Manipulating Images

Imaging offers some image manipulation functions which work with all supported image data formats. Conversions, resizing, color reduction and other are available. You can find list of all low level image manipulation and drawing/pixel functions in Low Level Interface section. You can look at usage of many of these functions in the VampConvert and Benchmark Object Pascal demos and C++ Benchmark demo.

In the following code listing you can see typical usage of Imaging's manipulation functions.

uses
  ImagingTypes, Imaging;
var
  Img, ImgClone: TImageData;
begin
  ...
  // image is now initialized and loaded
  // now we want image to be mirrored
  MirrorImage(Img);
  // and flipped
  FlipImage(Img);
  // conversion to 32bit ARGB format
  ConvertImage(Img, ifA8R8G8B8);
  // swap alpha channel with green channel
  SwapChannels(Img, ChannelAlpha, ChannelGreen);
  // now we make clone of image
  InitImage(ImgClone);
  CloneImage(Img, ImgClone);
  // reduce colors of clone to 1024
  ReduceColors(ImgClone, 1024);
  // and resize original image
  ResizeImage(Img, Img.Width * 2, Image.Height div 2, rfBicubic);
  // finally convert clone to DXT5
  ConvertImage(ImgClone, ifDXT5);
  // do something else with image
  ...
end.
    

In this example you can find how to pass fill color parameters to functions like FillRect. These functions work for all possible image data format so fill color is defined as pointer to pixel in image's format. You can also use GetPixel32, SetPixel32, GetPixelFP, and SetPixelFP to set/get pixel colors which are automatically converted to native color format of each data format.

var
  Img: TImageData;
  Pix32: TColor32Rec
  Pix24: TColor24Rec
  Pix64: TColor64Rec
  Pix48: TColor48Rec
  PixWord: Word;
  PixByte: Byte;
begin
  ...
  // image is now initialized and loaded
  // now we set pixel colors 
  Pix32.Color := $FFFF0000; // opaque red
  Pix64.Color := $FFFF0000FFFF0000; // opaque green 
  with Pix24 do begin R := $FF; G := $FF; B := 0; end; // yellow 
  with Pix48 do begin R := $FF00; G := $00FF; B := $0800; end; // something redish
  PixWord := (31 shl 10) or (15 shl 5) or 25; // something violetish in R5G5B5
  PixByte := 111; 
 
  // image is then converted between various formats
  // and rectangle is filled with appropriate pixels
  
  ConvertImage(Img, ifA16R16G16B16);
  FillRect(Img, 20, 20, 60, 40, @Pix64);
  
  ConvertImage(Img, ifA8R8G8B8);
  FillRect(Img, 20, 20, 60, 40, @Pix32);
  
  ConvertImage(Img, ifR16G16B16);
  FillRect(Img, 20, 20, 60, 40, @Pix48);
  
  ConvertImage(Img, ifR8G8B8);
  FillRect(Img, 20, 20, 60, 40, @Pix24);
  
  ConvertImage(Img, ifX1R5G5B5);
  FillRect(Img, 20, 20, 60, 40, @PixWord);
  
  ConvertImage(Img, ifGray8);
  FillRect(Img, 20, 20, 60, 40, @PixByte);
 
  ...
end.