public override void GetSettings(ProjectModel.Properties headerSettings) { base.GetSettings(headerSettings); headerSettings["DiscardRedundant"] = DiscardRedundantTiles ? "1" : "0"; headerSettings["ReducePalette"] = ReducePalette ? "1" : "0"; headerSettings["ExportPalette"] = ExportPalette ? "1" : "0"; headerSettings["ChrType"] = Type.ToString(); headerSettings["Palette"] = SerializePalette(PaletteAssignment); if (TilePalettes != null) { headerSettings["TilePalettes"] = string.Join(":", TilePalettes.Select(SerializePalette)); } }
public Bitmap GetReducedImage(Bitmap image) { var bitmap = new Bitmap(image.Width, image.Height); var tileCount = (image.Width / 8) * (image.Height / 8); var basePalette = TilePalettes.OrderByDescending(p => p.Count).First().ToDictionary(k => k.Value, k => k.Key); for (var i = 0; i < tileCount; i++) { // TODO: Reduce redundancy var tilePalette = new List <Color>(); var offset = i * 8; var offsetY = (offset / image.Width) * 8; var offsetX = (offset % image.Width); for (var y = 0; y < 8; y++) { for (var x = 0; x < 8; x++) { var color = image.GetPixel(offsetX + x, offsetY + y); if (!tilePalette.Contains(color)) { tilePalette.Add(color); } } } var paletteReference = TilePalettes.FirstOrDefault(p => tilePalette.All(p.ContainsKey)); if (paletteReference == null) { paletteReference = tilePalette.Select((color, index) => new { color, index }).ToDictionary(x => x.color, x => x.index); // If no matching palettes are found, new colors has been added since we generated our reduced palette. Just ignore these } for (var y = 0; y < 8; y++) { for (var x = 0; x < 8; x++) { var color = image.GetPixel(offsetX + x, offsetY + y); bitmap.SetPixel(offsetX + x, offsetY + y, basePalette[paletteReference[color]]); } } } return(bitmap); }