// Drei Beispiele, wie man eine Bitmap durch eine Palette mit jeweils
// nur 8 Farben verändern kann, wobei die beste Einstellung mittels
// Trackbars ermittelt wird. Die Paletten sind über den Daumen den
// jeweiligen Bildern ungefähr angepasst.


// Getestet mit D4 unter XP

type 
  stufe = -200..200; 
 
const 
  gesamt = 256; 
  teil = 8; 
 
var 
  bm: TBitmap; 
  f256: array[0..gesamt - 1] of TColor; 
 
  aOrange: array[0..teil - 1] of TColor = ( 
    $7FFF, $A0FF, $C1FF, $55, 
    clRed, clGreen, $80, clNavy); 
 
  aGruen: array[0..teil - 1] of TColor = ( 
    $00FF7F, $00FFA0, $00FFC1, $005500, 
    $004000, $002000, $2020FF, clGreen); 
 
  aBlau: array[0..teil - 1] of TColor = ( 
    $FF7F00, $FFA000, $FFC100, $550000, 
    $80F0, clNavy, $80, clBlue); 
 
function SetByte(i: integer): byte; 
asm 
  CMP  EAX, 255 
  JG   @MAX 
  CMP  EAX, 0 
  JGE  @OK 
  MOV  EAX, 0 
  JMP  @OK 
@MAX: 
  MOV  EAX,255 
@OK: 
end; 
 
procedure neu(Source, Dest: TBitmap; schwelle: stufe; a: array of TColor); 
var 
  lPal: PLogpalette; 
  i: integer; 
  hlp: TBitmap; 
  x, y, b3: Integer; 
  p: PBytearray; 
begin 
  hlp := TBitmap.create; 
  hlp.pixelformat := pf24bit; 
  zeromemory(@f256, sizeof(f256)); 
  for i := 0 to teil - 1 do f256[i] := a[i]; 
  Dest.width := Source.width; 
  Dest.height := Source.height; 
  hlp.width := Source.width; 
  hlp.height := Source.height; 
  hlp.canvas.draw(0, 0, source); 
  b3 := hlp.width * 3; 
  for y := 0 to hlp.height - 1 do begin 
    p := hlp.scanline[y]; 
    x := 0; 
    while x < b3 do begin 
      p[x] := setbyte(p[x] + schwelle); 
      p[x + 1] := setbyte(p[x + 1] + schwelle); 
      p[x + 2] := setbyte(p[x + 2] + schwelle); 
      inc(x, 3); 
    end; 
  end; 
  Dest.pixelformat := pf8bit; 
  lpal := AllocMem(sizeof(TLogPalette) + sizeof(TPaletteEntry) * gesamt); 
  lpal.palVersion := $300; 
  lpal.palNumEntries := gesamt; 
  for i := 0 to gesamt - 1 do 
    lpal.palPalEntry[i] := TPaletteentry(f256[i]); 
  Dest.palette := CreatePalette(lpal^); 
  Dest.canvas.draw(0, 0, hlp); 
  FreeMem(lpal); 
  hlp.free; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  bm := TBitmap.create; 
  Trackbar1.min := low(stufe); 
  Trackbar1.max := high(stufe); 
  Trackbar1.position := 0; 
  Trackbar2.min := low(stufe); 
  Trackbar2.max := high(stufe); 
  Trackbar2.position := 0; 
  Trackbar3.min := low(stufe); 
  Trackbar3.max := high(stufe); 
  Trackbar3.position := 0; 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  bm.free; 
end; 
 
procedure TForm1.TrackBar1Change(Sender: TObject); 
begin 
  neu(Image1.picture.bitmap, bm, Trackbar1.position, aOrange); 
  canvas.draw(20, 200, bm); 
end; 
 
procedure TForm1.TrackBar2Change(Sender: TObject); 
begin 
  neu(Image1.picture.bitmap, bm, Trackbar2.position, aGruen); 
  canvas.draw(20, 200, bm); 
end; 
 
procedure TForm1.TrackBar3Change(Sender: TObject); 
begin 
  neu(Image1.picture.bitmap, bm, Trackbar3.position, aBlau); 
  canvas.draw(20, 200, bm); 
end;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke