RAD Studio VCL Reference
ContentsIndex
PreviousUpNext
TBitmap.PixelFormat Property

Indicates the bit format of the bitmap image, specifying how the image is displayed and how the pixels of the bitmap image are stored in memory.

Pascal
property PixelFormat: TPixelFormat;
C++
__property TPixelFormat PixelFormat;

Use PixelFormat to change a TBitmap's internal image to a particular memory format and color depth, or to find out what memory format and color depth a TBitmap is using. 

For example, PixelFormat can be used to set the pixel format of the bitmap image to 8-bit for video drivers that cannot display the native format of a bitmap image.

Note: The PixelFormat of a JPEG image object applies to the bitmap if the JPEG image is copied to it.
Changing the pixel format is most commonly used with ScanLine, because your code must decode the pixel data accessed by ScanLine. Image-editing tools usually use one pixel for all internal image operations and copy the results to the screen (in whatever format) as the last step.  

C++ Examples: 

 

/*
This example shows how to draw directly to a Bitmap.  It
loads a bitmap from a file and then copies it to another
bitmap twice it's size.  Then the two bitmaps are
displayed on the form canvas.
*/

#include <memory>       //for STL auto_ptr class

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  std::auto_ptr<Graphics::TBitmap> Bitmap(new Graphics::TBitmap);
  std::auto_ptr<Graphics::TBitmap> BigBitmap(new Graphics::TBitmap);
  TRGBTriple *ptr, *bigPtr;   // use a (byte *) for pf8bit color
  TPixelFormat pixForm, bigpixForm;
  try
  {
    Bitmap->LoadFromFile("../littlefac.bmp");
    pixForm = Bitmap->PixelFormat;
    bigpixForm  = BigBitmap->PixelFormat;
    Bitmap->PixelFormat = pf24bit;
    BigBitmap->PixelFormat = pf24bit;
    BigBitmap->Height = Bitmap->Height * 2;
    BigBitmap->Width = Bitmap->Width * 2;
    for (int y = 0; y < Bitmap->Height; y++)
    {
      ptr = reinterpret_cast<TRGBTriple *>(Bitmap->ScanLine[y]);
      for (int x = 0; x < Bitmap->Width; x++)
      {
        int bx = x * 2;
        int by = y * 2;
        bigPtr = reinterpret_cast<TRGBTriple *>(BigBitmap->ScanLine[by]);
        bigPtr[bx] = ptr[x];
        bigPtr[bx + 1] = ptr[x];
        bigPtr = reinterpret_cast<TRGBTriple *>(BigBitmap->ScanLine[by + 1]);
        bigPtr[bx] = ptr[x];
        bigPtr[bx + 1] = ptr[x];
      }
    }
    Canvas->Draw(0, 0, Bitmap.get());
    Canvas->Draw(200, 200, BigBitmap.get());
  }
  catch (...)
  {
    ShowMessage("Could not load or alter bitmap");
  }
}

 

Delphi Examples: 

{
This example shows how to draw directly to a Bitmap.  It
loads a bitmap from a file and then copies it to another
bitmap twice it's size.  Then the two bitmaps are
displayed on the form canvas.
}
procedure TForm1.Button1Click(Sender: TObject);
type
  TRGBTripleArray = ARRAY[Word] of TRGBTriple;
  pRGBTripleArray = ^TRGBTripleArray; // use a PByteArray for pf8bit color
var
  x,y : Integer;
  bx, by : Integer;
  BitMap, BigBitMap : TBitMap;
  P, bigP : pRGBTripleArray;
  pixForm, bigpixForm : TPixelFormat;
begin
  BitMap := TBitMap.create;
  BigBitMap := TBitMap.create;
  try
    BitMap.LoadFromFile('littlefac.bmp');
    pixForm := BitMap.PixelFormat;
    bigpixForm := BigBitMap.PixelFormat;
    BitMap.PixelFormat := pf24bit;
    BigBitMap.PixelFormat := pf24bit;
    BigBitMap.Height := BitMap.Height * 2;
    BigBitMap.Width := BitMap.Width * 2;
    for y := 0 to BitMap.Height - 1 do
    begin
      P := BitMap.ScanLine[y];
      for x := 0 to BitMap.Width - 1 do
      begin
        bx := x * 2;
        by := y * 2;
        bigP := BigBitMap.ScanLine[by];
        bigP[bx] := P[x];
        bigP[bx + 1] := P[x];
        bigP := BigBitMap.ScanLine[by + 1];
        bigP[bx] := P[x];
        bigP[bx + 1] := P[x];
      end;
    end;
    Canvas.Draw(0, 0, BitMap);
    Canvas.Draw(200, 200, BigBitMap);
  finally
    BitMap.Free;
    BigBitMap.Free;
  end;
end;

 

Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
What do you think about this topic? Send feedback!