// Mit dem folgenden Code kann man aus einem Bitmap eine Prägung (ein Relief)
// ohne Farbschlieren berechnen lassen. Es werden die Übergänge von hellen zu
// dunklen Flächen als Kanten genutzt. Die Variable "
Farbe" legt dabei nur die
// farbliche Grundstimmung des Reliefs fest. Die Variable "
Stufe" ist in
// gewissen Grenzen für die Stärke des Reliefs zuständig. Für kontrastreiche
// Bilder sollte ihr Wert unter "
64" liegen, bei sehr flauen Bildern über "191".
// Die Variable "
Negativ" bestimmt wie die Hell-Dunkel-Übergänge dargestellt
// werden, das Relief erscheint entweder erhaben oder versunken. Die Variable
// "
Solarisation" bestimmt gleichzeitig die Helligkeit und das Verhältnis von
// Licht und Schatten zueinander. Standardmäßig sollte diese Variable immer den
// Wert "
215" haben. Bei "Muster" kann man ein Bild angeben, das
// als eine Art Wasserzeichen unter das Relief gelegt wird.


// Getestet mit D4 unter WinXP
 

procedure Relief(Bitmap, Muster: TBitmap; Farbe: TColor; 
  Stufe, Solarisation: Byte; Negativ: Boolean); 
var 
  x, y, b3, schwelle: Integer; 
  p1, p2, p3: PByteArray; 
  a, r, g, b, h: Byte; 
  bm, bmm: TBitmap; 
  m: boolean; 
  function grenze(b: byte): byte; 
  begin 
    if b > schwelle then result := 255 else 
      if b < solarisation then result := 0 
      else result := b; 
  end; 
  function rechne(bb: byte): integer; 
  begin 
    if bb > 120 then Result := bb + stufe else Result := bb - stufe; 
    if Result < 0 then Result := 0 else if Result > 255 then Result := 255; 
  end; 
begin 
  farbe := colortorgb(farbe); 
  r := getrvalue(farbe); 
  g := getgvalue(farbe); 
  b := getbvalue(farbe); 
  m := muster <> nil; 
  a := 2 + stufe div 191 - ord(stufe < 64); 
  stufe := stufe shr 1; 
  solarisation := 255 - solarisation; 
  schwelle := solarisation * 6 + 30; 
  bm := TBitmap.create; 
  bm.pixelformat := pf24bit; 
  bmm := TBitmap.create; 
  bmm.pixelformat := pf24bit; 
  bitmap.pixelformat := pf24bit; 
  bm.width := bitmap.width + 2; 
  bm.height := bitmap.height + a; 
  bmm.width := bm.width; 
  bmm.height := bm.height; 
  bm.canvas.draw(0, 0, bitmap); 
  if m then 
    bmm.canvas.stretchdraw(rect(0, 0, bmm.width, bmm.height), muster); 
  bm.canvas.copyrect(rect(0, bitmap.height, bitmap.width, bm.height), 
    bitmap.canvas, rect(0, bitmap.height - a, bitmap.width, bitmap.height)); 
  bm.canvas.copyrect(rect(bitmap.width, 0, bm.width, bitmap.height), 
    bitmap.canvas, rect(bitmap.width - 2, 0, bitmap.width, bitmap.height)); 
  b3 := bm.width * 3 - 1; 
  for y := 0 to bitmap.height - 1 do 
  begin 
    p1 := bm.ScanLine[y]; 
    p2 := bm.ScanLine[y + a]; 
    p3 := bmm.scanline[y]; 
    x := 0; 
    while x < b3 do 
    begin 
      h := (rechne(p1[x]) + (rechne(p2[x]) xor $FF) + 
        rechne(p1[x + 1]) + (rechne(p2[x + 4]) xor $FF) + 
        rechne(p1[x + 2]) + (rechne(p2[x + 8]) xor $FF)) div 6; 
      if negativ then h := 255 - h; 
      p1[x] := grenze((h + b) shr 1); 
      p1[x + 1] := grenze((h + g) shr 1); 
      p1[x + 2] := grenze((h + r) shr 1); 
      if m then begin 
        p1[x] := (p1[x] shl 1 + p3[x]) div 3; 
        p1[x + 1] := (p1[x + 1] shl 1 + p3[x + 1]) div 3; 
        p1[x + 2] := (p1[x + 2] shl 1 + p3[x + 2]) div 3; 
      end; 
      inc(x, 3); 
    end; 
  end; 
  bitmap.canvas.draw(0, 0, bm); 
  bm.free; 
  bmm.free; 
end; 
//--------------------- Beispielaufrufe ------------------------
procedure TForm1.Button5Click(Sender: TObject); 
var 
  b: TBitmap; 
begin 
  b := TBitmap.create; 
  b.loadfromfile('d:\bilder\frau.bmp'); 
  canvas.draw(10, 10, b); 
  Relief(b, nil, clgray, 80, 215, false); 
  canvas.draw(b.width + 20, 10, b); 
  b.free; 
end;
//--------------------------------------------------------------
  Solarisation = 215
Solarisation = 127 Solarisation = 63
procedure TForm1.Button5Click(Sender: TObject); 
var 
  b: TBitmap; 
begin 
  b := TBitmap.create; 
  b.loadfromfile('d:\bilder\auto.bmp'); 
  canvas.draw(10, 10, b); 
  Relief(b, nil, clred, 100, 215, true); 
  canvas.draw(b.width + 20, 10, b); 
  b.free; 
end;

//--------------------------------------------------------------
 

procedure TForm1.Button9Click(Sender: TObject); 
var 
  b, m: TBitmap; 
begin 
  b := TBitmap.create; 
  m := TBitmap.create; 
  b.loadfromfile('d:\bilder\frau.bmp'); 
  m.loadfromfile('d:\bilder\muster.bmp'); 
  canvas.draw(10, 10, b); 
  Relief(b, m, clsilver, 180, 215, false); 
  canvas.draw(b.width + 20, 10, b); 
  m.free; 
  b.free; 
end;



Zugriffe seit 6.9.2001 auf Delphi-Ecke