// Wenn man bei einem Bitmap mit 8 Bit Farbtiefe die Farbe eines Punktes
// auslesen will, hat man mehrere Möglichkeiten. Über die Eigenschaft
//
Canvas.Pixels[x,y] geht das verhältnismäßig langsam. Die Funktion
//
GetPixel(HDC,x,y) ist auch nur unwesentlich schneller. Ein Stück weit
// flinker funktioniert das mit der Eigenschaft
ScanLine[Row]. Sie finden
// hier zwei Varianten dafür. Wenn Sie nur eine der beiden in Ihrem Programm
// einsetzen, entfällt natürlich "
overload".

// Getestet mit D4 unter WinME

// Variante 1 
function GetPix(Bild: TBitmap; x, y: integer): TColor; overload; 
var 
  pe: tagPALETTEENTRY; 
begin 
  GetPaletteEntries(Bild.Palette, PByteArray(Bild.Scanline[y])[x], 1, pe); 
  result := rgb(pe.peRed, pe.peGreen, pe.peBlue); 
end; 
 
// Variante 2 
function GetPix(Pl: HPalette; x: uint): TColor; overload; 
var 
  pe: tagPALETTEENTRY; 
begin 
  GetPaletteEntries(pl, x, 1, pe); 
  result := rgb(pe.peRed, pe.peGreen, pe.peBlue); 
end; 
 
// --- Beispielaufrufe --- 
 
var 
  is8bit: boolean; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  Image1.Picture.bitmap.loadfromfile('d:\bilder\corel001-8.bmp'); 
  is8bit := Image1.Picture.bitmap.pixelformat = pf8bit; 
end; 
 
// Variante 1 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if is8bit then // <-- Zeile nur bei Bedarf 
    Label1.Caption := ColorToString(GetPix(Image1.Picture.bitmap, x, y)); 
end; 
 
// oder falls man sowieso irgendwie mit "Scanline" arbeitet, 
// dann Variante 2 
procedure TForm1.Button7Click(Sender: TObject); 
var 
  x, y: integer; 
  p: PBytearray; 
begin 
  if is8bit then begin 
    y := 10; // z.B. 
    x := 5; // z.B. 
    p := Image1.Picture.bitmap.scanline[y]; 
    Panel1.color := GetPix(Image1.Picture.bitmap.palette, p[x]); 
  end; 
end;


 

Zugriffe seit 6.9.2001 auf Delphi-Ecke