Wenn du versuchst ein Bildbearbeitungsprogramm zu schreiben, dass tu dir bitte einen gefallen und übergib keine Konponenten an deine Methoden. Sondern benutz lieber die Klasse TBitmap. Denn du kannst nicht immer davon ausgehen, dass du auch tatsächlich eine Komponente haben wirst.
Als zweites auch wenn es derzeit noch nicht so wichtig ist. Bitte die Variablen nicht 1, 2, 3 benennen. Image 1 und 2 mögen beim Addieren okay sein aber das Ausgabebild ist nicht klar erkenntlich.
Jetzt aber zu dem eigentlichen Problem. Als erstes solltest du überprüfen ob die Auflösung und die Farbtiefe der Bilder gleich sind. Also überprüfen ob Width, Height und PixelFormat den gleichen Werte haben. Besonders ein gleiches Pixelformat ist wichtig. Evtl solltest du diese derzeit auch einfach Stumpf auf pf32Bit setzen.
Dann etwas zum Detail der Daten die sich in den Scanlines befinden. Dort hast du echte Bilddaten. Je nach dem PixelFormat können diese auch komplett anders aussehen. Bei 32 Bit hat jedes Pixel 4 Byte. Das erste Byte ist der blaue Farbkanal. Das Zweite der Grüne. Der Dritte der Rote und der Vierte ist unbenutzt bzw kann für den Alpha "missbraucht" werden. Mit anderen Worten Sieht es so aus.
XXXXXXXX Bei 24 Bit würde der letzte Kanal wegfallen sonst ist es gleich.
Das Addieren ist zwar gerade ein einfaches Beispiel aber normal ist das ein Modus den ich persönlich eher nicht verwende. Außerdem musst du aufpassen, dass die Werte nicht zu hoch werden. Aber für den Anfang ist das gerade okay.
Dein Code ist vom Prinzip her schon richtig allerdings fehlen noch ein paar Kleinigkeiten. Bei dem Ausgabebild musst du eine Höhe/Breite und Farbtiefe setzen. Damit würdest du also ein Ausgabebild erzeugen. Und mittels Scanline könntest du dort hineinschreiben. Ich würde dir allerdings auch empfehlen kein ByteArray zu benutzen sondern eher ein PRGBQuad (für 32 Bit) oder ein PRGBTriple (für 24 Bit). Denn dann hättest du alle Daten eines Pixels sofort parat.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure AddImage(Source1, Source2, Dest: TImage); var X, Y: Integer; pDest, pSource1, pSource2: PRGBQuad; begin for Y := 0 to Source1.Height -1 do begin pSource1 := Source1.ScanLine[Y]; pSource2 := Source2.ScanLine[Y]; pDest := Dest.ScanLine[Y];
for X := 0 to Source1.width -1 do begin Dest^.rgbRed := Source1^.rgbRed + Source2^.rgbRed; Dest^.rgbGreen := Source1^.rgbGreen + Source2^.rgbGreen; Dest^.rgbBlue := Source1^.rgbBlue + Source2^.rgbBlue;
Inc(pSource1); Inc(pSource2); Inc(pDest); end; end; end; |
In diesem Code ist es wichtig die Pointer der Scanlines per Hand weiter zu setzen. Vorher hattes du ein Array wo du X reingereicht hattest. Jetzt ist es ein einzelner Pointer. Wenn du lieber Arrays magst kannst du auch so etwas definieren. Und dann das PRGBQuadArray benutzen. Technisch gesehen gibt es da keinen Unterschied. Ist geschmackssache.
Delphi-Quelltext
1: 2:
| PRGBQuadArray = ^TRGBQuadArray; TRGBQuadArray = array [0..$FFFF] of TRGBQuad; |
PS: Falls das jetzt zu viel auf einen Schlag war und du Fragen hast. Tu dir keinen Zwang an.

Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.