private static IEnumerable<byte[]> indexedPixels(ImageBuffer image, Pixel[] lookups, int alphaThreshold, int maxColors, PaletteColorHistory[] paletteHistogram) { int pixelsCount = image.Image.Width * image.Image.Height; var lineIndexes = new byte[(int)System.Math.Ceiling(image.Image.Width / System.Math.Log(256.0, maxColors))]; PaletteLookup lookup = new PaletteLookup(lookups); --maxColors; foreach (var pixelLine in image.PixelLines) { for (int pixelIndex = 0; pixelIndex < pixelLine.Length; pixelIndex++) { Pixel pixel = pixelLine[pixelIndex]; byte bestMatch = (byte)maxColors; if (pixel.Alpha > alphaThreshold) { bestMatch = lookup.GetPaletteIndex(pixel); paletteHistogram[bestMatch].AddPixel(pixel); } switch (maxColors) { case 256 - 1: lineIndexes[pixelIndex] = bestMatch; break; case 16 - 1: if (pixelIndex % 2 == 0) { lineIndexes[pixelIndex / 2] = (byte)(bestMatch << 4); } else { lineIndexes[pixelIndex / 2] |= (byte)(bestMatch & 0x0F); } break; case 2 - 1: if (pixelIndex % 8 == 0) { lineIndexes[pixelIndex / 8] = (byte)(bestMatch << 7); } else { lineIndexes[pixelIndex / 8] |= (byte)((bestMatch & 0x01) << (7 - (pixelIndex % 8))); } break; } } yield return lineIndexes; } }
private static IEnumerable <byte[]> indexedPixels(ImageBuffer image, Pixel[] lookups, int alphaThreshold, int maxColors, PaletteColorHistory[] paletteHistogram) { int pixelsCount = image.Image.Width * image.Image.Height; var lineIndexes = new byte[(int)System.Math.Ceiling(image.Image.Width / System.Math.Log(256.0, maxColors))]; PaletteLookup lookup = new PaletteLookup(lookups); --maxColors; foreach (var pixelLine in image.PixelLines) { for (int pixelIndex = 0; pixelIndex < pixelLine.Length; pixelIndex++) { Pixel pixel = pixelLine[pixelIndex]; byte bestMatch = (byte)maxColors; if (pixel.Alpha > alphaThreshold) { bestMatch = lookup.GetPaletteIndex(pixel); paletteHistogram[bestMatch].AddPixel(pixel); } switch (maxColors) { case 256 - 1: lineIndexes[pixelIndex] = bestMatch; break; case 16 - 1: if (pixelIndex % 2 == 0) { lineIndexes[pixelIndex / 2] = (byte)(bestMatch << 4); } else { lineIndexes[pixelIndex / 2] |= (byte)(bestMatch & 0x0F); } break; case 2 - 1: if (pixelIndex % 8 == 0) { lineIndexes[pixelIndex / 8] = (byte)(bestMatch << 7); } else { lineIndexes[pixelIndex / 8] |= (byte)((bestMatch & 0x01) << (7 - (pixelIndex % 8))); } break; } } yield return(lineIndexes); } }
private static IEnumerable <byte[]> IndexedPixels(ImageBuffer image, Pixel[] lookups, int alphaThreshold, PaletteColorHistory[] paletteHistogram) { var lineIndexes = new byte[image.Image.Width]; var lookup = new PaletteLookup(lookups); foreach (var pixelLine in image.PixelLines) { for (int pixelIndex = 0; pixelIndex < pixelLine.Length; pixelIndex++) { Pixel pixel = pixelLine[pixelIndex]; byte bestMatch = AlphaColor; if (pixel.Alpha > alphaThreshold) { bestMatch = lookup.GetPaletteIndex(pixel); paletteHistogram[bestMatch].AddPixel(pixel); } lineIndexes[pixelIndex] = bestMatch; } yield return(lineIndexes); } }