Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TColor - Zusammenfügen der Farben (https://www.delphipraxis.net/160486-tcolor-zusammenfuegen-der-farben.html)

Muellermilchtrinker 15. Mai 2011 19:13

Delphi-Version: 2009

TColor - Zusammenfügen der Farben
 
Hallo DP,

ich stehe gerade vor folgendem Problem: Ich habe 4 Schieberegler (R,G,B und Alpha). Diese haben den Wertebereich von 0...255. Ich möchte nun mit denen Daten eine Farbe definieren. Mit rgb() kann ich ja meine RGB Werte in ein TColorwert umwandeln.
Ich möchte jedoch noch den Alphawert mit einbeziehen und dann diese Farbe auf einem Panel anzeigen und dann mit einer 8 stelligen Hexformatierung weiter machen.

Gibt es schon fertige Funktionen, die ich übersehen habe oder muss ich mir welche selber schreiben?
Danke schonmal.

mkinzler 15. Mai 2011 19:23

AW: TColor - Zusammenfügen der Farben
 
Delphi-Quellcode:
RGBAToColor
für den TColor-Wert und
Delphi-Quellcode:
IntToHex
für die Hexdarstellung

Neutral General 16. Mai 2011 08:19

AW: TColor - Zusammenfügen der Farben
 
RGBAToColor?

Also mein Delphi (2009) kennt das nicht. Muss man da eine bestimmte Unit einbinden?..

Satty67 16. Mai 2011 08:50

AW: TColor - Zusammenfügen der Farben
 
Zitat:

Zitat von Muellermilchtrinker (Beitrag 1100978)
Alphawert mit einbeziehen und dann diese Farbe auf einem Panel

da geht es dann los mit den Schwierigkeiten.

Delphi-VCL kennt ja kein TRGBA-Type (oder TARGB), TColor enthält kein Alphawert. Entweder auf GDIplus ausweichen oder selber ein TRGBA definieren und die Farbvorschau selber zeichnen durch Verechnen mit Hintergrundfarbe.

Paint.Net zeigt Farben mit gesetztem Alphawert auch ganz interessant an (Schachbrett).

Cirec 16. Mai 2011 11:55

AW: TColor - Zusammenfügen der Farben
 
Hallo,

Zitat:

Zitat von Muellermilchtrinker (Beitrag 1100978)
... Mit rgb() kann ich ja meine RGB Werte in ein TColorwert umwandeln.
Ich möchte jedoch noch den Alphawert mit einbeziehen ...

das geht einfach so:
Delphi-Quellcode:
function RGBAToColor(r, g, b, a: Byte): TColor;
begin
  Result := (r or (g shl 8) or (b shl 16) or (a shl 24));
end;
mfg
Cirec.

Satty67 16. Mai 2011 12:42

AW: TColor - Zusammenfügen der Farben
 
TColor enthält doch kein Alphawert, dachte der 4. Bytewert ist reserviert für Palettenauswahl?

Muellermilchtrinker 16. Mai 2011 16:28

AW: TColor - Zusammenfügen der Farben
 
Ok, also mit der Funktion RGBAToColor() habe ich ab einem Alphawert von 125 ein Schwarz auf dem Panel. Weiß jemand wie ich das beheben kann?

Neutral General 16. Mai 2011 16:33

AW: TColor - Zusammenfügen der Farben
 
Weil die RGBAToColor()-Funktion Schwachsinn ist...

Die funktioniert (wie schon von einigen weiter oben beschrieben) nicht, weil TColor keinen Alpha-Kanal besitzt/unterstützt. In dem 4. Byte wird irgendwas anderes (Palette?!) gespeichert. Und wenn das 4. Byte nicht = 0 ist, kam bei mir zu 99% einfach nur Schwarz raus ;)

Muellermilchtrinker 16. Mai 2011 16:41

AW: TColor - Zusammenfügen der Farben
 
Wie könnte ich das denn dann machen?
Also 4 Schieberegler (von 0..255) (r,g,b,a) damit dann eine Farbe einstellen und auf einem Vorschaubild anzeigen. Danach die Farbe als 8 stellige Hex ausgeben im Format: $AARRGGBB (da bei der Delphifunktion doch 2 Farben gedreht sind)

Sir Rufo 16. Mai 2011 17:01

AW: TColor - Zusammenfügen der Farben
 
Zitat:

Zitat von Muellermilchtrinker (Beitrag 1101167)
Wie könnte ich das denn dann machen?
Also 4 Schieberegler (von 0..255) (r,g,b,a) damit dann eine Farbe einstellen und auf einem Vorschaubild anzeigen. Danach die Farbe als 8 stellige Hex ausgeben im Format: $AARRGGBB (da bei der Delphifunktion doch 2 Farben gedreht sind)

Da ist nichts gedreht oder verdreht, sondern genau wie im schönen Dezimalsystem.
Einer, Zehner, Hunderter, Tausender (THZE) oder mal analog dazu
R, G, B, A (AGBR) und da jeder Wert (dezimal) von 0-255 oder (hex) von $00-$FF schreibt man auch gerne als Maske für die resultierende Hex-Darstellung ($AABBGGRR)

Bei einer Umrechnung nach TColor kann aber nur der RGB-Anteil verarbeitet werden, weil TColor eben nix mit dem Alpha-Kanal zu schaffen hat.

Für die tatsächlich resultierende Farbe die auf dem Schirm dann erscheinen muss zu errechnen, benötigt man eben noch die aktuelle Hintergrundfarbe.

Das führt uns somit zu folgendem Funktionsrumpf:
Delphi-Quellcode:
function GetColor( ARGB : TARGB; Color : TColor ): TColor;

Sir Rufo 16. Mai 2011 17:55

AW: TColor - Zusammenfügen der Farben
 
Liste der Anhänge anzeigen (Anzahl: 2)
Sodele, da habe ich doch mal einen kleinen süßen Record zusammengebaut, der nun einen Farbwert mit einem Alphakanal beherbergt.
Benutzt werden kann der wie TColor (durch überladene Operatoren) hat aber noch eine Zusatzfunktion (PaintColor), um etwas mit dem Alpha-Wert anzufangen.

Eine Demo ist im Anhang.
Anhang 34216
(Exe, kompletter Source)

Delphi-Quellcode:
unit insARGBColor;

interface

uses
  Graphics;

type
  TARGBColor = record
    R, G, B, A : Byte;
    class operator implicit( ARGB : TARGBColor ) : TColor;
    class operator implicit( Color : TColor ) : TARGBColor;
    function PaintColor( Color : TColor ) : TColor;
  end;

implementation

{ TARGBColor }

class operator TARGBColor.implicit( ARGB : TARGBColor ) : TColor;
begin
  Result := ARGB.R or ( ARGB.G shl 8 ) or ( ARGB.B shl 16 );
end;

class operator TARGBColor.implicit( Color : TColor ) : TARGBColor;
begin
  Result.R := Byte( Color );
  Result.G := Byte( Color shr 8 );
  Result.B := Byte( Color shr 16 );
end;

function TARGBColor.PaintColor( Color : TColor ) : TColor;
var
  Col, res : TARGBColor;
begin
  Col   := Color;
  res.R := ( Self.R * Self.A + Col.R * ( 255 - Self.A ) ) div 255;
  res.G := ( Self.G * Self.A + Col.G * ( 255 - Self.A ) ) div 255;
  res.B := ( Self.B * Self.A + Col.B * ( 255 - Self.A ) ) div 255;
  Result := res;
end;

end.

Satty67 16. Mai 2011 18:14

AW: TColor - Zusammenfügen der Farben
 
Ok, das sieht gut aus. Aber weil ich auch gerade nebenher gebastelt hab (natürlich zeitlich total versagt ;)) poste ich auch mein Ergebnis, dass Deinen angebotenen Funktionsrumpf als Vorlage hatte:
Delphi-Quellcode:
type
  TARGB = packed record
    A,R,G,B : Byte;
  end;

function MixColor(ARGB : TARGB; Color : TColor): TColor;
var
  R, G, B : Byte;
begin
  R := Color and $FF;
  G := (Color shr 8) and $FF;
  B := (Color shr 16) and $FF;
  R := ((ARGB.R * ARGB.A) + (R * ($FF - ARGB.A))) div $FF;
  G := ((ARGB.G * ARGB.A) + (G * ($FF - ARGB.A))) div $FF;
  B := ((ARGB.B * ARGB.A) + (B * ($FF - ARGB.A))) div $FF;
  Result := R + (G shl 8) + (B shl 16);
end;
Zumindest bei der Berechnung/Mixen scheint es richtig (war da garnicht so sicher)


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