Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi transparentes Bild über Bild ausgeben (https://www.delphipraxis.net/11678-transparentes-bild-ueber-bild-ausgeben.html)

HAF4ever 11. Nov 2003 17:49


transparentes Bild über Bild ausgeben
 
Hallo zusammen ...

Ich habe 2 Jpeg Bilder.
Die Lasse ich anzeigen in Image1 und Image2.
Bis hierhin geht es noch.

Nur will ich nun das Bild in Image2 recht unten im Image1 einfügen und zwar transparent ...
:wall: aber ich hab keine Ahnung wie ich das machen kann.

Das ist sicher kein Problem für jemanden, der sich schon mit Grafikprogrammierung beschäftigt hat.


Danke schon im vorraus.

toms 11. Nov 2003 18:31

Re: transparentes Bild über Bild ausgeben
 
hi!

Habe erst letzthin folgende Funktion gebraucht.
Vielleicht kannst du noch Trys und Excepts an der richtigen Stelle einsetzen.


Delphi-Quellcode:
procedure DrawTransparentBitmap(DC : HDC; hBmp : HBITMAP;
  xStart : integer; yStart : integer; cTransparentColor : COLORREF);
var
  bm : BITMAP;
  cColor : COLORREF;
  bmAndBack, bmAndObject, bmAndMem, bmSave : HBITMAP;
  bmBackOld, bmObjectOld, bmMemOld, bmSaveOld : HBITMAP;
  hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave : HDC;
  ptSize : TPOINT;
begin
  hdcTemp := CreateCompatibleDC(dc);
  SelectObject(hdcTemp, hBmp);  // Select the bitmap

  GetObject(hBmp, sizeof(BITMAP), @bm);
  ptSize.x := bm.bmWidth;           // Get width of bitmap
  ptSize.y := bm.bmHeight;          // Get height of bitmap
  DPtoLP(hdcTemp, ptSize, 1);       // Convert from device
  // to logical points

  // Create some DCs to hold temporary data.
  hdcBack := CreateCompatibleDC(dc);
  hdcObject := CreateCompatibleDC(dc);
  hdcMem := CreateCompatibleDC(dc);
  hdcSave := CreateCompatibleDC(dc);

  // Create a bitmap for each DC. DCs are required for a number of
  // GDI functions.

  // Monochrome DC
  bmAndBack := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil);

  // Monochrome DC
  bmAndObject := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil);

  bmAndMem := CreateCompatibleBitmap(dc, ptSize.x, ptSize.y);
  bmSave := CreateCompatibleBitmap(dc, ptSize.x, ptSize.y);

  // Each DC must select a bitmap object to store pixel data.
  bmBackOld := SelectObject(hdcBack, bmAndBack);
  bmObjectOld := SelectObject(hdcObject, bmAndObject);
  bmMemOld := SelectObject(hdcMem, bmAndMem);
  bmSaveOld := SelectObject(hdcSave, bmSave);

  // Set proper mapping mode.
  SetMapMode(hdcTemp, GetMapMode(dc));

  // Save the bitmap sent here, because it will be overwritten.
  BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

  // Set the background color of the source DC to the color.
  // contained in the parts of the bitmap that should be transparent
  cColor := SetBkColor(hdcTemp, cTransparentColor);

  // Create the object mask for the bitmap by performing a BitBlt
  // from the source bitmap to a monochrome bitmap.
  BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,
    SRCCOPY);

  // Set the background color of the source DC back to the original
  // color.
  SetBkColor(hdcTemp, cColor);

  // Create the inverse of the object mask.
  BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,
    NOTSRCCOPY);

  // Copy the background of the main DC to the destination.
  BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, dc, xStart, yStart,
    SRCCOPY);

  // Mask out the places where the bitmap will be placed.
  BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);

  // Mask out the transparent colored pixels on the bitmap.
  BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);

  // XOR the bitmap with the background on the destination DC.
  BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);

  // Copy the destination to the screen.
  BitBlt(dc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0,
    SRCCOPY);

  // Place the original bitmap back into the bitmap sent here.
  BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);

  // Delete the memory bitmaps.
  DeleteObject(SelectObject(hdcBack, bmBackOld));
  DeleteObject(SelectObject(hdcObject, bmObjectOld));
  DeleteObject(SelectObject(hdcMem, bmMemOld));
  DeleteObject(SelectObject(hdcSave, bmSaveOld));

  // Delete the memory DCs.
  DeleteDC(hdcMem);
  DeleteDC(hdcBack);
  DeleteDC(hdcObject);
  DeleteDC(hdcSave);
  DeleteDC(hdcTemp);
end;

HAF4ever 11. Nov 2003 21:59

Re: transparentes Bild über Bild ausgeben
 
thx für die antwort
das werd ich gleich morgen mal testen

Gandalfus 12. Nov 2003 14:27

Re: transparentes Bild über Bild ausgeben
 
hier mal die grunlegende vorgehensweise.
jpeg zu normalen TBitmaps
Paintbox anstelle von Timage benutzen

canvas.transparnent := true;
transparent color := cl blue;
canvas.draw()


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz