AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren
Thema durchsuchen
Ansicht
Themen-Optionen

Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren

Ein Thema von Real_Thunder · begonnen am 12. Nov 2014 · letzter Beitrag vom 13. Nov 2014
Antwort Antwort
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#1

Farbwerte von 24 Bit RGB zu 16 Bit RGB (565) konventieren

  Alt 12. Nov 2014, 18:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 12. Nov 2014, 21:35
Wo ist denn das Problem genau?
  • Errechnen der Einzel-Farbwerte? (Dreisatz)
  • Zusammenbauen zum 16-Bit Wert?
865%
2556331100
127311550
0000
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (12. Nov 2014 um 21:42 Uhr)
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#3

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

  Alt 13. Nov 2014, 00:17
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) ))
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

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

  Alt 13. Nov 2014, 02:11
Zur Info Dreisatz

und eine Antwort dazu auf StackOverflow

Wenn es genauer sein soll, dann eben den Dreisatz bemühen, sonst einfaches Bitschieben
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 13. Nov 2014, 08:54
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (13. Nov 2014 um 08:57 Uhr)
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#6

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

  Alt 13. Nov 2014, 09:38
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 13. Nov 2014, 10:55
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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