[Delphi] Łapacz Kolorów ??

0

Chciałem napisać program, w którym po naciśnięciu na jakiś obrazek kursor zmienia się na pipetę i trzymając wciśnięty przycisk myszki, przeciągając go w dowolne miejsce na ekranie zostanie wyświetlony jego kolor w TImage i w Edit pojawi się jego zapis w HEXach np #336699.
Nie mogę sobie z tym poradzić... :(
Może jakieś rady ?? :)

0

zmiana koloru na hex:

function ColorToHex(color: TColor): string;
var RGB: LongInt;
Red, Green, Blue: Integer;
begin
RGB := ColorToRGB(color);
Red := GetRValue(RGB);
Green := GetGValue(RGB);
Blue := GetBValue(RGB);
Result := IntToHex(Red,2) + IntToHex(Green,2) + IntToHex(Blue,2);
end;

Procedure TForm1.Button1Click (Sender : TObject);
begin
Label1.Caption := ColorToHex (clGreen);
end;


pobranie koloru spod kursora:

var
Color: TColor;
Point: TPoint;
Canvas: TCanvas;
begin
Canvas:=TCanvas.Create;
Canvas.Handle:=GetDC(0);
GetCursorPos(Point);
Color:=Canvas.Pixels[Point.x,Point.y];
Canvas.Destroy;
end;

0

O jezu,
dzięki stary bardzo !!! Już wszystko działa !!!
Super !!
Jeszcze raz dzięks... [hurra]

0

zmiana koloru na hex:

function ColorToHex(color: TColor): string;
var RGB: LongInt;
Red, Green, Blue: Integer;
begin
RGB := ColorToRGB(color);
Red := GetRValue(RGB);
Green := GetGValue(RGB);
Blue := GetBValue(RGB);
Result := IntToHex(Red,2) + IntToHex(Green,2) + IntToHex(Blue,2);
end;

Wszystko ładnie. A mnie interesuje czy ktoś wie jak pobrać dla danego koloru pobranego spod wspołrzędnej myszy takie wartości jak:
Odcień
Nasycenie
Jaskrawość ?

Pozdr//pepe

0

Witam,
Sądzę, że o to ci chodziło: Konwersja RGB na HSL i odwrotnie
( jest w FAQ)

http://4programmers.net/view_faq.php?id=228

Pozdrawiam

0

Moje funkcje, użyte w programie ColorWorkshop (dokładne, szybkie, krótsze niż te z FAQ i z ładniejszym formatowaniem kodu :)):

procedure HLStoRGB(const H,L,S: Single; var R,G,B: Single);
var
  M1, M2: Single;
begin
  if L<=0.5 then
    M2:=L*(L+S)
  else
    M2:=L+S-L*S;
  M1:=2.0*L-M2;

  if S=0.0 then
  begin
    if IsNAN(H) then
    begin
      R := L;
      G := L;
      B := L;
    end
      else raise EException.Create('HLStoRGB: S=0 and H<>NAN');       
  end
    else
  begin
    R:=Value(M1,M2,H+120.0);
    G:=Value(M1,M2,H);
    B:=Value(M1,M2,H-120.0)
  end
end;

procedure RGBToHLS(const R,G,B: Single; var H,L,S: Single);
var
  Delta, Max, Min:  Single;
begin
  Max:= MaxValue([R,G,B]);
  Min:= MinValue([R,G,B]);

  L:=(Max+Min)/2.0;

  if Max=Min then
  begin
    S:=0.0;
    H:=NAN;
  end
    else
  begin
    Delta:=Max-Min;

  if L<=0.5 then
    S:=Delta/(Max+Min)
  else
    S:=Delta/(2.0-(Max+Min));

  if Max=B then
    H:= 240.0 + (60.0*(R - G)) / Delta;
  if Max=G then
    H:= 120.0 + (60.0*(B - R)) / Delta;
  if Max=R then
    H := (60.0*(G - B)) / Delta;
  if H < 0 then
    H := H + 360.0;
  end;
end;

Do tego jeszcze ta funkcja, sprawdzająca wartość nienumeryczną:

function IsNAN(const D: Double): Boolean;
var
  Overlay: Int64 absolute D;
begin
  Result:=((Overlay and $7FF0000000000000) =  $7FF0000000000000) and
    ((Overlay and $000FFFFFFFFFFFFF) <> $0000000000000000)
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1