AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RGB zu Alpha

Ein Thema von EWeiss · begonnen am 17. Aug 2018 · letzter Beitrag vom 21. Aug 2018
Antwort Antwort
Seite 2 von 4     12 34      
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#11

AW: RGB zu Alpha

  Alt 19. Aug 2018, 09:53
Das Ganze würde ich dann besser gleich 'TransparentColor' nennen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: RGB zu Alpha

  Alt 19. Aug 2018, 11:17
Das Ganze würde ich dann besser gleich 'TransparentColor' nennen.
Nenn es wie du willst

gruss
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#13

AW: RGB zu Alpha

  Alt 19. Aug 2018, 11:53
Wenn man Alpha (siehe Rgb2Alpha ) und Luminanz (das ist es nämlich was 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.
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
 
Delphi XE2 Professional
 
#14

AW: RGB zu Alpha

  Alt 19. Aug 2018, 11:58
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: RGB zu Alpha

  Alt 19. Aug 2018, 12:34
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

Geändert von EWeiss (19. Aug 2018 um 12:36 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
 
Delphi XE2 Professional
 
#16

AW: RGB zu Alpha

  Alt 19. Aug 2018, 12:45
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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
 
Delphi XE2 Professional
 
#17

AW: RGB zu Alpha

  Alt 19. Aug 2018, 12:54
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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
763 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: RGB zu Alpha

  Alt 20. Aug 2018, 20:04
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:

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

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
Michael Gasser
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#19

AW: RGB zu Alpha

  Alt 20. Aug 2018, 22:06
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.

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

Geändert von EWeiss (20. Aug 2018 um 23:02 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
763 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: RGB zu Alpha

  Alt 20. Aug 2018, 23:47
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.
Michael Gasser
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 07:41 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