Autor Beitrag
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: So 06.08.06 12:15 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
 //Farbtiefe der beiden Pictures auf 32 bit setzen
       Picture1.Bitmap.PixelFormat := pf32Bit;
       Picture2.Bitmap.PixelFormat := pf32Bit;
       //in einer Zählschleife Zeile für Zeile durchgehen
       for y := 0 to Picture1.Bitmap.Height - 1 do
       begin
         //per ScanLine die Zeile auslesen
         Line1 := Picture1.Bitmap.ScanLine[y];
         Line2 := Picture2.Bitmap.ScanLine[y];
         Line3 := Target.Bitmap.ScanLine[y];
         //die ausgelesenen Zeilen von links nach rechts durchgehen
         for x := 0 to Picture1.Bitmap.Width - 1 do
         begin
           //die Farbe des aktuellen Pixels von Picture1 berechnen
           tempColor1 := RGB(Line1.rgbRed,Line1.rgbGreen,Line1.rgbBlue);
           //die Farbe des aktuellen Pixels von Picture2 berechnen
           tempColor2 := RGB(Line2.rgbRed,Line2.rgbGreen,Line2.rgbBlue);
           //je nachdem, welches Bild oben ist, die Mischfarbe berechnen
           if (PictureAboveID = 1) then
             tempColor3 := MixColor(tempColor1,tempColor2,AlphaBlendValue)
           else
             tempColor3 := MixColor(tempColor2,tempColor1,AlphaBlendValue);
           //in den aktuellen Pixel des Ziel-Pictures die Mischfarbe schreiben
           wird durch die folgenden drei Anweisungen die neue Farbe geschrieben
           Line3.rgbBlue := GetBValue(tempColor3);
           Line3.rgbGreen := GetGValue(tempColor3);
           Line3.rgbRed := GetRValue(tempColor3);

           //die drei Pointer inkrementieren, um zum nächsten Pixel zu gelangen
           inc(Line1);
           inc(Line2);
           inc(Line3);
         end;

Ich berechne die Mischfarbe zweier TColor und will sie in Target.Bitmap schreiben. Wird durch die drei markierten Anweisungen die neue Farbe auch geschrieben, weil ich bei der Ausgabe nur ein weißes Bild erhalte? :gruebel:

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
Heider
Hält's aus hier
Beiträge: 11

WinXP Prof. SP2
Delphi 7, Vis. C++ 6
BeitragVerfasst: Mi 09.08.06 15:16 
So wie ich das seh, ist dein line3 ein Zeiger und damit die Farbe auch in das Bild geschrieben wird musst du sie dereferenzieren, in etwas so:
ausblenden Delphi-Quelltext
1:
line3^.rgbBlue := GetBValue(tempColor3);					

ebenso solltes du weiter oben, wenn du die Farben einliest den Zeiger dereferenzieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
           //die Farbe des aktuellen Pixels von Picture1 berechnen
           tempColor1 := RGB(Line1^.rgbRed,Line1^.rgbGreen,Line1^.rgbBlue);
           //die Farbe des aktuellen Pixels von Picture2 berechnen
           tempColor2 := RGB(Line2^.rgbRed,Line2^.rgbGreen,Line2^.rgbBlue);

wenn du in der Funtion RGB die Farbwerte übergeben willst und nicht nur die Adressen wo sie stehen. Wunder mich eigentlich das du keinen Fehler vom Compiler, bzw einen Speicherzugriffsfehler hattest

_________________
"Zwei Dinge sind undendlich, das Universum und die Menschliche Dummheit, obwohl ich mir beim Universum nicht sicher bin." Albert Einstein
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 09.08.06 15:29 
user profile iconMarco D. hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
           //die drei Pointer inkrementieren, um zum nächsten Pixel zu gelangen
           inc(Line1);
           inc(Line2);
           inc(Line3);
         end;



wenn ich das richtig verstanden habe, wird immer nur das erste Pixel einer Zeile gelesen und dann auf die nächste Zeile im bild gesprungen ?
Durch das inc(line_) wird doch die zeile um eins erhöht, aber du willst doch eigentlich erstmal die 'Spalten' einer zeile innerhalb deiner 2ten for-schleife durchlaufen ?
die 3 inc()-Anweisungen müssten also nach dem end; der 2ten schleife kommen,oder?

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Heider
Hält's aus hier
Beiträge: 11

WinXP Prof. SP2
Delphi 7, Vis. C++ 6
BeitragVerfasst: Mi 09.08.06 16:15 
das ist so nicht richtig, mit scanline[y], wählt man den Adresspunkt der Zeile Y und mit inc[zeiger] setzt man den Zeiger auf den nächsten pixel in der Zeile

_________________
"Zwei Dinge sind undendlich, das Universum und die Menschliche Dummheit, obwohl ich mir beim Universum nicht sicher bin." Albert Einstein