Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Farben nach RGB unrechnen? (https://www.delphipraxis.net/157534-farben-nach-rgb-unrechnen.html)

smart 15. Jan 2011 10:12

Farben nach RGB unrechnen?
 
Hallo Alle!

Wie kann ich die Farben von Delphi nach RGB umrechnen?

hboy 15. Jan 2011 10:17

AW: Farben nach RGB unrechnen?
 
hier stehts

meist kann man die Farben direkt übernehmen, ansonsten muss man Tabellenfunktionen bemühen.

smart 15. Jan 2011 10:19

AW: Farben nach RGB unrechnen?
 
Zitat:

Zitat von hboy (Beitrag 1074843)
hier stehts

meist kann man die Farben direkt übernehmen, ansonsten muss man Tabellenfunktionen bemühen.

Oh sorry da war ich noch nicht richtig wach!!

Matze 15. Jan 2011 10:25

AW: Farben nach RGB unrechnen?
 
In der Code-Library hätten wir auch was: RGB -> TColor -> RGB

hboy 15. Jan 2011 10:53

AW: Farben nach RGB unrechnen?
 
Delphi-Quellcode:
type TRGBColor = packed record
  case Integer of
    1 : (col: Cardinal);
    2 : (chans: Array[0..3] of byte);
end;

function AsRGB(color: TColor; DC: HDC = 0): TRGBColor;
var
  rgbc: TRGBColor absolute color;
  entry: PALETTEENTRY;
const
  cpSystemPalette = $00;
  cpActingPalette = $01;
  cpLogicalPalette = $02;
  cpGenericPalette = $08;
  cpNoColor       = $1F;
  cpDefaultColor  = $20;
  cpSystemColor   = $FF;
begin
  case rgbc.chans[3] of
    cpGenericPalette, cpLogicalPalette:
      begin
        result.col := (rgbc.col and $00FFFFFF);
      end;

    cpNoColor, cpDefaultColor :
      begin
        result.col := rgbc.col;
      end;

    cpActingPalette :
      begin
        if (GetDeviceCaps(DC,RASTERCAPS) and RC_PALETTE) <> 0 then
        begin
          if 1 = GetPaletteEntries( GetCurrentObject(DC, OBJ_PAL),
                                    rgbc.chans[0], 1, entry) then
          begin
            result.col := $00000000;
            result.chans[0] := entry.peRed;
            result.chans[1] := entry.peGreen;
            result.chans[2] := entry.peBlue;
          end;
        end
        else
          result.col := PaletteIndex(rgbc.chans[0]);
      end;

    cpSystemPalette :
      begin
        result.col := PaletteIndex(rgbc.chans[0]);
      end;

    cpSystemColor :
      begin
        result.col := GetSysColor(rgbc.chans[0]);
      end;

  end;
end;
Soweit ohne Gewähr. Bitte vervollständigen ;-)

hboy 15. Jan 2011 11:46

AW: Farben nach RGB unrechnen?
 
ich habe obiges noch etwas aufgeblasen, ich hoffe so stimmt es nun. Wahrscheinlich hab ich die Konstanten durcheinandergebracht... aber es sollte nun auch mit beliebigen Paletten funktionieren.

smart 15. Jan 2011 19:32

AW: Farben nach RGB unrechnen?
 
Vielen Dank an Euch!

mz23 16. Jan 2011 16:17

AW: Farben nach RGB unrechnen?
 
Zitat:

Zitat von hboy (Beitrag 1074843)
hier stehts

meist kann man die Farben direkt übernehmen, ansonsten muss man Tabellenfunktionen bemühen.

Komisch, aber ich habe immer ein ungutes Gefühl,
wenn ich folgenden Code lese...
Delphi-Quellcode:
 function xyz(myByte : byte):longint;
         begin
         result:=myByte shl 8;
         end;
...wie auf der gelinkten Seite "hier stehts" zu lesen ist.

Wer kann meine Zweifel ein für alle mal beerdigen?
Ich bin der Meinung, daß es früher mal...
Delphi-Quellcode:
...
        result:=longint(myByte) shl 8;
        ...
...so richtig gewesen ist.

MfG mz23

hboy 16. Jan 2011 22:30

AW: Farben nach RGB unrechnen?
 
Die Zweifel kann ich dir leider nicht nehmen, dazu müsste ich pauschal sagen können, als was das Byte im call stack angelegt wird. Zu meinen guten Zeiten waren das noch Vielfache von 32bit, demnach müsste das so glattgehen. Ich schau es mir eben mal an...

ps:
Delphi-Quellcode:
result:=myByte shl 8;
wird zu
Delphi-Quellcode:
and EAX,$000000FF;
shl EAX, 8
Die Inhalte bleiben nach Standardaufrufkonvention (D7) in EAX...


pps. wie ich deinem Profil entnehme, bist du eher bei C++ zuhause, da bin ich mit derlei castfreien Experimenten schon des öfteren auf die Schnauze gefallen, daher ist deine Skepsis verständlich


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