Skip to content

Instantly share code, notes, and snippets.

@rlingineni
Created February 13, 2017 01:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rlingineni/dd45846852fe3598aa4412e5095f40e0 to your computer and use it in GitHub Desktop.
Save rlingineni/dd45846852fe3598aa4412e5095f40e0 to your computer and use it in GitHub Desktop.
Different Conversions of Color Representations
using System;
using System.Collections.Generic;
namespace rgbConverter
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var row1 = new List<Color> { new Color(0, 0, 0), new Color(0, 0, 0), new Color(0, 0, 0), new Color(0, 0, 0) };
var row2 = new List<Color>{ new Color(255, 0, 0), new Color(255, 0, 0), new Color(255, 0, 0), new Color(255, 0, 0) };
var row3 = new List<Color> { new Color(100, 100, 100), new Color(100, 100, 100), new Color(100, 100, 100), new Color(100, 100, 100) };
var row4 = new List<Color> { new Color(0, 100, 100), new Color(0, 100, 100), new Color(0, 100, 100), new Color(0, 100, 100) };
var colorMap = new ColorMap { row1, row2, row3, row4 };
//divide All by 255
var nonlinear = convertToNonLinear(colorMap);
//Perform Gamma Correction and Multiply by 255
var linearGamma = performsLinearConversion(colorMap);
//Converts to XYZ
var XYZMap = performXYZConversion(colorMap);
/*
* You will need multiply these values by the Matrix * [X,Y,Z] to get final gamma corrected value
* |0.412453 0.35758 0.180423 |
* |0.212671 0.71516 0.072169 |
* |0.019334 0.119193 0.950227|
*
*/
//Converts to xyZ
var xyZMap = performXYConversion(colorMap);
//convert XYZ to LUV
//prints a ColorMap, take each result and print them
printMap(xyZMap);
}
static ColorMap convertToNonLinear(ColorMap map)
{
var newMap = new ColorMap();
foreach (var row in map)
{
var newList = new List<Color>();
newMap.Add(newList);
foreach (var color in row)
{
var r = color.Red / 255;
r = Math.Round(r, 4);
var g = color.Green / 255;
g = Math.Round(g, 4);
var b = color.Blue / 255;
b = Math.Round(b, 4);
var newColor = new Color(r, g, b);
newList.Add(newColor);
}
}
return newMap;
}
static ColorMap performsLinearConversion(ColorMap map)
{
map = convertToNonLinear(map);
var newMap = new ColorMap();
foreach (var row in map)
{
var newList = new List<Color>();
newMap.Add(newList);
foreach (var color in row)
{
var r = color.Red;
if (r < 0.00304)
{
r *= 12.92;
}
else {
r = (1.055 * Math.Pow(r, 2.4));
r-= 0.055;
}
var g = color.Green;
if (g < 0.00304)
{
g *= 12.92;
}
else {
g = (1.055 * Math.Pow(g, 2.4));
g -= 0.055;
}
var b = color.Blue;
if (b < 0.00304)
{
b *= 12.92;
}
else {
b = (1.055 * Math.Pow(b, 2.4));
b -= 0.055;
}
var newColor = new Color(Math.Round(r*255,4), Math.Round(g * 255, 4), Math.Round(b * 255, 4));
newList.Add(newColor);
}
}
return newMap;
}
static ColorMap performXYZConversion(ColorMap map)
{
map = convertToNonLinear(map);
var newMap = new ColorMap();
foreach (var row in map)
{
var newList = new List<Color>();
newMap.Add(newList);
foreach (var color in row)
{
var r = color.Red;
if (r < .03928)
{
r /= 12.92;
}
else {
r += .055;
r /= 1.055;
r = Math.Pow(r, 2.4);
}
var g = color.Green;
if (g < .03928)
{
g /= 12.92;
}
else {
g += .055;
g /= 1.055;
g = Math.Pow(g, 2.4);
}
var b = color.Blue;
if (b < .03928)
{
b /= 12.92;
}
else {
b += .055;
b /= 1.055;
b = Math.Pow(b, 2.4);
}
var newColor = new Color(Math.Round(r,4), Math.Round(g,4), Math.Round(b,4));
newList.Add(newColor);
}
}
return newMap;
}
static ColorMap performXYConversion(ColorMap map)
{
map = performXYZConversion(map);
var newMap = new ColorMap();
foreach (var row in map)
{
var newList = new List<Color>();
newMap.Add(newList);
foreach (var color in row)
{
var X = color.Red;
var Y = color.Green;
var Z = color.Blue;
double x = X / (X + Y + Z);
double y = Y / (X + Y + Z);
newList.Add(new Color(Math.Round(x, 4), Math.Round(y, 4), Math.Round(Z,4)));
}
}
return newMap;
}
static void printMap(ColorMap map)
{
foreach (var row in map)
{
foreach (var coord in row)
{
Console.Write(coord);
}
Console.WriteLine();
}
}
}
public class ColorMap : List<List<Color>>
{
}
public class Color
{
public Color(double r, double g, double b)
{
Red = r;
Green = g;
Blue = b;
}
public override string ToString()
{
return string.Format("[{0}, {1}, {2}]", Red, Green, Blue);
}
public double Red { get; set; }
public double Green { get; set; }
public double Blue { get; set; }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment