2021-11-30 02:04:25 +00:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
namespace Palettizer
|
|
|
|
{
|
|
|
|
public class Palette
|
|
|
|
{
|
2021-11-30 23:21:47 +00:00
|
|
|
public Dictionary<byte, Color> GrayscaleToColorMap { get; }
|
|
|
|
public Color[] GrayscaleToColor { get; }
|
|
|
|
public Dictionary<Color, byte> ColorToGrayscaleMap { get; }
|
|
|
|
public int GrayscaleCount { get; set; }
|
|
|
|
public List<byte[]> AlternateColorRows { get; }
|
2021-11-30 02:04:25 +00:00
|
|
|
|
2021-11-30 23:21:47 +00:00
|
|
|
public int Width { get => 256; }
|
|
|
|
public int Height { get => AlternateColorRows.Count + 2; }
|
2021-11-30 02:04:25 +00:00
|
|
|
|
|
|
|
public Palette()
|
|
|
|
{
|
2021-11-30 23:21:47 +00:00
|
|
|
GrayscaleToColorMap = new Dictionary<byte, Color>();
|
2021-11-30 02:04:25 +00:00
|
|
|
ColorToGrayscaleMap = new Dictionary<Color, byte>();
|
2021-11-30 23:21:47 +00:00
|
|
|
GrayscaleCount = 0;
|
|
|
|
AlternateColorRows = new List<byte[]>();
|
2021-11-30 02:04:25 +00:00
|
|
|
}
|
|
|
|
|
2021-11-30 23:21:47 +00:00
|
|
|
public void AddColor(Color color)
|
2021-11-30 02:04:25 +00:00
|
|
|
{
|
2021-11-30 23:21:47 +00:00
|
|
|
var average = (color.R + color.G + color.B) / 3;
|
|
|
|
if (GrayscaleToColorMap.ContainsKey((byte)average))
|
|
|
|
{
|
|
|
|
var increment = 1;
|
|
|
|
for (var i = 0; i < 256 - GrayscaleCount; i += 1)
|
|
|
|
{
|
|
|
|
average += increment;
|
|
|
|
|
|
|
|
if (!GrayscaleToColorMap.ContainsKey((byte)average))
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
increment = ((increment > 0) ? (increment + 1) : (increment - 1)) * -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
GrayscaleToColorMap.Add((byte)average, color);
|
|
|
|
ColorToGrayscaleMap.Add(color, (byte)average);
|
|
|
|
GrayscaleCount += 1;
|
|
|
|
}
|
2021-11-30 02:04:25 +00:00
|
|
|
|
|
|
|
public void AddAlternateColorRow(Color[] colors)
|
|
|
|
{
|
2021-11-30 23:21:47 +00:00
|
|
|
var byteArray = new byte[256 * 4];
|
2021-11-30 02:04:25 +00:00
|
|
|
|
2021-11-30 23:21:47 +00:00
|
|
|
for (var i = 0; i < 256; i += 1)
|
2021-11-30 02:04:25 +00:00
|
|
|
{
|
2021-11-30 23:21:47 +00:00
|
|
|
byteArray[i * 4] = colors[i].R;
|
|
|
|
byteArray[i * 4 + 1] = colors[i].G;
|
|
|
|
byteArray[i * 4 + 2] = colors[i].B;
|
|
|
|
byteArray[i * 4 + 3] = colors[i].A;
|
|
|
|
}
|
2021-11-30 02:04:25 +00:00
|
|
|
|
2021-11-30 23:21:47 +00:00
|
|
|
AlternateColorRows.Add(byteArray);
|
2021-11-30 02:04:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public byte[] CreateIndexedPaletteBitmap()
|
|
|
|
{
|
2021-11-30 23:21:47 +00:00
|
|
|
var paletteBitmap = new byte[256 * (AlternateColorRows.Count + 2) * 4];
|
2021-11-30 02:04:25 +00:00
|
|
|
|
2021-11-30 23:21:47 +00:00
|
|
|
for (var i = 0; i < 256; i += 1)
|
2021-11-30 02:04:25 +00:00
|
|
|
{
|
2021-11-30 23:21:47 +00:00
|
|
|
paletteBitmap[i * 4] = (byte)i;
|
|
|
|
paletteBitmap[i * 4 + 1] = (byte)i;
|
|
|
|
paletteBitmap[i * 4 + 2] = (byte)i;
|
|
|
|
paletteBitmap[i * 4 + 3] = 255;
|
|
|
|
}
|
2021-11-30 02:04:25 +00:00
|
|
|
|
2021-11-30 23:21:47 +00:00
|
|
|
for (var i = 0; i < 256; i += 1)
|
|
|
|
{
|
|
|
|
var color = new Color();
|
|
|
|
if (GrayscaleToColorMap.ContainsKey((byte)i))
|
2021-11-30 02:04:25 +00:00
|
|
|
{
|
2021-11-30 23:21:47 +00:00
|
|
|
color = GrayscaleToColorMap[(byte)i];
|
|
|
|
}
|
|
|
|
paletteBitmap[(256 + i) * 4] = color.R;
|
|
|
|
paletteBitmap[(256 + i) * 4 + 1] = color.G;
|
|
|
|
paletteBitmap[(256 + i) * 4 + 2] = color.B;
|
|
|
|
paletteBitmap[(256 + i) * 4 + 3] = color.A;
|
|
|
|
}
|
2021-11-30 02:04:25 +00:00
|
|
|
|
2021-11-30 23:21:47 +00:00
|
|
|
for (var i = 0; i < 256; i += 1)
|
|
|
|
{
|
|
|
|
for (var j = 0; j < AlternateColorRows.Count; j += 1)
|
|
|
|
{
|
|
|
|
paletteBitmap[(i + (256 * (j + 2))) * 4] = AlternateColorRows[j][i * 4];
|
|
|
|
paletteBitmap[(i + (256 * (j + 2))) * 4 + 1] = AlternateColorRows[j][i * 4 + 1];
|
|
|
|
paletteBitmap[(i + (256 * (j + 2))) * 4 + 2] = AlternateColorRows[j][i * 4 + 2];
|
|
|
|
paletteBitmap[(i + (256 * (j + 2))) * 4 + 3] = AlternateColorRows[j][i * 4 + 3];
|
|
|
|
}
|
|
|
|
}
|
2021-11-30 02:04:25 +00:00
|
|
|
|
|
|
|
return paletteBitmap;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|