Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Frage zu ScanLine (https://www.delphipraxis.net/74625-frage-zu-scanline.html)

Koller 6. Aug 2006 19:04


Frage zu ScanLine
 
Delphi-Quellcode:
 //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:

igel457 6. Aug 2006 20:01

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?

SirThornberry 6. Aug 2006 20:19

Re: Frage zu ScanLine
 
Zitat:

Zitat von igel457
Zweitens: Hast du eingentlich mal ausbrobiert Line3.rgbBlue := 255, um zu schauen ob es vieleicht nicht an etwas anderem liegt?

Wenn er ein weißes Bild hat ist rgbBlue bereits 255 :wink: Also zu Testzwecken lieber auf 0 setzen damit es auch eine Auswirkung hat.

Muetze1 6. Aug 2006 20:27

Re: Frage zu ScanLine
 
Zitat:

Zitat von igel457
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.

Warum sollte man? 24 bpp bedeutet, das jeder 2. Pixel an einer ungerade Adresse liegt und erst jeder 4. Pixel aligned ist. Und Aligned bringt viel mehr Vorteile, bei allen anderen müsste der Prozessor bzw. der pre-catch bis zu 2 Lesezyklen machen um den Inhalt zu bekommen. Wenn, dann macht man es mit 32 bpp.

Koller 6. Aug 2006 20:33

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.

Koller 6. Aug 2006 21:47

Re: Frage zu ScanLine
 
Delphi-Quellcode:
 showmessage('vorher: '+inttostr(Picture1.Height));
 Picture1.Bitmap.PixelFormat := pf32Bit;
 Picture2.Bitmap.PixelFormat := pf32Bit;
 showmessage('nachher: '+inttostr(Picture1.Height));
Die erste Ausgabe ist 557 und danach 0. Warum? Muss das so? Dann wird die for-Schleife danach ja nur einmal ausgeführt.

Muetze1 7. Aug 2006 10:07

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.

Koller 7. Aug 2006 10:16

Re: Frage zu ScanLine
 
Kann man denn auch JPEGs in ein TBitmap laden, oder muss man die vorher umwandeln?

Muetze1 7. Aug 2006 10:35

Re: Frage zu ScanLine
 
Zitat:

Zitat von Koller
Kann man denn auch JPEGs in ein TBitmap laden, oder muss man die vorher umwandeln?

Ich wüsste nicht, dass man JPEGs in Bitmaps laden kann. TPicture ist bei einem geladenem JPEG vom Typ TJPEGImage und nicht TBitmap. Du musst es entsprechend umwandeln - ob nun du oder TPicture dies macht.


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