// Mein erster Versuch, so etwas wie einen Stempeleffekt
// zu erreichen.

// Man muss der Prozedur eine Bitmap mit dem konstruierten
// Stempelabdruck sowie der Stärke des Effekts übergeben. Außerdem
// muss man die Farbe des (unbedingt homogenen) Untergrundes und
// die hauptsächliche Farbe der "Stempeltinte" angeben. Hat die
// Variable "Zufall" den Wert TRUE, sieht der Stempelabdruck
// jedesmal anders aus.



// Getestet mit D4 unter XP

type 
   staerke = 1..7; 
 
procedure Stempel(bm: TBitmap; Untergrund, Farbe: TColor; 
   zufall: boolean; stark: staerke); 
var 
   h, z, r, g, b, r2, g2, b2: byte; 
   x, y, w, bx: integer; 
   p: PBytearray; 
begin 
   if zufall then randomize 
   else randseed := 91735; 
   z := 4; 
   h := succ(z); 
   bm.pixelformat := pf24bit; 
   Untergrund := ColorToRGB(Untergrund); 
   Farbe := ColorToRGB(Farbe); 
   r := getrvalue(Untergrund); 
   g := getgvalue(Untergrund); 
   b := getbvalue(Untergrund); 
   r2 := getrvalue(Farbe); 
   g2 := getgvalue(Farbe); 
   b2 := getbvalue(Farbe); 
   with bm, canvas do 
      for w := 1 to stark do begin 
         pen.color := Untergrund; 
         moveto(random(width), random(height div 2)); 
         lineto(random(width div 2), random(height)); 
      end; 
   r2 := round((r * Z + r2) / h); 
   g2 := round((g * Z + g2) / h); 
   b2 := round((b * Z + b2) / h); 
   bx := bm.width * 3; 
   for w := 1 to stark do 
      for y := 0 to bm.height - 1 do begin 
         p := bm.scanline[y]; 
         x := 0; 
         while x < bx do begin 
            if ((p[x] <> b) or (p[x + 1] <> g) or (p[x + 2] <> r)) 
               and (random(24) = 0) 
               then begin 
               if random(7) > 1 then begin 
                  p[x] := b2; 
                  p[x + 1] := g2; 
                  p[x + 2] := r2; 
               end else begin 
                  p[x] := b; 
                  p[x + 1] := g; 
                  p[x + 2] := r; 
               end; 
            end; 
            inc(x, 3); 
         end; 
      end; 
end; 
 
 
// Beispielaufruf 
 
procedure TForm1.Button1Click(Sender: TObject); 
var 
   bmp: TBitmap; 
begin 
   bmp := TBitmap.create; 
   Image1.picture.loadfromfile('stempel.bmp'); 
   bmp.assign(Image1.picture.bitmap); 
   Stempel(bmp, clwhite, clblue, false, 5); 
   canvas.draw(Image1.boundsrect.right + 5, Image1.top, bmp); 
   bmp.free; 
end; 



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke