Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zwei transparte bilder verbinden. (https://www.delphipraxis.net/74449-zwei-transparte-bilder-verbinden.html)

Karstadt 3. Aug 2006 13:41


Zwei transparte bilder verbinden.
 
Hallo. wie kann ich zwei Bilder auf einander liegen (die bilder können die transparenten farben haben).

MFG

DGL-luke 3. Aug 2006 13:59

Re: Zwei transparte bilder verbinden.
 
was für bilder genau?

Du könntest es mit Graphics32 (www.graphics32.org) machen, entweder mit layers, oder indem du einfach das eine auf das andere zeichnest (evtl. musst du da ein paar optionen einschalten).

Ansonsten kannst du das natürlich selber machen:

Delphi-Quellcode:
function Combine(Bottom, Top: TBitmap; alpha: array of Byte): TBitmap;
var btmptr,topptr,resptr: Pointer;
begin
  if length(alpha) < Top.Width * Top.Height then
    raise Exception.Create('nicht genug alpha!');

  Result := TBitmap.Create;
  Result.Width := Bottom.Width;
  Result.Height := Bottom.Height;

  btmptr := Bottom.Scanline[0];
  topptr := Top.Scanline[0];
  resptr := Result.Scanline[0];
  for i := 0 to high(alpha) do
    begin
      resptr^ := CombineColors(btmptr^,topptr^,alpha[i]);

      Inc(btmptr);
      Inc(topptr);
      Inc(resptr);
    end;
end;

function CombineColors(c1,c2: TColor; fac: Byte): TColor;
begin
  Result.Red := Round(c1.Red * (255-fac) / 255 + c2.Red * fac / 255);
  //das selbe für grün und blau, und evtl. muss man das erst mal in einen anderen record pressen, damit die felder verfügbar sind
end;
Keine Garantie auf Fehlerfreiheit, höchstwahrscheinlich muss man da noch einiges umcasten.

Khabarakh 3. Aug 2006 14:21

Re: Zwei transparte bilder verbinden.
 
Mit Transparenzfarbe: MSDN-Library durchsuchenTransparentBlt
Mit Alphakanal: MSDN-Library durchsuchenAlphaBlend

oder eben GR32 ;) .

Gandalfus 3. Aug 2006 18:11

Re: Zwei transparte bilder verbinden.
 
Nimm doch gleich DirectX oder Opengl.
Warum einfach wenn es auch schwer geht.

DGL-luke 3. Aug 2006 19:13

Re: Zwei transparte bilder verbinden.
 
Gandalfus: Meinst du etwa, Photoshop benutzt OpenGL oder DirectX, um zwei Layer anzuzeigen? :shock:

Die Eingine zu initialisieren, Quads/Sprites erstellen und dann die Bilder als Texturen drauf... neee... das wär mir dann doch ein wenig zu overpowered.

Gandalfus 3. Aug 2006 19:54

Re: Zwei transparte bilder verbinden.
 
Ich meine das man dazu nicht Graphics32(oder kryptische Api Befehle) braucht sondern GDI bzw TCanvas völlig ausreicht.

Khabarakh 3. Aug 2006 20:27

Re: Zwei transparte bilder verbinden.
 
Zitat:

Zitat von Gandalfus
GDI

*hust* Rate mal, woher die beiden nun wirklich simplen API-Funktionen stammen. Für erstere Funktion gäbe es als Wrapper noch TCanvas.Draw (besser gesagt TBitmap.Draw), aber ein paar Argumente mehr sind hoffentlich noch kein Weltuntergang.

Karstadt 4. Aug 2006 22:35

Re: Zwei transparte bilder verbinden.
 
[Fehler] Unit1.pas(43): Inkompatible Typen: 'TColor' und 'procedure, untyped pointer or untyped parameter'

:(

Khabarakh 4. Aug 2006 22:48

Re: Zwei transparte bilder verbinden.
 
Die Fehlermeldung sagt doch schon alles: Du dekrementierst die Zeilennummer um 1 und bekommst die Antwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest.

Du könntest auch ein paar Glaskugeln für die DP-Member spenden. Oder beten, das soll manchmal auch helfen. Aber komm bloß nicht auf die Idee, uns den Code von Zeile 43 zu zeigen, da könnten wir ja gleich mit Raten anfangen.

PS: Nimm lieber die genannten GDI-Funktionen. Deren Richtigkeit haben schon Tausende von Programmmieren bestätigt ;) .

Karstadt 5. Aug 2006 10:49

Re: Zwei transparte bilder verbinden.
 
habe das so gelöst.

Delphi-Quellcode:
var
  overlay: TBitmap;
  ziel: TBitmap;
begin
  overlay := TBitmap.create;
  overlay.loadfromfile('xxxxxxxxxxx');
  overlay.transparentcolor := clblue;
  overlay.transparent := true;
  ziel := TBitmap.create;
  ziel.loadfromfile('xxxxxxxxxxx');

  ziel.canvas.draw(x,y,overlay); //übereinander zeichen
   
  Form1.canvas.draw(0,0,ziel); //Das ganze noch irgendwo anzeigen
Die lösung kommt aus einen anderen Forum. Das ist einfacher (finde ich). Für euere Lösung bin ich auch sehr dankbar!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 Uhr.
Seite 1 von 2  1 2      

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