Thema: FreePascal RGB/CMK/CMYK conversions

Einzelnen Beitrag anzeigen

WojTec

Registriert seit: 17. Mai 2007
482 Beiträge
 
Delphi XE6 Professional
 
#1

RGB/CMK/CMYK conversions

  Alt 2. Jan 2012, 15:01
Delphi-Quellcode:
procedure _CMYToCMYK(const C, M, Y: Single; out Cyan, Magenta, Yellow, Black: Single);
var
  var_K: Single;
begin
  var_K := 1;

  if C < var_K then var_K := C;
  if M < var_K then var_K := M;
  if Y < var_K then var_K := Y;

  if var_K = 1 then
  begin //Black
     Cyan := 0;
     Magenta := 0;
     Yellow := 0;
  end
  else
  begin
     Cyan := (C - var_K) / (1 - var_K);
     Magenta := (M - var_K) / (1 - var_K);
     Yellow := (Y - var_K) / (1 - var_K);
  end;

  Black := var_K;
end;

procedure _CMYKToCMY(const C, M, Y, K: Single; out Cyan, Magenta, Yellow: Single);
begin
  Cyan := (C * (1 - K) + K);
  Magenta := (M * (1 - K) + K);
  Yellow := (Y * (1 - K) + K);
end;

procedure _RGBToCMY(const R, G, B: Byte; out C, M, Y: Single);
begin
  C := 1 - (R / 255);
  M := 1 - (G / 255);
  Y := 1 - (B / 255);
end;

procedure _CMYToRGB(const C, M, Y: Single; out R, G, B: Byte);
begin
  R := Round((1 - C) * 255);
  G := Round((1 - M) * 255);
  B := Round((1 - Y) * 255);
end;

procedure _RGBToCMYK(const R, G, B: Byte; out C, M, Y, K: Single);
var
  Cyan, Magenta, Yellow: Single;
begin
  _RGBToCMY(R, G, B, Cyan, Magenta, Yellow);
  _CMYToCMYK(Cyan, Magenta, Yellow, C, M, Y, K)
end;

procedure _CMYKToRGB(const C, M, Y, K: Single; out R, G, B: Byte);
var
  Cyan, Magenta, Yellow: Single;
begin
  _CMYKToCMY(C, M, Y, K, Cyan, Magenta, Yellow);
  _CMYToRGB(Cyan, Magenta, Yellow, R, G, B);
end;
Formulas I got from EasyRGB. Result are different in this code and Photoshop:

Code:
_CMYKToRGB(0.11, 0.13, 0.99, 0, R, G, B); // 227 222 3; ps: 232, 207, 30
_CMYKToRGB(0, 0, 0.5, 0.5, R, G, B); // 124 124 64; ps: 150 145 91
Where is bug?
  Mit Zitat antworten Zitat