![]() |
Erklärung zu RGBTriple
Hallo,
habe in meinem Programm, in welchem Bilder bearbeitet werden, im Deklarationsteil folgenden Pointer definiert: rgb:PRGBTriple; Nun bräuchte ich für meine Doku eine Erklärung. Habe schon in Delphi Hilfen geschaut, doch finde für mich keine verständliche Erklärung. Meine genaue Frage ist, was ist RGBTriple? Gruss Funk |
Re: Erklärung zu RGBTriple
Das RGP-Triple speichert eine Farbe als 3 Informationen. Den Rotwert (R), den Grünwert (G) den Blauwert (B).
Jeder dieser Werte hat einen Wert von 0 bis 255 wobei 0 nicht vorhanden und 255 voll bedeutet. Flare |
Re: Erklärung zu RGBTriple
Das heißt, dass bei der Zuweisung
rgb := Bild.ScanLine[0] die Information des ersten Pixel links-oben in dem RGBTriple gespeichert ist? Funk |
Re: Erklärung zu RGBTriple
Ich selber habe noch nie mit Scanline oder ähnlichen Befehlen gearbeitet. Aber meiner Meinung nach ergibt das nicht das oberste-linke Pixel sondern eher die oberste Linie.
Flare |
Re: Erklärung zu RGBTriple
Es ergibt einen Pointer auf den Anfang der ersten Zeile, und das ist nunmal links oben ;) .
|
Re: Erklärung zu RGBTriple
Scanline[0] gibt in diesem Falle die letzte Zeile im Bitmap zurück da Bitmaps zeilenweise umgekehrt organisiert sind. Ist zwar "blödsinnig" aber halt mal so im Windows.
Was nun über ScanLine angesprochen wird hängt vom Bitmap Pixelformat ab. Du solltes mit Bitmap.PixelFormat := pf32Bit arbeiten da nun über ScanLine per LongWord auf einen Pixel zugegriffen werden kann. Bei anderen Pixelformaten müsstest du umständlich die Farbdaten dekodieren oder bei <= pf256Bit sogar über die Farbtabelle der Bitmap gehen. Gruß Hagen |
Re: Erklärung zu RGBTriple
Hallo,
Zitat:
Gruß xaromz |
Re: Erklärung zu RGBTriple
Zitat:
Gruß Der Unwissende |
Re: Erklärung zu RGBTriple
Also nach der Definition eines BitMaps, ist das erste Pixel links-unten und dann wird Zeilenweise nach oben gezählt.
(war das beim Canvas von TPrinter nicht auch so?) |
Re: Erklärung zu RGBTriple
//Edit: Alles gelöscht...habe ein von als und gelesen :wall:
Flare |
Re: Erklärung zu RGBTriple
Himitsu hat absolut Recht. Es ist dabei wurscht warum das Windows so macht, wichtig sind zwei Punkte
1.) es ist eine blödsinnige Speicherorganisation die für heutige Verhältnisse unbegründet ist. Früher hatte das mal einen sinnvollen Grund. 2.) es ist so das der Linksoben Pixel also im Speicher Linksunten gespeichert ist und ScanLine[Height-1] also die oberste Pixelzeile addressiert. Dabei geht es mir hier NICHT darum das die Indizierungen von ScanLine[] als Array[] durch die VCL intern schon den Speicher korrekt adressiert, sondern um die Fragestellung wie ein Zeiger auf die Pixeldaten inkerementiert werden muß und mit welcher ScanLine[] wir auf den Begin dieses Speichers zugreifen. Denn das virtuelle Umrechnen über ScanLine[] mcht nur dann Sinnn wenn man die Bitmap zeilenweise abarbeitet und dabei über ScanLine[] immer den zeiger neu holt. Dies ist aber in der Performance sehr ineffizient da der Canvas bem Zugriff auf ScaneLine einiges an zusätzlichen Code intern abarbeitet. Besser ist es nur einmalig einen Zeiger auf die Erste Zeile der Bitmap zu holen und diesen Zeiger dann auch Zeilenweise zu inkrementieren. Exakt in diesem Moment ist es wichtig zu wissen das man mit ScanLine[0] eben an das Ende des Speichers der Pixeldaten positioniert und dieser Zeiger im Verlauf des Algos. also dekrementiert werden muß. Das und nichts anderes sollte mein Posting anmerken ! Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 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-2025 by Thomas Breitkreuz