RGB to CMYK color

The RGB to CMYK color conversion is a common task in graphic design and printing. RGB stands for Red, Green, and Blue, while CMYK stands for Cyan, Magenta, Yellow, and Key (Black). RGB is primarily used for electronic displays like computer monitors, TVs, and screens, while CMYK is used for color printing. Converting RGB colors to CMYK colors is important to ensure accurate color reproduction across different media.

Problem Statement

Given the RGB values (Red, Green, and Blue) of a color, the task is to convert them into their corresponding CMYK values. This conversion involves translating color intensities from the RGB color space to the CMYK color space.

Example

Let's consider the first test case from your code:

• R = 181
• G = 122
• B = 230

We want to convert these RGB values to CMYK.

Idea to Solve the Problem

The conversion from RGB to CMYK involves a series of mathematical calculations. We need to normalize the RGB values to the range [0, 1], perform the calculations, and then convert the resulting CMYK values back to the integer range [0, 100]. The main formulas used are based on additive color mixing for RGB and subtractive color mixing for CMYK.

Pseudocode

``````r1 = r / 255
g1 = g / 255
b1 = b / 255

black = 1 - max(r1, max(g1, b1))

if black != 1:
c = round(100 * (1 - r1 - black) / (1 - black))
m = round(100 * (1 - g1 - black) / (1 - black))
y = round(100 * (1 - b1 - black) / (1 - black))
k = round(black * 100)``````

Algorithm Explanation

1. Normalize the RGB values by dividing each component by 255.
2. Calculate the normalized values r1, g1, and b1.
3. Determine the "black" value, which represents the amount of black ink needed. It is calculated as 1 minus the maximum of r1, g1, and b1.
4. If black is not equal to 1, calculate the CMY values using formulas that take into account the black component:
• Cyan (C): `round(100 * (1 - r1 - black) / (1 - black))`
• Magenta (M): `round(100 * (1 - g1 - black) / (1 - black))`
• Yellow (Y): `round(100 * (1 - b1 - black) / (1 - black))`
5. Calculate the black component (Key) as: `round(black * 100)`
6. Display the calculated CMYK values.

Code Solution

``````// C program
// RGB to CMYK color
#include <stdio.h>
#include <math.h>

// Returns the maximum value of given two numbers
double max_value(double a, double b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
// Convert RGB to CMYK
void rgb_to_cmyk(int r, int g, int b)
{
if (r < 0 || g < 0 || b < 0)
{
return;
}
printf("\n Given RGB");
printf("\n R = %d ", r);
printf("\n G = %d ", g);
printf("\n B = %d ", b);
// Calculate R' G' B'
double r1 = r / 255.0;
double g1 = g / 255.0;
double b1 = b / 255.0;
// Black key
double black = (1 - max_value(max_value(r1, g1), b1));
int c = 0;
int m = 0;
int y = 0;
int k = 0;
if (black != 1)
{
// Cyan color
c = round(100 *(1 - r1 - black) / (1 - black));
// Magenta color
m = round(100 *(1 - g1 - black) / (1 - black));
// Yellow color
y = round(100 *(1 - b1 - black) / (1 - black));
}
// Black color
k = round(black *100);
// Display Calculate results
printf("\n Calculate CMYK");
printf("\n C = %d ", c);
printf("\n M = %d ", m);
printf("\n Y = %d ", y);
printf("\n K = %d \n", k);
}
int main()
{
// Test Case
rgb_to_cmyk(181, 122, 230);
rgb_to_cmyk(78, 37, 78);
return 0;
}``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69``````
``````/*
Java Program
RGB to CMYK color
*/
public class ColorConversion
{
// Returns the maximum value of given two numbers
public double max_value(double a, double b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
// Convert RGB to CMYK
public void rgb_to_cmyk(int r, int g, int b)
{
if (r < 0 || g < 0 || b < 0)
{
return;
}
System.out.print("\n Given RGB");
System.out.print("\n R = " + r );
System.out.print("\n G = " + g );
System.out.print("\n B = " + b );
// Calculate R' G' B'
double r1 = r / 255.0;
double g1 = g / 255.0;
double b1 = b / 255.0;
// Black key
double black = (1 - max_value(max_value(r1, g1), b1));
long c = 0;
long m = 0;
long y = 0;
long k = 0;
if (black != 1)
{
// Cyan color
c = Math.round(100 * ((1 - r1 - black) / (1 - black)));
// Magenta color
m = Math.round(100 * ((1 - g1 - black) / (1 - black)));
// Yellow color
y = Math.round(100 * ((1 - b1 - black) / (1 - black)));
}
// Black color
k = Math.round(black * 100);
// Display Calculate results
System.out.print("\n Calculate CMYK");
System.out.print("\n C = " + c );
System.out.print("\n M = " + m );
System.out.print("\n Y = " + y );
System.out.print("\n K = " + k + " \n");
}
public static void main(String[] args)
{
ColorConversion color = new ColorConversion();
// Test Case
color.rgb_to_cmyk(181, 122, 230);
color.rgb_to_cmyk(78, 37, 78);
}
}``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69``````
``````// Include header file
#include <iostream>
#include <math.h>
using namespace std;

/*
C++ Program
RGB to CMYK color
*/

class ColorConversion
{
public:
// Returns the maximum value of given two numbers
double max_value(double a, double b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
// Convert RGB to CMYK
void rgb_to_cmyk(int r, int g, int b)
{
if (r < 0 || g < 0 || b < 0)
{
return;
}
cout << "\n Given RGB";
cout << "\n R = " << r;
cout << "\n G = " << g;
cout << "\n B = " << b;
// Calculate R' G' B'
double r1 = r / 255.0;
double g1 = g / 255.0;
double b1 = b / 255.0;
// Black key
double black = (1 - this->max_value(this->max_value(r1, g1), b1));
long c = 0;
long m = 0;
long y = 0;
long k = 0;
if (black != 1)
{
// Cyan color
c = round(100 *((1 - r1 - black) / (1 - black)));
// Magenta color
m = round(100 *((1 - g1 - black) / (1 - black)));
// Yellow color
y = round(100 *((1 - b1 - black) / (1 - black)));
}
// Black color
k = round(black *100);
// Display Calculate results
cout << "\n Calculate CMYK";
cout << "\n C = " << c;
cout << "\n M = " << m;
cout << "\n Y = " << y;
cout << "\n K = " << k << " \n";
}
};
int main()
{
ColorConversion color = ColorConversion();
// Test Case
color.rgb_to_cmyk(181, 122, 230);
color.rgb_to_cmyk(78, 37, 78);
return 0;
}``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69``````
``````// Include namespace system
using System;
/*
C# Program
RGB to CMYK color
*/
public class ColorConversion
{
// Returns the maximum value of given two numbers
public double max_value(double a, double b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
// Convert RGB to CMYK
public void rgb_to_cmyk(int r, int g, int b)
{
if (r < 0 || g < 0 || b < 0)
{
return;
}
Console.Write("\n Given RGB");
Console.Write("\n R = " + r);
Console.Write("\n G = " + g);
Console.Write("\n B = " + b);
// Calculate R' G' B'
double r1 = r / 255.0;
double g1 = g / 255.0;
double b1 = b / 255.0;
// Black key
double black = (1 - max_value(max_value(r1, g1), b1));
int c = 0;
int m = 0;
int y = 0;
int k = 0;
if (black != 1)
{
// Cyan color
c = (int) Math.Round(100 * ((1 - r1 - black) / (1 - black)));
// Magenta color
m = (int) Math.Round(100 * ((1 - g1 - black) / (1 - black)));
// Yellow color
y = (int) Math.Round(100 * ((1 - b1 - black) / (1 - black)));
}
// Black color
k = (int) Math.Round(black * 100);
// Display Calculate results
Console.Write("\n Calculate CMYK");
Console.Write("\n C = " + c);
Console.Write("\n M = " + m);
Console.Write("\n Y = " + y);
Console.Write("\n K = " + k + " \n");
}
public static void Main(String[] args)
{
ColorConversion color = new ColorConversion();
// Test Case
color.rgb_to_cmyk(181, 122, 230);
color.rgb_to_cmyk(78, 37, 78);
}
}``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69``````
``````<?php
/*
Php Program
RGB to CMYK color
*/
class ColorConversion
{
// Returns the maximum value of given two numbers
public
function max_value(\$a, \$b)
{
if (\$a > \$b)
{
return \$a;
}
else
{
return \$b;
}
}
// Convert RGB to CMYK
public
function rgb_to_cmyk(\$r, \$g, \$b)
{
if (\$r < 0 || \$g < 0 || \$b < 0)
{
return;
}
echo "\n Given RGB";
echo "\n R = ".\$r;
echo "\n G = ".\$g;
echo "\n B = ".\$b;
// Calculate R' G' B'
\$r1 = (\$r / 255.0);
\$g1 = (\$g / 255.0);
\$b1 = (\$b / 255.0);
// Black key
\$black = (1 - \$this->max_value(\$this->max_value(\$r1, \$g1), \$b1));
\$c = 0;
\$m = 0;
\$y = 0;
\$k = 0;
if (\$black != 1)
{
// Cyan color
\$c = round(100 * (1 - \$r1 - \$black) / (1 - \$black));
// Magenta color
\$m = round(100 * (1 - \$g1 - \$black) / (1 - \$black));
// Yellow color
\$y = round(100 * (1 - \$b1 - \$black) / (1 - \$black));
}
// Black color
\$k = round(\$black * 100);
// Display Calculate results
echo "\n Calculate CMYK";
echo "\n C = ".\$c;
echo "\n M = ".\$m;
echo "\n Y = ".\$y;
echo "\n K = ".\$k.
" \n";
}
}

function main()
{
\$color = new ColorConversion();
// Test Case
\$color->rgb_to_cmyk(181, 122, 230);
\$color->rgb_to_cmyk(78, 37, 78);
}
main();``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69``````
``````/*
Node Js Program
RGB to CMYK color
*/
class ColorConversion
{
// Returns the maximum value of given two numbers
max_value(a, b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
// Convert RGB to CMYK
rgb_to_cmyk(r, g, b)
{
if (r < 0 || g < 0 || b < 0)
{
return;
}
process.stdout.write("\n Given RGB");
process.stdout.write("\n R = " + r);
process.stdout.write("\n G = " + g);
process.stdout.write("\n B = " + b);
// Calculate R' G' B'
var r1 = (r / 255.0);
var g1 = (g / 255.0);
var b1 = (b / 255.0);
// Black key
var black = (1 - this.max_value(this.max_value(r1, g1), b1));
var c = 0;
var m = 0;
var y = 0;
var k = 0;
if (black != 1)
{
// Cyan color
c = Math.round(100 * (1 - r1 - black) / (1 - black));
// Magenta color
m = Math.round(100 * (1 - g1 - black) / (1 - black));
// Yellow color
y = Math.round(100 * (1 - b1 - black) / (1 - black));
}
// Black color
k = Math.round(black * 100);
// Display Calculate results
process.stdout.write("\n Calculate CMYK");
process.stdout.write("\n C = " + c);
process.stdout.write("\n M = " + m);
process.stdout.write("\n Y = " + y);
process.stdout.write("\n K = " + k + " \n");
}
}

function main()
{
var color = new ColorConversion();
// Test Case
color.rgb_to_cmyk(181, 122, 230);
color.rgb_to_cmyk(78, 37, 78);
}
main();``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69``````
``````#   Python 3 Program
#   RGB to CMYK color

class ColorConversion :
#  Returns the maximum value of given two numbers
def max_value(self, a, b) :
if (a > b) :
return a
else :
return b

#  Convert RGB to CMYK
def rgb_to_cmyk(self, r, g, b) :
if (r < 0 or g < 0 or b < 0) :
return

print("\n Given RGB", end = "")
print("\n R =", r, end = "")
print("\n G =", g, end = "")
print("\n B =", b, end = "")
#  Calculate R' G' B'
r1 = (r / 255.0)
g1 = (g / 255.0)
b1 = (b / 255.0)
#  Black key
black = (1 - self.max_value(self.max_value(r1, g1), b1))
c = 0
m = 0
y = 0
k = 0
if (black != 1) :
#  Cyan color
c = round(100 * (((1 - r1 - black) / (1 - black))))
#  Magenta color
m = round(100 * (((1 - g1 - black) / (1 - black))))
#  Yellow color
y = round(100 * (((1 - b1 - black) / (1 - black))))

#  Black color
k = round(black * 100)
#  Display Calculate results
print("\n Calculate CMYK", end = "")
print("\n C =", c, end = "")
print("\n M =", m, end = "")
print("\n Y =", y, end = "")
print("\n K =", k ," ")

def main() :
color = ColorConversion()
#  Test Case
color.rgb_to_cmyk(181, 122, 230)
color.rgb_to_cmyk(78, 37, 78)

if __name__ == "__main__": main()``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69``````
``````#   Ruby Program
#   RGB to CMYK color

class ColorConversion
#  Returns the maximum value of given two numbers
def max_value(a, b)
if (a > b)
return a
else
return b
end

end

#  Convert RGB to CMYK
def rgb_to_cmyk(r, g, b)
if (r < 0 || g < 0 || b < 0)
return
end

print("\n Given RGB")
print("\n R = ", r)
print("\n G = ", g)
print("\n B = ", b)
#  Calculate R' G' B'
r1 = r / 255.0
g1 = g / 255.0
b1 = b / 255.0
#  Black key
black = (1 - self.max_value(self.max_value(r1, g1), b1))
c = 0
m = 0
y = 0
k = 0
if (black != 1)
#  Cyan color
c = (100 * ((1 - r1 - black) / (1 - black))).round
#  Magenta color
m = (100 * ((1 - g1 - black) / (1 - black))).round
#  Yellow color
y = (100 * ((1 - b1 - black) / (1 - black))).round
end

#  Black color
k = (black * 100).round
#  Display Calculate results
print("\n Calculate CMYK")
print("\n C = ", c)
print("\n M = ", m)
print("\n Y = ", y)
print("\n K = ", k ," \n")
end

end

def main()
color = ColorConversion.new()
#  Test Case
color.rgb_to_cmyk(181, 122, 230)
color.rgb_to_cmyk(78, 37, 78)
end

main()``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69
``````
``````/*
Scala Program
RGB to CMYK color
*/
class ColorConversion
{
// Returns the maximum value of given two numbers
def max_value(a: Double, b: Double): Double = {
if (a > b)
{
return a;
}
else
{
return b;
}
}
// Convert RGB to CMYK
def rgb_to_cmyk(r: Int, g: Int, b: Int): Unit = {
if (r < 0 || g < 0 || b < 0)
{
return;
}
print("\n Given RGB");
print("\n R = " + r);
print("\n G = " + g);
print("\n B = " + b);
// Calculate R' G' B'
var r1: Double = (r / 255.0);
var g1: Double = (g / 255.0);
var b1: Double = (b / 255.0);
// Black key
var black: Double = (1 - this.max_value(this.max_value(r1, g1), b1));
var c: Long = 0;
var m: Long = 0;
var y: Long = 0;
var k: Long = 0;
if (black != 1)
{
// Cyan color
c = Math.round(100 * (((1 - r1 - black) / (1 - black))));
// Magenta color
m = Math.round(100 * (((1 - g1 - black) / (1 - black))));
// Yellow color
y = Math.round(100 * (((1 - b1 - black) / (1 - black))));
}
// Black color
k = Math.round(black * 100);
// Display Calculate results
print("\n Calculate CMYK");
print("\n C = " + c);
print("\n M = " + m);
print("\n Y = " + y);
print("\n K = " + k + " \n");
}
}
object Main
{
def main(args: Array[String]): Unit = {
var color: ColorConversion = new ColorConversion();
// Test Case
color.rgb_to_cmyk(181, 122, 230);
color.rgb_to_cmyk(78, 37, 78);
}
}``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69``````
``````import Foundation
/*
Swift 4 Program
RGB to CMYK color
*/
class ColorConversion
{
// Returns the maximum value of given two numbers
func max_value(_ a: Double, _ b: Double)->Double
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
// Convert RGB to CMYK
func rgb_to_cmyk(_ r: Int, _ g: Int, _ b: Int)
{
if (r < 0 || g < 0 || b < 0)
{
return;
}
print("\n Given RGB", terminator: "");
print("\n R = ", r, terminator: "");
print("\n G = ", g, terminator: "");
print("\n B = ", b, terminator: "");
// Calculate R" G" B"
let r1: Double = Double(r) / 255.0;
let g1: Double = Double(g) / 255.0;
let b1: Double = Double(b) / 255.0;
// Black key
let black: Double = (1 - self.max_value(self.max_value(r1, g1), b1));
var c: Int = 0;
var m: Int = 0;
var y: Int = 0;
var k: Int = 0;
if (black != 1)
{
// Cyan color
c = Int(round(100 * ((1 - r1 - black) / (1 - black))));
// Magenta color
m = Int(round(100 * ((1 - g1 - black) / (1 - black))));
// Yellow color
y = Int(round(100 * ((1 - b1 - black) / (1 - black))));
}
// Black color
k = Int(round(black * 100));
// Display Calculate results
print("\n Calculate CMYK", terminator: "");
print("\n C = ", c, terminator: "");
print("\n M = ", m, terminator: "");
print("\n Y = ", y, terminator: "");
print("\n K = ", k ," ");
}
}
func main()
{
let color: ColorConversion = ColorConversion();
// Test Case
color.rgb_to_cmyk(181, 122, 230);
color.rgb_to_cmyk(78, 37, 78);
}
main();``````

Output

`````` Given RGB
R =  181
G =  122
B =  230
Calculate CMYK
C =  21
M =  47
Y =  0
K =  10

Given RGB
R =  78
G =  37
B =  78
Calculate CMYK
C =  0
M =  53
Y =  0
K =  69``````
``````/*
Kotlin Program
RGB to CMYK color
*/
class ColorConversion
{
// Returns the maximum value of given two numbers
fun max_value(a: Double, b: Double): Double
{
if (a>b)
{
return a;
}
else
{
return b;
}
}
// Convert RGB to CMYK
fun rgb_to_cmyk(r: Int, g: Int, b: Int): Unit
{
if (r<0 || g<0 || b<0)
{
return;
}
print("\n Given RGB");
print("\n R = " + r);
print("\n G = " + g);
print("\n B = " + b);
// Calculate R' G' B'
var r1: Double = r / 255.0;
var g1: Double = g / 255.0;
var b1: Double = b / 255.0;
// Black key
var black: Double = (1 - this.max_value(this.max_value(r1, g1), b1));
var c: Long = 0;
var m: Long = 0;
var y: Long = 0;
var k: Long ;
if (black != 1.0)
{
// Cyan color
c = Math.round(100 * ((1 - r1 - black) / (1 - black)));
// Magenta color
m = Math.round(100 * ((1 - g1 - black) / (1 - black)));
// Yellow color
y = Math.round(100 * ((1 - b1 - black) / (1 - black)));
}
// Black color
k = Math.round(black * 100);
// Display Calculate results
print("\n Calculate CMYK");
print("\n C = " + c);
print("\n M = " + m);
print("\n Y = " + y);
print("\n K = " + k + " \n");
}
}
fun main(args: Array<String>): Unit
{
var color: ColorConversion = ColorConversion();
// Test Case
color.rgb_to_cmyk(181, 122, 230);
color.rgb_to_cmyk(78, 37, 78);
}``````

Output

`````` Given RGB
R = 181
G = 122
B = 230
Calculate CMYK
C = 21
M = 47
Y = 0
K = 10

Given RGB
R = 78
G = 37
B = 78
Calculate CMYK
C = 0
M = 53
Y = 0
K = 69``````

Resultant Output Explanation

For the first test case (181, 122, 230):

• Normalized RGB values: r1 = 0.7098, g1 = 0.4784, b1 = 0.9020
• Calculated CMYK values: c = 21, m = 47, y = 0, k = 10

For the second test case (78, 37, 78):

• Normalized RGB values: r1 = 0.3059, g1 = 0.1451, b1 = 0.3059
• Calculated CMYK values: c = 0, m = 53, y = 0, k = 69

Time Complexity

The time complexity of this algorithm is constant, O(1), because the calculations involve only a fixed number of arithmetic operations regardless of the input values. The rounding operation and print statements also don't affect the overall complexity.

Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.