![]() |
AW: RGB zu Alpha
Das Ganze würde ich dann besser gleich 'TransparentColor' nennen.
|
AW: RGB zu Alpha
Zitat:
gruss |
AW: RGB zu Alpha
Wenn man Alpha (siehe
Delphi-Quellcode:
) und
Rgb2Alpha
![]()
Delphi-Quellcode:
als Wert zurückliefert) gleichsetzt, dann ist es auch kein Problem Wasser in Wein zu verwandeln.
Rgb2Alpha
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. |
AW: RGB zu Alpha
Zitat:
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; |
AW: RGB zu Alpha
Nö ich berechne keinen Grau wert.
Wenn dem so wäre würde ich RGB2Gray verwenden. Zitat:
![]() Das zweite Bild.. Nun was arbeitet da nicht korrekt? Du siehst den unterschied? gruss |
AW: RGB zu Alpha
Zitat:
zum Beispiel hier ![]() 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. |
AW: RGB zu Alpha
Zitat:
Aber du kannst ja mal erklären was deine RGB2Alpha tatsächlich rechnen soll. Ich würde das gerne verstehen. |
AW: RGB zu Alpha
Hallo AW
1. du schreibst:
Delphi-Quellcode:
Etwas vereinfacht geschrieben:
if ((Alpha = 0) and (pBits[3] = 0)) then
pBits[3] := 0 else if (pBits[3] = 0) then pBits[3] := 255;
Delphi-Quellcode:
Dies kannst du vereinfachen:
if (a=0) and (p=0) then p := 0 else if (p=0) then p:= 255;
Delphi-Quellcode:
D.h. du musst deine function Rgb2Alpha(colrRGB: Colorref): Byte; nur genau dann aufrufen, wenn p=0 ist.
if (p=0) then if (a>0) then p := 255;
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 |
AW: RGB zu Alpha
Zitat:
Delphi-Quellcode:
Nur dann hole ich mir die werte.
function Rgb2Alpha(colrRGB: Colorref): Byte;
begin if colrRGB <> 0 then 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:
Zitat:
gruss |
AW: RGB zu Alpha
Zitat:
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:
Wenn das Quell-Bild also bereits Alphawerte enthält, gewinne ich viel Zeit.
RGB A AW MG
0 0 f f >0 0 R R 0 >0 f - >0 >0 R - 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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