public uint[] GetUsedColors(bool forceUpdate = false) { if (usedColors != null && !forceUpdate) { return(usedColors.ToArray()); } usedColors = new List <uint>(); for (int c = 0; c < data.Length; c += 4) { uint color = Palette.RGBToPalette(data[c], data[c + 1], data[c + 2]); int r = (int)(color & 0b0000_0000_0000_0000_1111_1111); int g = (int)(color >> 8 & 0b0000_0000_0000_0000_1111_1111); int b = (int)(color >> 16 & 0b0000_0000_0000_0000_1111_1111); if (!usedColors.Contains(color)) { usedColors.Add(color); usedColors.Sort(); } } return(usedColors.ToArray()); }
private byte[] WriteImageDataWithNoEncoding(byte[] data, int pos, int length) { List <byte> newData = new List <byte>(); for (int i = 0; i < length; i += 4) { int value; byte red = data[i + 0]; byte green = data[i + 1]; byte blue = data[i + 2]; byte alpha = data[i + 3]; value = palette.GetIndex(paletteOffset, Palette.RGBToPalette(red, green, blue)); if (value == -1) { Console.WriteLine($"Invalid color - not found in the palette! Color: R:{red}, G:{green}, B:{blue}"); } value = value - paletteOffset; if (value >= 252) { Console.WriteLine("Invalid color - not found in the palette!"); } newData.Add((byte)value); } return(newData.ToArray()); }
private byte[] CreateImageDataWithRunLengthEncoding(byte[] data, int length) { List <byte> newData = new List <byte>(); int dataLength = 0; for (int i = 0; i < length; i += 4) { int value = 0; byte red = data[i + 0]; byte green = data[i + 1]; byte blue = data[i + 2]; byte alpha = data[i + 3]; bool valueIsOperator = false; if (red == 255 && green + blue == 0) { value = 0;//transparent valueIsOperator = true; } else if (green == 255 && red + blue == 0) { value = 1;//shadow valueIsOperator = true; } else { value = palette.GetIndex(paletteOffset, Palette.RGBToPalette(red, green, blue)); value = value - paletteOffset; value = Math.Max((byte)2, (byte)value); } int count = 1; newData.Add((byte)value); dataLength += 1; if (valueIsOperator == true) { int offset = 0; count = GetSameValueCount(ref data, i, value, ref offset); newData.Add((byte)count); i = offset; dataLength += 1; } } return(newData.ToArray()); }