Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Get{R,G}Value liefert falsche Werte (https://www.delphipraxis.net/134848-get%7Br-g%7Dvalue-liefert-falsche-werte.html)

xZise 30. Mai 2009 13:24


Get{R,G}Value liefert falsche Werte
 
Hallo ihr,

ich dachte ich mache einen Farbverlauf von Weiß nach Schwarz. Also dachte ich hole ich mir den Kanal-Wert multipliziere ihn mit dem Faktor und addiere dann den Kanal Wert der anderen Farbe welcher mit dem (1-Faktor) multipliziert wurde.

Der Faktor ist zwischen 0 und 1 und die Farben sind Schwarz und Weiß. Bei Schwarz funktioniert auch alles und die Werte von GetRValue, GetGValue und GetBValue sind alle 0. Aber bei weiß (egal ob clWhite oder $00FFFFFF) sind die Werte "16.777.215", "65.535" und "255". Bis auf dem letzten Wert, stimmen die anderen beiden nicht. An sich ist das die Farbe komplett bzw. bei Grün die zwei Kanäle.

Wie kriege ich nun die richtigen Werte heraus?

MfG
xZise

igel457 30. Mai 2009 13:42

Re: Get{R,G}Value liefert falsche Werte
 
Weise den Wert einer "Byte" Variable zu.

Edit: Ein "and $FF" sollte es auch tun.

Namenloser 30. Mai 2009 13:54

Re: Get{R,G}Value liefert falsche Werte
 
Alternativ könnte man auch einen record verwenden:

Delphi-Quellcode:
TRGBQuad = packed record // ist schon in irgendeiner Unit definiert, mir fällt aber gerade nicht ein, in welcher
  r, g, b, a: byte
end;

procedure Foo(Color: TColor);
var
  RGB: PRGBQuad;
begin
  RGB := PRGBQuad(@Color);
  ...
  RGB^.r := ...
end;
Dabei fällt mir gerade etwas auf: Kann man absolute eigentlich auch mit Parametern benutzen? Dann könnte es so noch einen Tick eleganter gehen:
Delphi-Quellcode:
procedure Foo(Color: TColor);
var
  RGB: TRGBQuad absolute Color;
begin
  ...
end;

xZise 30. Mai 2009 14:09

Re: Get{R,G}Value liefert falsche Werte
 
Zitat:

Zitat von igel457
Weise den Wert einer "Byte" Variable zu.

Das wird keine Wirkung erzielen:
Delphi-Quellcode:
function GetRValue(rgb: DWORD): Byte;
begin
  Result := Byte(rgb);
end;
Zitat:

Zitat von igel457
Edit: Ein "and $FF" sollte es auch tun.

Okay stimmt das dürfte tatsächlich hinhauen! Ich teste das mal! Ich habe es getestet und es geht. Aber warum muss ich das extra machen?

MfG
xZise

xZise 31. Mai 2009 17:47

Re: Get{R,G}Value liefert falsche Werte
 
Moinsen,

wieso muss ich mit $FF die Daten auf 8 Bit zuschneiden?

MfG
xZise


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