AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Addition von Bitmaps

Ein Thema von alfred · begonnen am 20. Aug 2004 · letzter Beitrag vom 20. Aug 2004
Antwort Antwort
alfred

Registriert seit: 17. Mai 2004
31 Beiträge
 
#1

Addition von Bitmaps

  Alt 20. Aug 2004, 09:21
Hi Leute,

wer kennt sich mit Bildverarbeitung aus ? Ich habe folgendes Problem :
Zur Laufzeit soll ein Bild erstellt werden, das aus mehreren Einzelbildern zusammengesetzt werden soll. Es wird ein Ausgangsbild geladen, das nicht transparent ist. Darüber sollen transparente Bilder gelegt werden, so dass am Ende ein neues Bild entsteht, das gewissermaßen die Summe der Einzelbilder darstellt und das anschließend als neues Bild temporär gespeichert werden soll. Annahme : alle Bilder besitzen gleiche Formate (bmp), Größen und Auflösungen. Gibt es irgendwas, was man benutzen könnte, oder hat jemand eine geniale Idee ?
Wenn Größe und Auflösung gleich sind, dann sollte auch die Anzahl der Pixel gleich sein. Unter der Vorgabe, dass bei den Bildern, die ausschließlich zur Komplettierung dienen, nur die relevanten Pixel nicht Weiß sind ( Weiß = Transparentfarbe ), sollte es doch möglich sein, alle Farbcodes, die von Weiß verschieden sind, aus einem Bild heraus zu lesen und diese auf das Basisbild zu übertragen. Das ist zumindest ein theoretischer Ansatz. Bleiben nur die Fragen - ist dieser Ansatz praktikabel und wie liest man die Farbcodes der einzelnen Pixel bzw. wie können diese geändert werden ?

Ich bin für jede Anregung dankbar.

Gruß alfred
  Mit Zitat antworten Zitat
Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#2

Re: Addition von Bitmaps

  Alt 20. Aug 2004, 11:23
Hallo Alfred,
Hier im Forum suchenScanLine benötigst Du auf jeden Fall, um die Pixel Deines Bitmaps
zu ändern. Dabei musst Du darauf achten, dass das Pixelformat
richtig gewählt ist. Am besten, Du schaust Du das Bsp. in der Delphi-
Hilfe zu Scanline mal an.

Genau betrachtet möchtest Du nicht die Summe von Bildern bilden, sondern
den Durchschnitt. Würde man die einzelnen Farbpartikel von Bildern
addieren, so wäre das Ergebnis irgendwann ein weisses Bild.

Die Sache mit den überlappenden Bildern musst Du selbst ausrechnen, also
da gibt es zumindest meines Wissens keine Funktion für.
Du schnappst Dir mit Scanline eine Zeile von Pixeln und dann würde
ich das für jeden Pixel ganz spontan folgendermaßen machen:

Du unterteilst die Pixel in deren RGB-Bytes (entweder selbst shiften
oder die Funktionen in der Windows.pas verwenden). O.k., Du hast
nun also red1, green1, blue1 von einem Pixel des unteren Bildes.
Du schnappst Dir nun den Pixel an der gleichen Position des obereren,
überlappenden Bildes, und kriegst red2, green2 und blue2.
Nun hast Du also 2 Pixel, aus denen Du ein Mittelmaß errechnen möchtest.
am besten á al:
Delphi-Quellcode:
var redNeu, greenNeu, blueNeu : word; // byte würde nicht funktionieren !
redNeu:= (red1 + red2) div 2;
greenNeu:= (green1 + green2) div 2;
blueNeu:= (blue1 + blue2) div 2;
Dies tust Du für jeden Pixel des Bildes.
How much wood would a wood-chuck chuck if a wood-chuck would chuck wood?
Check this out.
DANNYBOY
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Addition von Bitmaps

  Alt 20. Aug 2004, 11:30
Was dir helfen wird, alles ausser dem weiß zu kopieren: Delphi-Referenz durchsuchenTCanvas.Brushcopy und Delphi-Referenz durchsuchenTCanvas.CopyRect
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
alfred

Registriert seit: 17. Mai 2004
31 Beiträge
 
#4

Re: Addition von Bitmaps

  Alt 20. Aug 2004, 11:44
Hallo Dannyboy,

vielen Dank für die ausführliche Erläuterung. Das hilft mir doch schon mal weiter.

Gruß alfred
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Addition von Bitmaps

  Alt 20. Aug 2004, 11:45
Soweit ich das verstanden habe will er ein bild über das andere legen ohne dabei die farben zu mischen.

Ich habe eben mal schnell eine function geschrieben:

Delphi-Quellcode:
Function MergeBitmaps(Src1, Src2, Dest: TBitmap; MaskColor: TColor): Boolean;
Var
  w, h, x: Integer;
  s2, d: PInteger;
Begin
  Result:=False;
  If Not (Assigned(Src1) or Assigned(Src2) or Assigned(Dest)) Then Exit;
  w:=Src1.Width;
  h:=Src1.Height;
  If (w<>Src2.Width) or (h<>Src2.Height) Then Exit;
  Src1.PixelFormat:=pf32Bit;
  Src2.PixelFormat:=pf32Bit;
  Dest.Assign(Src1);
  s2:=Src2.ScanLine[h-1];
  d:=Dest.ScanLine[h-1];
  For x:=1 To w*h Do Begin
    If s2^<>MaskColor Then d^:=s2^;
    Inc(s2);
    Inc(d);
  End;
  Result:=True;
End;
aufgerufen werden kann es zum Beispiel so hier:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var Src1, Src2, Dest: TBitmap;
begin
  Src1:=TBitmap.Create;
  Src2:=TBitmap.Create;
  Dest:=TBitmap.Create;
  Try
    Src1.LoadFromFile('D:\1.bmp');
    Src2.LoadFromFile('D:\2.bmp');
    If MergeBitmaps(Src1, Src2, Dest, clWhite) Then
      Image1.Picture.Bitmap.Assign(Dest);
  Finally
    FreeAndNil(Src1);
    FreeAndNil(Src2);
    FreeAndNil(Dest);
  End;
end;
  Mit Zitat antworten Zitat
alfred

Registriert seit: 17. Mai 2004
31 Beiträge
 
#6

Re: Addition von Bitmaps

  Alt 20. Aug 2004, 11:58
Hi Phantom1,

das sieht schon sehr gut aus. Ich werde das mal checken.
Super - vielen Dank für die Hilfe.

Gruß alfred
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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