Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как преобразовать цвета RGB в CMYK и обратно?

01.01.2007

The following functions RGBTOCMYK() and CMYKTORGB()

demonstrate how to convert between RGB and CMYK color

spaces. Note: There is a direct relationship between RGB

colors and CMY colors. In a CMY color, black tones are

achieved by printing equal amounts of Cyan, Magenta, and

Yellow ink. The black component in a CMY color is achieved

by reducing the CMY components by the minimum of (C, M,

and Y) and substituting pure black in its place producing a

sharper print and using less ink. Since it is possible for a user

to boost the C,M and Y components where boosting the black

component would have been preferable, a ColorCorrectCMYK()

function is provided to achieve the same color by reducing the

C, M and Y components, and boosting the K component.

Example:

procedure RGBTOCMYK(R : byte;
                   G : byte;
                   B : byte;
                   var C : byte;
                   var M : byte;
                   var Y : byte;
                   var K : byte);
begin
 C := 255 - R;
 M := 255 - G;
 Y := 255 - B;
 if C < M then
   K := C else
   K := M;
 if Y < K then
   K := Y;
 if k > 0 then begin
   c := c - k;
   m := m - k;
   y := y - k;
 end;
end;
 
procedure CMYKTORGB(C : byte;
                   M: byte;
                   Y : byte;
                   K : byte;
                   var R : byte;
                   var G : byte;
                   var B : byte);
begin
  if (Integer(C) + Integer(K)) < 255 then
    R := 255 - (C + K) else
    R := 0;
  if (Integer(M) + Integer(K)) < 255 then
    G := 255 - (M + K) else
    G := 0;
  if (Integer(Y) + Integer(K)) < 255 then
    B := 255 - (Y + K) else
    B := 0;
end;
 
procedure ColorCorrectCMYK(var C : byte;
                          var M : byte;
                          var Y : byte;
                          var K : byte);
var
 MinColor : byte;
begin
 if C < M then
   MinColor := C else
   MinColor := M;
 if Y < MinColor  then
   MinColor := Y;
 if MinColor + K > 255 then
   MinColor := 255 - K;
 C := C - MinColor;
 M := M - MinColor;
 Y := Y - MinColor;
 K := K + MinColor;
end;

Автор: p0s0l