/// <summary> /// Convert binary data into an image in 2BPP planar (Gameboy). /// </summary> /// <param name="stream">MemoryStream which contains data.</param> /// <param name="parameters">Parameters for the image.</param> /// <returns>Return the data converted into a SKBitmap.</returns> public SKBitmap Convert(MemoryStream stream, IImagePattern parameters) { if (stream == null || parameters == null) { return(null); } SKBitmap bitmap = null; using (var binaryReader = new BinaryReader(stream, Encoding.UTF8, true)) { var imageInfo = new SKImageInfo(parameters.Width, parameters.Height, SKColorType.Rgba8888); bitmap = new SKBitmap(imageInfo); int tileHeight = parameters.TilePattern.Height; int tileWidth = parameters.TilePattern.Width; int numberOfRowsOfTiles = parameters.Height / tileHeight; int numberOfColsOfTiles = parameters.Width / tileWidth; var pixels = bitmap.Pixels; int numberOfTiles = numberOfRowsOfTiles * numberOfColsOfTiles; int numberTotalOfBit = numberOfTiles * parameters.TilePattern.Size * 8; var imageBits = new BitList(numberTotalOfBit, false); var imageTiles = new BitList(); for (int i = 0; i < numberOfTiles; i++) { var tileBytes = binaryReader.ReadBytes(parameters.TilePattern.Size); var tileBits = new BitList(tileBytes); var tile = tileBits.RearrangeBitsWith2Planes(parameters.TilePattern); imageTiles.AddBitList(tile); } int index = 0; for (var row = 0; row < numberOfRowsOfTiles; row++) { for (var column = 0; column < numberOfColsOfTiles; column++) { for (var height = 0; height < tileHeight; height++) { for (var width = 0; width < tileWidth; width++) { var bitColor = System.Convert.ToInt32(imageTiles.GetBinaryString(index++) + imageTiles.GetBinaryString(index++), 2); SKColor color; if (parameters.Palette.Count > 0) { color = parameters.Palette[bitColor]; } else { color = this.defaultPalette[bitColor]; } pixels[(height * parameters.Width) + width + (column * tileWidth) + (row * tileHeight * parameters.Width)] = color; } } } } bitmap.Pixels = pixels; } return(bitmap); }