![]() |
Frage zu ScanLine
Delphi-Quellcode:
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:
//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; |
Re: Frage zu ScanLine
Erstens: Von was für einem Typ sind Line1, 2 und 3? Ist das auch für 32Bit Farbtiefe geeignet? Normalerweise nimmt man da pf24Bit.
Zweitens: Hast du eingentlich mal ausbrobiert Line3.rgbBlue := 255, um zu schauen ob es vieleicht nicht an etwas anderem liegt? |
Re: Frage zu ScanLine
Zitat:
|
Re: Frage zu ScanLine
Zitat:
|
Re: Frage zu ScanLine
Ich stelle gerade fest, es liegt nicht unbedingt an diesem Code :coder2:
Eine boolean-Variable ist komischerweise false, sodass die if-Abfrage darüber nicht true ist und der Code gar nicht ausgeführt wird. Ich probiere mal den Fehler im gesamten Projekt zu finden. |
Re: Frage zu ScanLine
Delphi-Quellcode:
Die erste Ausgabe ist 557 und danach 0. Warum? Muss das so? Dann wird die for-Schleife danach ja nur einmal ausgeführt.
showmessage('vorher: '+inttostr(Picture1.Height));
Picture1.Bitmap.PixelFormat := pf32Bit; Picture2.Bitmap.PixelFormat := pf32Bit; showmessage('nachher: '+inttostr(Picture1.Height)); |
Re: Frage zu ScanLine
Picture1.Height und Picture1.Bitmap.Height sind unterschiedliche Dinge.
Grundlegend würde ich dir aber raten mit TBitmaps zu arbeiten die nicht in einem TPicture Objekt gekapselt sind. |
Re: Frage zu ScanLine
Kann man denn auch JPEGs in ein TBitmap laden, oder muss man die vorher umwandeln?
|
Re: Frage zu ScanLine
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz