This content has moved - please find it at https://devblog.cyotek.com.

Although these pages remain accessible, some content may not display correctly in future as the new blog evolves.

Visit https://devblog.cyotek.com.

Converting colours between RGB and CMYK in C#

In my previous articles on reading and writing colours from various palette/swatch formats, I left CMYK conversion as an exercise for the reader and only demonstrated RGB aspects. This article demonstrates how to convert colours in CMYK format to RGB and vice versa.

Two way colour conversions between CMYK and RGB

About CMYK

(Image credit: SharkD [CC0], from Wikimedia Commons)

CMYK is traditionally used in the printing industry. It is a subtractive colour model and uses four colours (cyan, magenta, yellow and black). Unlike additive colour models (e.g. the RGB model normally discussed on this blog), combining all primary colours in subtractive results in black, whereas combining all primary colours in additive results in white.

Unlike RGB which generally uses the range 0-255, most examples of CMYK I've seen use percentages instead, e.g. 37% cyan, 18% magenta, no yellow and 31% black. In this article I'm using the range 0-1 to describe the colours. (Just to be awkward, the demonstration front end uses 0-100 to make it more user friendly!)

A caveat on conversion

As RGB uses completely different colour channels as well as different value ranges, conversions may not be directly compatible. For example, converting from RGB to CMYK and then back to RGB there is a chance to have a final RGB value that is just slightly off from the source. And that's before we even get into gamut and colour profiles, neither of which I'll be covering in this article.

An example of an imprecise two way conversion

Converting CMYK to RGB

Red is calculated from the cyan and black colours

R = 255 × (1-C) × (1-K)

Green is calculated from the magenta and black colours

G = 255 × (1-M) × (1-K)

Blue is calculated from the yellow and black colours

B = 255 × (1-Y) × (1-K)

Formula credit: RapidTables

The following function converts CMYK into RGB

public static Color ConvertCmykToRgb(float c, float m, float y, float k)
{
  int r;
  int g;
  int b;

  r = Convert.ToInt32(255 * (1 - c) * (1 - k));
  g = Convert.ToInt32(255 * (1 - m) * (1 - k));
  b = Convert.ToInt32(255 * (1 - y) * (1 - k));

  return Color.FromArgb(r, g, b);
}

Converting RGB to CMYK

The R,G,B values are divided by 255 to change the range from 0-255 to 0-1:

R = R/255
G = G/255
B = B/255

The black key is calculated from the maximum red, green or blue colour

K = 1-max(R, G, B)

Cyan is calculated from red and black

C = (1-R-K) / (1-K)

Magenta is calculated from green and black

M = (1-G-K) / (1-K)

Yellow is calculated from blue and black

Y = (1-B-K) / (1-K)

Formula credit: RapidTables

The following functions convert RGB to CYMK

public static CmykColor ConvertRgbToCmyk(int r, int g, int b)
{
  float c;
  float m;
  float y;
  float k;
  float rf;
  float gf;
  float bf;

  rf = r / 255F;
  gf = g / 255F;
  bf = b / 255F;

  k = ClampCmyk(1 - Math.Max(Math.Max(rf, gf), bf));
  c = ClampCmyk((1 - rf - k) / (1 - k));
  m = ClampCmyk((1 - gf - k) / (1 - k));
  y = ClampCmyk((1 - bf - k) / (1 - k));

  return new CmykColor(c, m, y, k);
}

private static float ClampCmyk(float value)
{
  if (value < 0 || float.IsNaN(value))
  {
    value = 0;
  }

  return value;
}

You might notice that it is possible for (1 - k) to return 0 if k is calculated to be solid black (1). As this is using floating point math, you don't get the normal DivideByZeroException, but instead of the result of the call is NaN. The ClampCmyk function make sure that values less than zero are normalised as zero, and it also does the same for NaN values.

I did write a version of the function that checked to see if (1 - k) was 0 and then return zero for the c, m and y fields but the above version was easier to read.

Demonstration program

The demonstration program in action

The demonstration program lets you freely convert CMYK to RGB and RGB to CMYK uses the above functions, and a lot of sliders and spin buttons. I also included some predefined RGB colours, courtesy of Arne's 16 colour palette.

Update History

  • 2018-07-15 - First published
  • 2020-11-22 - Updated formatting

Downloads

Filename Description Version Release Date
CmykRgbColorConversion.zip
  • sha256: cfc2141a0f0820962621bc35e10882e648c95496751b65ded610a0009faae5a6

Sample project for the converting colours between RGB and CMYK in C# blog post.

15/07/2018 Download

About The Author

Gravatar

The founder of Cyotek, Richard enjoys creating new blog content for the site. Much more though, he likes to develop programs, and can often found writing reams of code. A long term gamer, he has aspirations in one day creating an epic video game. Until that time, he is mostly content with adding new bugs to WebCopy and the other Cyotek products.

Leave a Comment

While we appreciate comments from our users, please follow our posting guidelines. Have you tried the Cyotek Forums for support from Cyotek and the community?

Styling with Markdown is supported

Comments

Gravatar

Yvon

# Reply

Yes this tip is useful? here is another way that I use out of adobe: I recommend https://www.decoenligne.org/conversions-couleurs/

Gravatar

Richard Moss

# Reply

Apologies to whomever left this comment, I deleted it in error thinking it was spam

teria algum aplicativo para criar perfil de cor?

Sorry, currently we don't offer any applications that are capable or reading or creating colour profiles.

Desculpe, atualmente não oferecemos quaisquer aplicações que são capazes ou de leitura ou criação de perfis de cor.