Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren (https://www.delphipraxis.net/182713-farbwerte-von-24-bit-rgb-zu-16-bit-rgb-565-konventieren.html)

Real_Thunder 12. Nov 2014 17:46

Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren
 
Moin erstmal,
ich hänge hier ein wenig fest, da ich die entsprechende Formel nicht herausbekomme.
Ich habe ein TImage und lese dort die Pixelfarben stück für stück aus.
nun soll mein Progrämmchen diese Farben als RGB 565 Ausgeben.
Wäre Nett wenn mir jemand helfen könnte.
Kurzfassung: aus TColor bzw. den einzelnen RGB (8Bit) Werten einen RGB 565 (16 Bit) Wert zaubern.

Sir Rufo 12. Nov 2014 20:35

AW: Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren
 
Wo ist denn das Problem genau?
  • Errechnen der Einzel-Farbwerte? (Dreisatz)
  • Zusammenbauen zum 16-Bit Wert?
865%
2556331100
127311550
0000

mensch72 12. Nov 2014 23:17

AW: Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren
 
ein Zusammenhang mit einem Dreisatz erschließt sich mir hier nicht... ich empfehle ganz einfaches binäres ausmaskieren und Bit-Schieben:

rgb24 : DWORD;
rgb16 : WORD;

//xxxxxxxx RRRRRrrr GGGGGGgg BBBBBbbb -> RRRRRGGG GGGBBBBB
//eventuell ist Rot&Bbau vertauscht, das ist aber wurscht weil symmetrisch

rgb16:=WORD(DWORD( ((rgb24 and $f80000) shr 8) or ((rgb24 and $fc00) shr 5) or ((rgb24 and $f8) shr 3) ))

Sir Rufo 13. Nov 2014 01:11

AW: Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren
 
Zur Info Dreisatz

und eine Antwort dazu auf StackOverflow

Wenn es genauer sein soll, dann eben den Dreisatz bemühen, sonst einfaches Bitschieben

himitsu 13. Nov 2014 07:54

AW: Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren
 
Das binäre Schieben ist am Ende auch nur der Dreisatz, wenn man es mathematisch betrachtet.

Einziger Unterschied:
  • 24-Bit-RGB (TColor) kann man schön einfach über eine passende API zerlegen (Delphi-Referenz durchsuchenGetRValue usw.),
    oder man macht das mathematisch (DIV und MOD)
    oder man macht über binäres maskieren und rumgeschiebe (SHR und AND)
  • während es bei dem 16-Bit-RGB die API nicht gibt.

Die Einzelwerte dann wieder zu dem Gesammtwert zusammensetzen geht dann andersrum und man kann auch gleich zerlegen und zusammensetzen auch schön in einer "Formel" zusammenfassen.


Ach ja, bei den binären Wegen wird immer abgerundet, außer man rechnet (addiert) vorher noch bissl was drauf. (gibt ja keinen Nachkommaanteil)

mensch72 13. Nov 2014 08:38

AW: Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren
 
Eine "API" für RGB16...(eventuell ist rot und blau vertauscht)

r := BYTE(WORD((rgb16 shr 11) and $1f))); //GetR16value
g := BYTE(WORD((rgb16 shr 5) and $3f))); //GetG16value
b := BYTE(WORD(rgb16 and $1f)); //GetB16value

himitsu 13. Nov 2014 09:55

AW: Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren
 
In Delphi (Windows) war TColor nur in einer Reihenfolge.

Für iOS/OSX oder so, wo das andersrum ist, gibt es in TColorRec, bzw. TAlphaColorRec (hieß doch so?) entsprechende Helper-Methoden, welche sich ans entsprechende Endianess anpassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz