Delphi-PRAXiS

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)

EWeiss 17. Aug 2018 21:38


RGB zu Alpha
 
Kann jemand helfen ?
Mein Versuch..

Delphi-Quellcode:
function Rgb2Alpha(colrRGB: Colorref): Byte;
begin
   if colrRGB <> 0 then
     Result := LOBYTE(round(colrRGB * 0.2989)) + LOBYTE(round((colrRGB shr 8) * 0.5870)) +
       LOBYTE(round((colrRGB shr 16) * 0.114))
   else
   Result := 0;
end;

procedure TSkinEngine.SetupAlphaChannel(DC: HDC);
var
  bm: BITMAP;
  P: integer;
  Alpha: byte;
  pBits: PByte;
begin

  FillChar(bm, sizeof(bm), 0);

  GetObject(GetCurrentObject(DC, OBJ_BITMAP), sizeof(bm), @bm);
  pBits := bm.bmBits;
  for P := 0 to (bm.bmWidth * bm.bmHeight) -1 do
  begin
    Alpha := (Rgb2Alpha(RGB(pBits[2], pBits[1], pBits[0])) and $000000FF);
    if ((Alpha = 0) and (pBits[3] = 0)) then
      pBits[3] := 0
    else
    if (pBits[3] = 0) then
      pBits[3] := 255;

    inc(pBits, 4);
  end;
end;
Das Problem ist einmal funktioniert es dann wieder nicht!
Das erste schlecht das zweite gut.

gruss

Schokohase 17. Aug 2018 22:04

AW: RGB zu Alpha
 
Alpha in Zusammenhang mit RGB ist die Transparenz und die kann man aus dem RGB-Wert nicht berechnen, denn diese wäre eine zusätzliche Angabe.

EWeiss 17. Aug 2018 22:09

AW: RGB zu Alpha
 
Zitat:

Zitat von Schokohase (Beitrag 1411007)
Alpha in Zusammenhang mit RGB ist die Transparenz und die kann man aus dem RGB-Wert nicht berechnen, denn diese wäre eine zusätzliche Angabe.

Hmm.. also wenn der Hintergrund Transparent ist wie im zweiten Bild dann geht es ansonsten nicht.
Kann man doch sehen am Bild ;)

gruss

EWeiss 17. Aug 2018 22:45

AW: RGB zu Alpha
 
Danke ist erledigt habe es gefixt.

1. Pic vorher
2.Pic Aktuell

gruss

himitsu 17. Aug 2018 22:49

AW: RGB zu Alpha
 
ARGB,

für die, welche die die Lösung nicht mitbekommen haben.

EWeiss 17. Aug 2018 23:04

AW: RGB zu Alpha
 
Zitat:

Zitat von himitsu (Beitrag 1411011)
ARGB,

für die, welche die die Lösung nicht mitbekommen haben.

Dadurch sind sie jetzt auch nicht schlauer ;)

ARGB hat damit nichts zu tun..
Wenn ihr die Function richtig interpretieren würdet dann könnt ihr sehen das ich alle von außen sichtbaren Schwarzen Pixel nach Alpha 0 konvertiere..
Also RGB zu Alpha und dafür benötige ich den Alpha wert nicht da ich ihn selbst erstelle.

Aber egal ist erledigt.

gruss

Redeemer 18. Aug 2018 14:24

AW: RGB zu Alpha
 
himitsu und Schokohase ihr Ketzer! EWeiss kann Wasser in Wein verwandeln.

EWeiss 18. Aug 2018 16:32

AW: RGB zu Alpha
 
Zitat:

Zitat von Redeemer (Beitrag 1411028)
himitsu und Schokohase ihr Ketzer! EWeiss kann Wasser in Wein verwandeln.

:thumb:

KodeZwerg 18. Aug 2018 20:19

AW: RGB zu Alpha
 
Alpha kann auch höchster Wert im RGB Spektrum bedeuten (highbit), bei Pixel x/y. Da ich eh falsch liege in Bezug zu EWeiss hab ichs nicht erwähnt.

EWeiss 18. Aug 2018 20:44

AW: RGB zu Alpha
 
Zitat:

Zitat von KodeZwerg (Beitrag 1411047)
Alpha kann auch höchster Wert im RGB Spektrum bedeuten (highbit), bei Pixel x/y. Da ich eh falsch liege in Bezug zu EWeiss hab ichs nicht erwähnt.

Ich habe zwar geschrieben
Delphi-Quellcode:
Alpha := (Rgb2Alpha(RGB(pBits[2], pBits[1], pBits[0])) and $000000FF);

Aber nochmal es geht darum alle schwarzen Pixel zu entfernen.

Also wenn Alpha 0 ist dann wird
pBits.rgbReserved auf 0 gesetzt ( := pBits[3])
also komplett durchsichtig. Die Farbe schwarz in dem Fall wird mit dem Alpha Wert 0 ersetzt.
andernfalls pBits.rgbReserved := 255

Und deshalb kann ich Wasser in Wein verwandeln.

gruss

Rollo62 19. Aug 2018 08:53

AW: RGB zu Alpha
 
Das Ganze würde ich dann besser gleich 'TransparentColor' nennen.

EWeiss 19. Aug 2018 10:17

AW: RGB zu Alpha
 
Zitat:

Zitat von Rollo62 (Beitrag 1411071)
Das Ganze würde ich dann besser gleich 'TransparentColor' nennen.

Nenn es wie du willst ;)

gruss

Schokohase 19. Aug 2018 10:53

AW: RGB zu Alpha
 
Wenn man Alpha (siehe
Delphi-Quellcode:
Rgb2Alpha
) und Luminanz (das ist es nämlich was
Delphi-Quellcode:
Rgb2Alpha
als Wert zurückliefert) gleichsetzt, dann ist es auch kein Problem Wasser in Wein zu verwandeln.

Man definiert einfach, dass Wasser = Wein ist.

So einfach kann die Welt sein, oder auch einsam, denn ein sinnvoller Dialog wird so erschwert bis unmöglich, setzt selbiger doch voraus, dass man eine gemeinsame Sprache hat. Dort ist dann Wein ein alkoholisches Getränk und definitiv etwas anderes als Wasser.

Amateurprofi 19. Aug 2018 10:58

AW: RGB zu Alpha
 
Zitat:

Zitat von EWeiss (Beitrag 1411005)
Kann jemand helfen ?
Mein Versuch..

Delphi-Quellcode:
function Rgb2Alpha(colrRGB: Colorref): Byte;
begin
   if colrRGB <> 0 then
     Result := LOBYTE(round(colrRGB * 0.2989)) + LOBYTE(round((colrRGB shr 8) * 0.5870)) +
       LOBYTE(round((colrRGB shr 16) * 0.114))
   else
   Result := 0;
end;

procedure TSkinEngine.SetupAlphaChannel(DC: HDC);
var
  bm: BITMAP;
  P: integer;
  Alpha: byte;
  pBits: PByte;
begin

  FillChar(bm, sizeof(bm), 0);

  GetObject(GetCurrentObject(DC, OBJ_BITMAP), sizeof(bm), @bm);
  pBits := bm.bmBits;
  for P := 0 to (bm.bmWidth * bm.bmHeight) -1 do
  begin
    Alpha := (Rgb2Alpha(RGB(pBits[2], pBits[1], pBits[0])) and $000000FF);
    if ((Alpha = 0) and (pBits[3] = 0)) then
      pBits[3] := 0
    else
    if (pBits[3] = 0) then
      pBits[3] := 255;

    inc(pBits, 4);
  end;
end;
Das Problem ist einmal funktioniert es dann wieder nicht!
Das erste schlecht das zweite gut.

gruss

Auch wenn Du schriebst, es sei erledigt:
Wenn ich das richtig verstehe, errechnest du mit "Rgb2Alpha" für jedes Pixel aus den RGB-Werten einen "Grau-Wert. Wenn dieser = 0 (Schwarz) ist und pBits[3] = 0 ist, denn setzt du pBits[3] = 0 (Warum eigentlich= ist doch schon 0)
andernfalls, wenn der Grau-Wert <> 0 ist und pBits[3] = 0 ist dann setzt du pBits[3] = 255.
Problem dürfte sein, dass Deine "Rgb2Alpha" nicht korrekt arbeitet.
So sollte die korrekte Ergebnisse liefern:
Delphi-Quellcode:
function Rgb2Alpha(colrRGB: Colorref): Byte;
begin
    if colrRGB <> 0 then
//      Result := LOBYTE(round(colrRGB * 0.2989)) + LOBYTE(round((colrRGB shr 8) * 0.5870)) +
//        LOBYTE(round((colrRGB shr 16) * 0.114))
      Result := round(colrRGB and $FF * 0.2989) +
                round(colrRGB shr 8 and $FF * 0.5870) +
                round(colrRGB shr 16 * 0.114)
    else
    Result := 0;
end;

EWeiss 19. Aug 2018 11:34

AW: RGB zu Alpha
 
Nö ich berechne keinen Grau wert.
Wenn dem so wäre würde ich RGB2Gray verwenden.

Zitat:

Problem dürfte sein, dass Deine "Rgb2Alpha" nicht korrekt arbeitet.
Sieh dir einfach die Icons an dann siehst du wie sie arbeitet.
Das zweite Bild.. Nun was arbeitet da nicht korrekt? Du siehst den unterschied?

gruss

Amateurprofi 19. Aug 2018 11:45

AW: RGB zu Alpha
 
Zitat:

Zitat von EWeiss (Beitrag 1411085)
Nö ich berechne keinen Grau wert.
Wenn dem so wäre würde ich RGB2Gray verwenden.

Zitat:

Problem dürfte sein, dass Deine "Rgb2Alpha" nicht korrekt arbeitet.
Sieh dir einfach die Icons an dann siehst du wie sie arbeitet.
Das zweite Bild.. Nun was arbeitet da nicht korrekt? Du siehst den unterschied?

gruss

Du verwendest aber exakt die Werte zur Umrechung, die gern und oft für die Umrechnung in Grau vorgeschlagen werden,
zum Beispiel hier https://stackoverflow.com/questions/...cale-intensity
Nur ist es bei dir fehlerhaft programmiert.
Was du willst ist doch die Summe aus RGB.Red*0.2689 + RGB.Green*0.587 + RGB.Blue*0.114
Und das ist der Grau-Wert oder die Intensity oder Luminanz etc.

Aber deine Funktion rechnet eben etwas anderes, und ich vermute ungewollt.

Amateurprofi 19. Aug 2018 11:54

AW: RGB zu Alpha
 
Zitat:

Zitat von EWeiss (Beitrag 1411085)
Nö ich berechne keinen Grau wert.
Wenn dem so wäre würde ich RGB2Gray verwenden.

Zitat:

Problem dürfte sein, dass Deine "Rgb2Alpha" nicht korrekt arbeitet.
Sieh dir einfach die Icons an dann siehst du wie sie arbeitet.
Das zweite Bild.. Nun was arbeitet da nicht korrekt? Du siehst den unterschied?

gruss

Das liegt daran, das Pixel die wirklich Schwarz sind (Red=0, Green=0, Blue=0), halt auch bei deiner Implementierung 0 bleiben, weil 0, mit was auch immer multipliziert, 0 bleibt. Zufall also.
Aber du kannst ja mal erklären was deine RGB2Alpha tatsächlich rechnen soll. Ich würde das gerne verstehen.

Michael II 20. Aug 2018 19:04

AW: RGB zu Alpha
 
Hallo AW

1.

du schreibst:

Delphi-Quellcode:
   if ((Alpha = 0) and (pBits[3] = 0)) then
      pBits[3] := 0
    else
    if (pBits[3] = 0) then
      pBits[3] := 255;
Etwas vereinfacht geschrieben:

Delphi-Quellcode:
if (a=0) and (p=0) then p := 0 else if (p=0) then p:= 255;
Dies kannst du vereinfachen:

Delphi-Quellcode:
if (p=0) then if (a>0) then p := 255;
D.h. du musst deine function Rgb2Alpha(colrRGB: Colorref): Byte; nur genau dann aufrufen, wenn p=0 ist.

2.

Deine Funktion Rgb2Alpha berechnet in der Tat die Luminanz eines Pixels.

https://de.wikipedia.org/wiki/Luminanz


Da du nur daran interessiert bist, ob Rgb2Alpha 0 zurück liefert oder nicht kannst du deine Funktion Rgb2Alpha ganz wesentlich vereinfachen.

3.

Ich empfehle beim Umsetzen von Formeln wie s = a + b + c nach Delphi die Funktion round - wegen der speziellen Art zu runden - nicht zu verwenden. Und wenn's unbedingt sein muss dann so:

s = round( a + b + c ) und nicht s = round(a) + round(b) + round(c). Im vorliegenden Fall (Berechnung Luminanz) spielt es zwar keine Rolle. Wenn aber wenn a = 12.5, b = 10.5, c = 2.5 dann ist s = 25.5.
s = round( 25.5 ) = 26. Hingegen: s = round(12.5) + round(10.5) + round(2.5) = 24.


Gruss
M

EWeiss 20. Aug 2018 21:06

AW: RGB zu Alpha
 
Zitat:

D.h. du musst deine function Rgb2Alpha(colrRGB: Colorref): Byte; nur genau dann aufrufen, wenn p=0 ist.
Ich mache nichts anderes nur wo ich die Berechnung ausführe ist gehüpft wie gesprungen..
Delphi-Quellcode:
function Rgb2Alpha(colrRGB: Colorref): Byte;
begin
    if colrRGB <> 0 then
Nur dann hole ich mir die werte.
Einen 0 wert berechnen zu wollen macht keinen sinn der bleibt immer 0.

Delphi-Quellcode:
s := round( a + b + c )

Jo ist sinnvoll wenn es ginge.
Denn ich multiplizier zu Colorref einen single type deshalb muss ich bei jedem
(colrRGB * 0.2989) ein Round vorsetzen.

Das! Wird nix
Delphi-Quellcode:
      Result := Round(LOBYTE(colrRGB * 0.2989) + LOBYTE((colrRGB shr 8) * 0.5870) +
        LOBYTE((colrRGB shr 16) * 0.114)))
Zitat:

Deine Funktion Rgb2Alpha berechnet in der Tat die Luminanz eines Pixels.
https://de.wikipedia.org/wiki/Luminanz
Richtig! auch die Annahme das mich nur <> 0 interessiert.

Zitat:

Nur ist es bei dir fehlerhaft programmiert.
Quatsch..

gruss

Michael II 20. Aug 2018 22:47

AW: RGB zu Alpha
 
Zitat:

Ich mache nichts anderes nur wo ich die Berechnung ausführe ist gehüpft wie gesprungen..
Gehüpft ist aber ab und zu schneller als (in eine Funktion) gesprungen, v.a. weil du oft Millionen von Berechnungen für ein Bild durchführen musst.

Du (AW) rufst deine Rgb2Alpha in jedem Fall auf und rechnest dann im Fall RGB>0 weiter.
Ich (MG) rufe deine Funktion nur im Fall (p[3]=)A=0 auf und rechne im Fall RGB>0 weiter.

Delphi-Quellcode:
RGB A  AW MG
 0   0    f f
>0   0    R R
 0  >0    f -
>0  >0    R -
Wenn das Quell-Bild also bereits Alphawerte enthält, gewinne ich viel Zeit.

Da du nur an 0 oder nicht 0 interessiert bist, könntest du alpha so oder ähnlich beschleunigen:

Delphi-Quellcode:
function alpha( r, g, b : integer ) : integer;
begin
  result := 0;
  if (r>=2) or (g>=1) or (b>=5) then result := 255
  else
  if (299*r + 587*g + 114*b >= 500) then result := 255;
end;


Oder deine Funktion etwas beschleunigen, indem du beim Aufruf nicht zuerst die drei Bytes R,G,B zusammenfasst, um sie dann in der Funktion wieder auseinander zu rechnen.


Ich bin hier wieder weg... Viel Spass bei deinen coolen Projekten.

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

Sherlock 21. Aug 2018 09:21

AW: RGB zu Alpha
 
Standard ist eigentlich die Farbe eines Eckpixels als Transparenz anzunehmen. Ich glaube es war die linke untere Ecke. Kann mich aber auch täuschen.

Edith fand in den Microsoft Richtlinen zum Icon Design "Use magenta (R255 G0 B255) as the background transparency color."


Sherlock

Schokohase 21. Aug 2018 09:25

AW: RGB zu Alpha
 
Wie gut, dass es Dokumentationen gibt

http://docwiki.embarcadero.com/Libra...ansparentColor

KodeZwerg 21. Aug 2018 09:33

AW: RGB zu Alpha
 
Also wenn ich ein Icon habe, Neon-Rote Umrandung mit Transparenz in der Mitte würde mir doch eine Abfrage nach oben/links <> unten/links in beiden Fällen meinen Rahmen löschen, da muss ich noch mal lesen oder ich verstehe das gerade falsch.
Gehört ja eh nicht hier rein, tut mir leid.

Michael II 21. Aug 2018 11:00

AW: RGB zu Alpha
 
Hallo AW

du schreibst, dass du die Luminanz und nicht den Grauwert verwenden willst.

Vergleiche aber

https://de.wikipedia.org/wiki/Luminanz

und

https://de.wikipedia.org/wiki/Grauwert

Deine in #24 gepostete Funktion
function TSkinEngine.Rgb2Gray(RGBValue: COLORREF): COLORREF; stdcall;

liefert dir also die von dir gesuchte Luminanz wie Schokohase in #27 zeigt.


Deine ursprüngliche Funktion hat auch extrem helle Farben wie RGB( 250 253 241 ) als sehr dunkel (0) bewertet.

Du hast in #24 eine Grafik gepostet, schwarz wird dort durch deine Funktion unsichtbar. Das ist doch genau das, was du von deiner Funktion erwartest.


Wenn du bereits vorhandene Icons korrekt darstellen willst, dann bringt dein Weg über "sehr dunkle Pixels => unsichtbar setzen" natürlich nicht den gewollten Effekt.


Gruss

EWeiss 21. Aug 2018 11:39

AW: RGB zu Alpha
 
Zitat:

Du hast in #24 eine Grafik gepostet, schwarz wird dort durch deine Funktion unsichtbar. Das ist doch genau das, was du von deiner Funktion erwartest.
Aber nicht das ganze Icon.
Du vergisst eins dabei das dieses keinen Alphawert kennt also in dem sinne da nur 16 Farben enthalten sind.
Bei meinem Hochauflösenden Icon von meinem Piano gibt es das Problem nicht und das ist komplett schwarz.

Das müsste dann deiner Meinung nach komplett unsichtbar sein. ;)
Ich bleibe bei meiner Funktion Rgb2Alpha auch wenn Rgb2Gray fast das gleiche ist. :)
Irgendwann muss mal Schluss sein sonst beschäftige ich mich die nächsten 10 Jahre noch damit. :coder:

gruss

Michael II 21. Aug 2018 13:11

AW: RGB zu Alpha
 
Ich vermute, dass dein "schwarzes Piano Bild" bereits Alphakanalwerte enthält BEVOR du dieses Bild deiner "...toAlpha" Bearbeitung fütterst. Dann macht deine Bearbeitung genau nix:

Wenn dem so ist, dann behältst du ja die bereits vorhandenen p>0 AlphaWerte des Bilds bei und beachtest das Funktionsresultat von "...toAlpha" ausschliesslich im Fall p=0 (transparent) - und wenn du im Fall p=0 Glück hast und an den p=0 Stellen der RGB Wert 0 ist, bleibt dein Icon durch deine Bearbeitung komplett unverändert.

if (p=0) then if (...toAlpha > 0) then p := 255;


Bei deinem "schwarzen Käfer Bild" hingegen fehlt der Alphakanal und du fügst einen Alphakanal mit deiner Bearbeitung hinzu. Dabei gilt: Genau alle Pixel, welche Helligkeit 0 aufweisen werden durch deine Bearbeitung durchsichtig. Deshalb erscheint die schwarze Farbe des Käfers transparent.


Wie erwähnt: Wenn du bereits bestehende Icons irgendwo hinmalen willst, dann ist es sicher besser, wenn du die Icons vor dem Anzeigen nicht mit deiner ...toAlpha bearbeitest.

Medium 21. Aug 2018 13:13

AW: RGB zu Alpha
 
Wenn ich mich recht entsinne galt "früher" für Windows Icons, insbesondere denen mit nur 16 Farben, dass clFuchsia als "Key"-Farbe, also Transparenz definiert wurde. Darüber hinaus gab es auch die Variante, dass eine zusätzliche 1-Bit Maske ergänzend zu dem Bitmap in der Datei ist. Bei moderneren Icons, insbesondere denen die intern als PNG hinterlegt sind und 32bpp haben, gibt es gleich einen kompletten 8 Bit Alphakanal der fest zum Bild gehört.

Wenn es sich also wirklich um Icons im Sinne von "liegt als .ico-Datei vor" handelt, dürfte das ganze eigentlich ohne jede "künstliche Generierung" von Transparenzen abhandelbar sein. Von daher bin ich etwas verwundert darüber, warum du das überhaupt machst.

Edit: Michaels Beitrag geht da in dieselbe Richtung würde ich schätzen.

EWeiss 21. Aug 2018 16:49

AW: RGB zu Alpha
 
Zitat:

Wenn es sich also wirklich um Icons im Sinne von "liegt als .ico-Datei vor" handelt, dürfte das ganze eigentlich ohne jede "künstliche Generierung" von Transparenzen abhandelbar sein. Von daher bin ich etwas verwundert darüber, warum du das überhaupt machst.
Deshalb..

Zitat:

dann ist es sicher besser
Es ist nicht besser siehe link!
Was ist denn nun besser das erste oder zweite Icon. :cyclops:
Zitat:

Dann macht deine Bearbeitung genau nix:
Muss sie auch nicht, destotrotz muss ich alle Icons durchjagen.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 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