Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi RGB zu Alpha (https://www.delphipraxis.net/197574-rgb-zu-alpha.html)

Amateurprofi 20. Aug 2018 23:30

AW: RGB zu Alpha
 
[QUOTE=EWeiss;1411152]
Zitat:

Zitat:

Nur ist es bei dir fehlerhaft programmiert.
Quatsch..

gruss
Noch ein Versuch.

Mach mal
Delphi-Quellcode:
ShowMessage(IntToStr(Rgb2Alpha($FFFFB1)));
// Rgb2Alpha ist die in #1 gezeigte Funktion.
Und dann
Delphi-Quellcode:
ShowMessage(IntToStr(Rgb2Alpha(0)));


Bei mir kommt da in beiden Fällen 0 heraus.
Und nun erklär mit mal, warum Deine "Rgb2Alpha" bei $FFFFB1 (ein sehr helles Cyan) und bei 0 (Schwarz) den gleichen Wert zurückgibt.

EWeiss 20. Aug 2018 23:55

AW: RGB zu Alpha
 
Zitat:

Und nun erklär mit mal, warum Deine "Rgb2Alpha" bei $FFFFB1 (ein sehr helles Cyan) und bei 0 (Schwarz) den gleichen Wert zurückgibt.
Ich berechnet die Luminanz eines Pixels. (Wie einige Leute hier schon erkannt haben)
Lese dir das doch einfach nochmal durch
Und erkenne um was es dabei geht.

Das Thema ist jetzt wirklich beendet für mich.
Aber ihr könnt gerne weiter diskutieren. :)

gruss

Michael II 21. Aug 2018 00:30

AW: RGB zu Alpha
 
Hallo AW,

doch noch rasch:

Apro hat schon Recht; deine Funktion berechnet den Luminanz Wert für die meisten der 256^3 möglichen RGB Werte nicht korrekt.

Sehr einfach kannst du es testen, indem du mit deiner Funktion die Luminanz-Werte von RGB(grau,grau,grau) für grau=0 bis 255 berechnest.

Welche Werte sollte deine Funktion liefern?
In
E'Y = 0,299 E'R + 0,587 E'G + 0,114 E'B
eingesetzt ergibt sich
Y(grau) = 0,299*grau + 0,587*grau + 0,114*grau = grau = id


Deine Funktion liefert jedoch meistens andere Werte (weil du nicht wie Apro dir vorschlägt das jeweilige Farbbyte mittels "and $ff" separierst):

Delphi-Quellcode:
procedure TForm71.Button1Click(Sender: TObject);
var w, grau : byte;
    s : string;
begin
  s := '';
  for grau := 0 to 255 do
  begin
    w := Rgb2Alpha2( RGB( grau, grau, grau ) );
    s := s + w.ToString + ', ';
  end;

  showmessage( s );
end;

EWeiss 21. Aug 2018 02:57

AW: RGB zu Alpha
 
Zitat:

Apro hat schon Recht; deine Funktion berechnet den Luminanz Wert für die meisten der 256^3 möglichen RGB Werte nicht korrekt.
OK.. @Amateurprofi Danke! und entschuldige.
Werde "and $FF" addieren damit sollte das Problem beseitigt sein.

Dachte eigentlich das ich mir das $FF durch das LOBYTE ersparen konnte.
Wenn dem nicht so ist gut dann habe ich wieder was gelernt.
Aufgrund dieser Annahme bin ich davon ausgegangen das meine Berechnung korrekt war. (Nun gut Danke man ist nicht perfekt ;) )

PS:
Sichtbare unterschiede kann ich jedoch nicht ausmachen, zwischen deiner und meiner vorherigen Berechnung.
Egal welche zwischen Werte am ende bei der Berechnung umhinkommen am ende zählt doch nur ob das Ergebnis 0 ist um die schwarzen Pixel zu entfernen.
Alle anderen Farbigen Pixel bleiben erhalten.

Das einzige Problem das ich nun noch habe ist das bei 16Farbigen Icons schwarz komplett entfernt wird.
Siehe shot!

gruss

Schokohase 21. Aug 2018 07:59

AW: RGB zu Alpha
 
Delphi-Quellcode:
LOBYTE
kannst du schon nehmen, allerdings wirkt es in deiner Formel zu spät.

EWeiss 21. Aug 2018 08:06

AW: RGB zu Alpha
 
Zitat:

Zitat von Schokohase (Beitrag 1411168)
Delphi-Quellcode:
LOBYTE
kannst du schon nehmen, allerdings wirkt es in deiner Formel zu spät.

Ok wüsste jetzt zwar nicht warum aber habe es ja jetzt mit and $FF korrigiert Danke ;)

gruss

Schokohase 21. Aug 2018 08:21

AW: RGB zu Alpha
 
Dein Original
Delphi-Quellcode:
Result := LOBYTE(round(colrRGB * 0.2989)) + 
          LOBYTE(round((colrRGB shr 8) * 0.5870)) +
          LOBYTE(round((colrRGB shr 16) * 0.114));
müsste eigentlich so aussehen
Delphi-Quellcode:
Result := round(LOBYTE(colrRGB) * 0.2989) + 
          round(LOBYTE(colrRGB shr 8) * 0.5870) +
          round(LOBYTE(colrRGB shr 16) * 0.114);
Und wenn wir schon dabei sind:
Code:
19595 => 0.2989 * 65536
38470 => 0.5870 * 65536
 7471 => 0.1440 * 65536
Wo ist also der Unterschied ob ich die Luminanz mit
Code:
l = 0.2989 * r + 0.5870 * g + 0.1440 * b
berechne oder mit
Code:
l = ( 19595 * r + 38470 * g + 7471 * b ) / 65536
Genau, es gibt keinen Unterschied, beide Formeln berechnen exakt das Gleiche.

EWeiss 21. Aug 2018 08:32

AW: RGB zu Alpha
 
Zitat:

Genau, es gibt keinen Unterschied, beide Formeln berechnen exakt das Gleiche.
Dann kann ich mir das round ersparen werde das später korrigieren.
Danke.

gruss

KodeZwerg 21. Aug 2018 08:56

AW: RGB zu Alpha
 
Was ich mich die ganze Zeit frage, reicht es nicht aus clFuchsia als Transparent Farbe zu setzen für Icons?

EWeiss 21. Aug 2018 09:17

AW: RGB zu Alpha
 
Zitat:

Zitat von KodeZwerg (Beitrag 1411182)
Was ich mich die ganze Zeit frage, reicht es nicht aus clFuchsia als Transparent Farbe zu setzen für Icons?

Hä?
Systemweit?
Ich muss die Farbe nehmen die vom Icon übergeben wird nicht eine die ich mir wünsche.
Kann den Leuten doch nicht diktieren mit welcher Hintergrundfarbe die ihre Icons zeichnen die sind nun mal so ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr.
Seite 3 von 4     123 4      

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