15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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

Компилятор: Delphi

Ниже представлены две функции RGBTOCMYK() и CMYKTORGB(), которые позволяют преобразовывать набор цветов RGB и CMYK.

Замечание: В цвете CMY чёрные тона достигаются путём одинаковых значений Циана, Магенты и Жёлтого чернил. Чёрные чернила используются только при чисто чёрных точках, для повышения контрастности и экономии цветных чернил. Как раз для этого предназначена третья функция ColorCorrectCMYK().
                                            
Пример:

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;

procedure TForm1.Button1Click(Sender: TObject);
var
  R : byte;
  G : byte;
  B : byte;
  C : byte;
  M : byte;
  Y : byte;
  K : byte;
begin
  R := 151;
  G := 81;
  B := 55;
  Memo1.Lines.Add('R = ' + IntToStr(R));
  Memo1.Lines.Add('G = ' + IntToStr(G));
  Memo1.Lines.Add('B = ' + IntToStr(B));
  Memo1.Lines.Add('-------------------');
  RGBTOCMYK(R, G, B, C, M, Y, K);
  Memo1.Lines.Add('C = ' + IntToStr(C));
  Memo1.Lines.Add('M = ' + IntToStr(M));
  Memo1.Lines.Add('Y = ' + IntToStr(Y));
  Memo1.Lines.Add('K = ' + IntToStr(K));
  Memo1.Lines.Add('-------------------');
  CMYKTORGB(C, M, Y, K, R, G, B);
  Memo1.Lines.Add('R = ' + IntToStr(R));
  Memo1.Lines.Add('G = ' + IntToStr(G));
  Memo1.Lines.Add('B = ' + IntToStr(B));
  Memo1.Lines.Add('-------------------');
  RGBTOCMYK(R, G, B, C, M, Y, K);
  c := c + 2;
  m := m + 2;
  y := y + 2;
  ColorCorrectCMYK(C, M, Y, K);
  Memo1.Lines.Add('C = ' + IntToStr(C));
  Memo1.Lines.Add('M = ' + IntToStr(M));
  Memo1.Lines.Add('Y = ' + IntToStr(Y));
  Memo1.Lines.Add('K = ' + IntToStr(K));
end;