// Hiermit kann man ein Bild (evtl. versetzt) teiltransparent über andere
// Bilder bzw. Flächen legen. Der Wert von
Transparenz bestimmt dabei
// die Durchsichtigkeit:
//
0 = undurchsichtig ... 255 = komplett durchsichtig.

// Getestet mit D4 unter Win98

uses jpeg; 
var 
  bm1, bm2: TBitmap; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  bm1 := TBitmap.create; 
  bm2 := TBitmap.create; 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  bm2.free; 
  bm1.free; 
end; 
 
function vermischt(gr1, gr2: TGraphic; xversatz, yversatz: integer; 
  Transparenz: byte): tbitmap; 
var x, y, h, b, l, o: integer; 
  p1, p2: PBytearray; 
  procedure zuweisen(bm: TBitmap; gr: TGraphic); 
  begin 
    if gr is TIcon then begin 
      bm.width := gr.width; 
      bm.height := gr.height; 
      bm.canvas.draw(0, 0, gr); 
    end else bm.assign(gr); 
  end; 
begin 
  zuweisen(bm1, gr1); 
  zuweisen(bm2, gr2); 
  bm1.pixelformat := pf24bit; 
  bm2.pixelformat := pf24bit; 
  result := bm1; 
  h := yversatz + bm2.height - 1; 
  if h > result.height - 1 then h := result.height - 1; 
  if yversatz < 0 then o := 0 else o := yversatz; 
  xversatz := xversatz * 3; 
  if xversatz < 0 then l := 0 else l := xversatz; 
  b := xversatz + bm2.width * 3 - 1; 
  if b > result.width * 3 - 1 then b := result.width * 3 - 1; 
  for y := o to h do begin 
    p1 := result.scanline[y]; 
    p2 := bm2.scanline[y - yversatz]; 
    for x := l to b do begin 
      p1[x] := (p1[x] * transparenz + p2[x - xversatz] * (255 - transparenz)) 
        div 255; 
    end; 
  end; 
end; 
 
// ein Bild wird nach rechts unten versetzt 
// halbtransparent über ein anderes Bildes gelegt 
procedure TForm1.Button3Click(Sender: TObject); 
var basis, auflage: tbitmap; 
  links, oben: integer; 
begin 
  basis := tbitmap.create; 
  auflage := tbitmap.create; 
  basis.loadfromfile('d:\bilder\m\b002.bmp'); 
  auflage.loadfromfile('d:\bilder\m\b005.bmp'); 
  links := basis.width div 3; 
  oben := basis.height div 3; 
  canvas.draw(0, 0, vermischt(basis, auflage, links, oben, 128)); 
  auflage.free; 
  basis.free; 
end; 
 
// ein Bild wird mit einem anderen überblendet 
procedure TForm1.Button4Click(Sender: TObject); 
var basis, auflage: tbitmap; 
  x, schwelle, stufe: byte; 
begin 
  x := 255; 
  schwelle := 170; 
  stufe := 3; 
  basis := tbitmap.create; 
  auflage := tbitmap.create; 
  basis.loadfromfile('d:\bilder\m\b002.bmp'); 
  auflage.loadfromfile('d:\bilder\m\b011.bmp'); 
  schwelle := (schwelle div stufe) * stufe; // Teilbarkeit sicherstellen 
  x := (x div stufe) * stufe; 
  canvas.draw(0, 0, basis); 
  repeat 
    dec(x, stufe); 
    canvas.draw(0, 0, vermischt(basis, auflage, 0, 0, x)); 
    application.processmessages; 
    if x = schwelle then x := stufe; 
  until x = 0; 
  auflage.free; 
  basis.free; 
end; 
 
// der untere Teil eines Bildes verschwindet von Form1 
procedure TForm1.Button5Click(Sender: TObject); 
var basis: TJpegImage; 
  auflage: tbitmap; 
  x, schwelle, stufe: byte; 
  halb: integer; 
begin 
  x := 245; 
  schwelle := 120; 
  stufe := 4; 
  basis := tjpegimage.create; 
  auflage := tbitmap.create; 
  basis.loadfromfile('d:\zeitung\monalisa.jpg'); 
  auflage.width := basis.width; 
  halb := basis.height div 2; 
  auflage.height := halb; 
  auflage.canvas.brush.color := color; 
  auflage.canvas.fillrect(auflage.canvas.cliprect); 
  x := (x div stufe) * stufe; 
  schwelle := (schwelle div stufe) * stufe; 
  canvas.draw(0, 0, basis); 
  repeat 
    dec(x, stufe); 
    canvas.draw(0, 0, vermischt(basis, auflage, 0, halb + 1, x)); 
    application.processmessages; 
    if x = schwelle then x := stufe; 
  until x = 0; 
  auflage.free; 
  basis.free; 
end; 
 
// ein Icon wird in ein JPeg eingeblendet 
procedure TForm1.Button6Click(Sender: TObject); 
var auflage: TIcon; 
  basis: TJPegImage; 
  x, schwelle, stufe: byte; 
begin 
  x := 255; 
  schwelle := 175; 
  stufe := 2; 
  auflage := ticon.create; 
  basis := tjpegimage.create; 
  auflage.loadfromfile('d:\icon2\raum.ico'); 
  basis.loadfromfile('d:\zeitung\monalisa.jpg'); 
  schwelle := (schwelle div stufe) * stufe; // Teilbarkeit sicherstellen 
  x := (x div stufe) * stufe; 
  canvas.draw(100, 100, basis); 
  repeat 
    dec(x, stufe); 
    canvas.draw(100, 100, vermischt(basis, auflage, 0, 0, x)); 
    application.processmessages; 
    sleep(50); 
    if x = schwelle then x := stufe; 
  until x = 0; 
  auflage.free; 
  basis.free; 
end;



Zugriffe seit 6.9.2001 auf Delphi-Ecke