Created
February 13, 2017 01:42
-
-
Save rlingineni/dd45846852fe3598aa4412e5095f40e0 to your computer and use it in GitHub Desktop.
Different Conversions of Color Representations
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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