示例#1
0
        /// <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);
        }