/// <summary> /// Colorizing the Intensity Mask /// Create a color map that tells the GDI rendering method how it should draw the colors. /// What we're actually doing here is creating a table that specifies a new color for each shade of gray /// (all 256) of them. The easiest way to do this is to create a palette image that's /// 256 pixels wide by 1 pixel high. /// That means that we can directly map each pixel in the palette image to a shade of gray. /// </summary> /// <param name="mask">Gray shaded image to be colorized</param> /// <param name="alpha">0-255</param> /// <param name="type">ColorPaletteType (Photosounder, Rew or Sox)</param> /// <returns>a colorized bitmap</returns> public static Bitmap Colorize(Image mask, byte alpha, ColorPaletteType type) { // Create new bitmap to act as a work surface for the colorization process var output = new Bitmap(mask.Width, mask.Height, PixelFormat.Format32bppArgb); // Create a graphics object from our memory bitmap so we can draw on it and clear it's drawing surface Graphics surface = Graphics.FromImage(output); surface.Clear(Color.Transparent); // Build an array of color mappings to remap our greyscale mask to full color // Accept an alpha byte to specify the transparancy of the output image ColorMap[] colors = CreatePaletteIndex(alpha, type); // Create new image attributes class to handle the color remappings // Inject our color map array to instruct the image attributes class how to do the colorization var remapper = new ImageAttributes(); remapper.SetRemapTable(colors); // Draw our mask onto our memory bitmap work surface using the new color mapping scheme surface.DrawImage(mask, new Rectangle(0, 0, mask.Width, mask.Height), 0, 0, mask.Width, mask.Height, GraphicsUnit.Pixel, remapper); // Send back newly colorized memory bitmap return(output); }
/// <summary> /// Return a list of gradients based on the REW color palette /// </summary> /// <param name="steps">number of gradients (colors) to create</param> /// <param name="type">ColorPaletteType (Photosounder, Rew or Sox)</param> /// <returns>a list of gradients</returns> public static List <Color> GetHSLColorGradients(int steps, ColorPaletteType type) { var colors = new List <IColor>(); switch (type) { case ColorPaletteType.REW: // create REW gradient colors.Add(HSLColor.FromRGB(Color.Red)); colors.Add(HSLColor.FromRGB(Color.Yellow)); colors.Add(HSLColor.FromRGB(Color.FromArgb(2, 178, 0))); // green colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 176, 178))); // light blue colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 0, 177))); // blue colors.Add(HSLColor.FromRGB(Color.FromArgb(61, 0, 124))); // purple break; case ColorPaletteType.SOX: // create SOX gradient colors.Add(HSLColor.FromRGB(Color.FromArgb(255, 255, 254))); // white colors.Add(HSLColor.FromRGB(Color.FromArgb(255, 235, 60))); colors.Add(HSLColor.FromRGB(Color.FromArgb(252, 86, 0))); colors.Add(HSLColor.FromRGB(Color.FromArgb(210, 0, 64))); colors.Add(HSLColor.FromRGB(Color.FromArgb(131, 0, 125))); colors.Add(HSLColor.FromRGB(Color.FromArgb(25, 0, 98))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 0, 0))); // black break; case ColorPaletteType.PHOTOSOUNDER: // create Photosounder gradient colors.Add(HSLColor.FromRGB(Color.FromArgb(255, 255, 254))); // white colors.Add(HSLColor.FromRGB(Color.FromArgb(249, 247, 78))); // colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 0, 100))); // blue break; case ColorPaletteType.MATLAB: // create Matlab / Octave gradient (jet(64)) colors.Add(HSLColor.FromRGB(Color.FromArgb(127, 0, 0))); colors.Add(HSLColor.FromRGB(Color.FromArgb(255, 2, 0))); colors.Add(HSLColor.FromRGB(Color.FromArgb(255, 131, 0))); colors.Add(HSLColor.FromRGB(Color.FromArgb(249, 255, 6))); colors.Add(HSLColor.FromRGB(Color.FromArgb(119, 255, 135))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 244, 255))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 115, 255))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 0, 240))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 0, 127))); break; case ColorPaletteType.BLACK_AND_WHITE: default: // create black and white gradient colors.Add(HSLColor.FromRGB(Color.White)); colors.Add(HSLColor.FromRGB(Color.Black)); break; } List <Color> gradients = ColorUtils.HslLinearInterpolate(steps, colors); return(gradients); }
/// <summary> /// Return a list of gradients based on the REW color palette /// </summary> /// <param name="steps">number of gradients (colors) to create</param> /// <param name="type">ColorPaletteType (Photosounder, Rew or Sox)</param> /// <returns>a list of gradients</returns> public static List <Color> GetRGBColorGradients(int steps, ColorPaletteType type) { var colors = new List <Color>(); switch (type) { case ColorPaletteType.REW: // create REW gradient colors.Add(Color.Red); colors.Add(Color.Yellow); colors.Add(Color.FromArgb(2, 178, 0)); // green colors.Add(Color.FromArgb(0, 176, 178)); // light blue colors.Add(Color.FromArgb(0, 0, 177)); // blue colors.Add(Color.FromArgb(61, 0, 124)); // purple break; case ColorPaletteType.SOX: // create SOX gradient colors.Add(Color.FromArgb(255, 255, 254)); // white colors.Add(Color.FromArgb(255, 235, 60)); colors.Add(Color.FromArgb(252, 86, 0)); colors.Add(Color.FromArgb(210, 0, 64)); colors.Add(Color.FromArgb(131, 0, 125)); colors.Add(Color.FromArgb(25, 0, 98)); colors.Add(Color.FromArgb(0, 0, 0)); // black break; case ColorPaletteType.PHOTOSOUNDER: // create Photosounder gradient colors.Add(Color.FromArgb(255, 255, 255)); // white colors.Add(Color.FromArgb(255, 255, 112)); // skin color colors.Add(Color.FromArgb(63, 120, 190)); // colors.Add(Color.FromArgb(16, 70, 180)); // colors.Add(Color.FromArgb(14, 55, 170)); // colors.Add(Color.FromArgb(12, 30, 155)); // colors.Add(Color.FromArgb(12, 30, 130)); // colors.Add(Color.FromArgb(10, 22, 110)); // colors.Add(Color.FromArgb(10, 21, 106)); // colors.Add(Color.FromArgb(10, 21, 104)); // colors.Add(Color.FromArgb(10, 21, 100)); // dark blue break; case ColorPaletteType.BLACK_AND_WHITE: default: // create black and white gradient colors.Add(Color.White); colors.Add(Color.Black); break; } List <Color> gradients = ColorUtils.RgbLinearInterpolate(steps, colors); return(gradients); }
/// <summary> /// Build an array of color mappings to remap our greyscale mask to full color /// Accept an alpha byte to specify the transparancy of the output image /// </summary> /// <param name="alpha">specify the transparancy of the output image</param> /// <param name="type">ColorPaletteType (Photosounder, Rew or Sox)</param> /// <returns>a ColorMap array</returns> private static ColorMap[] CreatePaletteIndex(byte alpha, ColorPaletteType type) { ColorMap[] outputMap = new ColorMap[256]; // Change this path to wherever you saved the palette image. //Bitmap palette = (Bitmap)Bitmap.FromFile(@"C:\Users\Dylan\Documents\Visual Studio 2005\Projects\HeatMapTest\palette.bmp"); List <Color> gradients; switch (type) { case ColorPaletteType.PHOTOSOUNDER: gradients = ColorUtils.GetRGBColorGradients(256, ColorUtils.ColorPaletteType.PHOTOSOUNDER); break; case ColorPaletteType.REW: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.REW); break; case ColorPaletteType.SOX: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.SOX); break; case ColorPaletteType.MATLAB: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.MATLAB); break; default: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.SOX); break; } Bitmap palette = GetColorGradientsPalette(gradients, 1); // Loop through each pixel and create a new color mapping for (int x = 0; x <= 255; x++) { outputMap[x] = new ColorMap(); outputMap[x].OldColor = Color.FromArgb(x, x, x); outputMap[x].NewColor = Color.FromArgb(alpha, palette.GetPixel(255 - x, 0)); } return(outputMap); }
/// <summary> /// Build an array of color mappings to remap our greyscale mask to full color /// Accept an alpha byte to specify the transparancy of the output image /// </summary> /// <param name="alpha">specify the transparancy of the output image</param> /// <param name="type">ColorPaletteType (Photosounder, Rew or Sox)</param> /// <returns>a ColorMap array</returns> private static ColorMap[] CreatePaletteIndex(byte alpha, ColorPaletteType type) { var outputMap = new ColorMap[256]; List <Color> gradients; switch (type) { case ColorPaletteType.PHOTOSOUNDER: gradients = ColorUtils.GetRGBColorGradients(256, ColorUtils.ColorPaletteType.PHOTOSOUNDER); break; case ColorPaletteType.REW: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.REW); break; case ColorPaletteType.SOX: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.SOX); break; case ColorPaletteType.MATLAB: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.MATLAB); break; default: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.SOX); break; } Bitmap palette = GetColorGradientsPalette(gradients, 1); // Loop through each pixel and create a new color mapping for (int x = 0; x <= 255; x++) { outputMap[x] = new ColorMap(); outputMap[x].OldColor = Color.FromArgb(x, x, x); outputMap[x].NewColor = Color.FromArgb(alpha, palette.GetPixel(255 - x, 0)); } return(outputMap); }
/// <summary> /// Build an array of color mappings to remap our greyscale mask to full color /// Accept an alpha byte to specify the transparancy of the output image /// </summary> /// <param name="alpha">specify the transparancy of the output image</param> /// <param name="type">ColorPaletteType (Photosounder, Rew or Sox)</param> /// <returns>a ColorMap array</returns> private static ColorMap[] CreatePaletteIndex(byte alpha, ColorPaletteType type) { ColorMap[] outputMap = new ColorMap[256]; // Change this path to wherever you saved the palette image. //Bitmap palette = (Bitmap)Bitmap.FromFile(@"C:\Users\Dylan\Documents\Visual Studio 2005\Projects\HeatMapTest\palette.bmp"); List<Color> gradients; switch (type) { case ColorPaletteType.PHOTOSOUNDER: gradients = ColorUtils.GetRGBColorGradients(256, ColorUtils.ColorPaletteType.PHOTOSOUNDER); break; case ColorPaletteType.REW: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.REW); break; case ColorPaletteType.SOX: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.SOX); break; case ColorPaletteType.MATLAB: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.MATLAB); break; default: gradients = ColorUtils.GetHSBColorGradients(256, ColorUtils.ColorPaletteType.SOX); break; } Bitmap palette = GetColorGradientsPalette(gradients, 1); // Loop through each pixel and create a new color mapping for (int x = 0; x <= 255; x++) { outputMap[x] = new ColorMap(); outputMap[x].OldColor = Color.FromArgb(x, x, x); outputMap[x].NewColor = Color.FromArgb(alpha, palette.GetPixel(255-x, 0)); } return outputMap; }
/// <summary> /// Return a list of gradients based on the REW color palette /// </summary> /// <param name="steps">number of gradients (colors) to create</param> /// <returns>a list of gradients</returns> public static List<Color> GetRGBColorGradients(int steps, ColorPaletteType type) { List<Color> colors = new List<Color>(); switch (type) { case ColorPaletteType.REW: // create REW gradient colors.Add(Color.Red); colors.Add(Color.Yellow); colors.Add(Color.FromArgb(2, 178, 0)); // green colors.Add(Color.FromArgb(0, 176, 178)); // light blue colors.Add(Color.FromArgb(0, 0, 177)); // blue colors.Add(Color.FromArgb(61, 0, 124)); // purple break; case ColorPaletteType.SOX: // create SOX gradient colors.Add(Color.FromArgb(255,255,254)); // white colors.Add(Color.FromArgb(255,235,60)); colors.Add(Color.FromArgb(252,86,0)); colors.Add(Color.FromArgb(210,0,64)); colors.Add(Color.FromArgb(131,0,125)); colors.Add(Color.FromArgb(25,0,98)); colors.Add(Color.FromArgb(0,0,0)); // black break; case ColorPaletteType.PHOTOSOUNDER: // create Photosounder gradient colors.Add(Color.FromArgb(255, 255, 255)); // white colors.Add(Color.FromArgb(255, 255, 112)); // skin color colors.Add(Color.FromArgb(63, 120, 190)); // colors.Add(Color.FromArgb(16, 70, 180)); // colors.Add(Color.FromArgb(14, 55, 170)); // colors.Add(Color.FromArgb(12, 30, 155)); // colors.Add(Color.FromArgb(12, 30, 130)); // colors.Add(Color.FromArgb(10, 22, 110)); // colors.Add(Color.FromArgb(10, 21, 106)); // colors.Add(Color.FromArgb(10, 21, 104)); // colors.Add(Color.FromArgb(10, 21, 100)); // dark blue break; case ColorPaletteType.BLACK_AND_WHITE: default: // create black and white gradient colors.Add(Color.White); colors.Add(Color.Black); break; } List<Color> gradients = ColorUtils.RgbLinearInterpolate(steps, colors); return gradients; }
/// <summary> /// Return a list of gradients based on the REW color palette /// </summary> /// <param name="steps">number of gradients (colors) to create</param> /// <returns>a list of gradients</returns> public static List<Color> GetHSLColorGradients(int steps, ColorPaletteType type) { List<IColor> colors = new List<IColor>(); switch (type) { case ColorPaletteType.REW: // create REW gradient colors.Add(HSLColor.FromRGB(Color.Red)); colors.Add(HSLColor.FromRGB(Color.Yellow)); colors.Add(HSLColor.FromRGB(Color.FromArgb(2, 178, 0))); // green colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 176, 178))); // light blue colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 0, 177))); // blue colors.Add(HSLColor.FromRGB(Color.FromArgb(61, 0, 124))); // purple break; case ColorPaletteType.SOX: // create SOX gradient colors.Add(HSLColor.FromRGB(Color.FromArgb(255,255,254))); // white colors.Add(HSLColor.FromRGB(Color.FromArgb(255,235,60))); colors.Add(HSLColor.FromRGB(Color.FromArgb(252,86,0))); colors.Add(HSLColor.FromRGB(Color.FromArgb(210,0,64))); colors.Add(HSLColor.FromRGB(Color.FromArgb(131,0,125))); colors.Add(HSLColor.FromRGB(Color.FromArgb(25,0,98))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0,0,0))); // black break; case ColorPaletteType.PHOTOSOUNDER: // create Photosounder gradient colors.Add(HSLColor.FromRGB(Color.FromArgb(255, 255, 254))); // white colors.Add(HSLColor.FromRGB(Color.FromArgb(249, 247, 78))); // colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 0, 100))); // blue break; case ColorPaletteType.MATLAB: // create Matlab / Octave gradient (jet(64)) colors.Add(HSLColor.FromRGB(Color.FromArgb(127, 0, 0))); colors.Add(HSLColor.FromRGB(Color.FromArgb(255, 2, 0))); colors.Add(HSLColor.FromRGB(Color.FromArgb(255, 131, 0))); colors.Add(HSLColor.FromRGB(Color.FromArgb(249, 255, 6))); colors.Add(HSLColor.FromRGB(Color.FromArgb(119, 255, 135))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 244, 255))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 115, 255))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 0, 240))); colors.Add(HSLColor.FromRGB(Color.FromArgb(0, 0, 127))); break; case ColorPaletteType.BLACK_AND_WHITE: default: // create black and white gradient colors.Add(HSLColor.FromRGB(Color.White)); colors.Add(HSLColor.FromRGB(Color.Black)); break; } List<Color> gradients = ColorUtils.HslLinearInterpolate(steps, colors); return gradients; }
/// <summary> /// Colorizing the Intensity Mask /// Create a color map that tells the GDI rendering method how it should draw the colors. /// What we're actually doing here is creating a table that specifies a new color for each shade of gray /// (all 256) of them. The easiest way to do this is to create a palette image that's /// 256 pixels wide by 1 pixel high. /// That means that we can directly map each pixel in the palette image to a shade of gray. /// </summary> /// <param name="mask">Gray shaded image to be colorized</param> /// <param name="alpha">0-255</param> /// <returns>a colorized bitmap</returns> public static Bitmap Colorize(Image mask, byte alpha, ColorPaletteType type) { // Create new bitmap to act as a work surface for the colorization process Bitmap output = new Bitmap(mask.Width, mask.Height, PixelFormat.Format32bppArgb); // Create a graphics object from our memory bitmap so we can draw on it and clear it's drawing surface Graphics surface = Graphics.FromImage(output); surface.Clear(Color.Transparent); // Build an array of color mappings to remap our greyscale mask to full color // Accept an alpha byte to specify the transparancy of the output image ColorMap[] colors = CreatePaletteIndex(alpha, type); // Create new image attributes class to handle the color remappings // Inject our color map array to instruct the image attributes class how to do the colorization ImageAttributes remapper = new ImageAttributes(); remapper.SetRemapTable(colors); // Draw our mask onto our memory bitmap work surface using the new color mapping scheme surface.DrawImage(mask, new Rectangle(0, 0, mask.Width, mask.Height), 0, 0, mask.Width, mask.Height, GraphicsUnit.Pixel, remapper); // Send back newly colorized memory bitmap return output; }
private void ColorPaletteTypeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { colorPaletteType = (ColorPaletteType)ColorPaletteTypeComboBox.SelectedItem; Refresh(); }