using System; using System.IO; using System.Linq; using Xamarin.Forms; using System.Text; using System.Collections.Generic; namespace MandelBrootSet { public class BmpMaker { const int headerSize = 54; readonly byte[] buffer; public BmpMaker(int width, int height) { Width = width; Height = height; int numPixels = Width * Height; int numPixelBytes = 4 * numPixels; int fileSize = headerSize + numPixelBytes; buffer = new byte[fileSize]; // Escritor y acumulador de encabezados: Buffer. using (MemoryStream memoryStream = new MemoryStream(buffer)) { //Asignación binaria del archivo temporal. using (BinaryWriter writer = new BinaryWriter(memoryStream, Encoding.UTF8)) { // Constructor del encabezado del BitMap (14 bytes). writer.Write(new char[] { 'B', 'M' }); writer.Write(fileSize); writer.Write((short)0); writer.Write((short)0); writer.Write(headerSize); // Constructor BitmapInfoHeader (40 bytes). writer.Write(40); // Header size writer.Write(Width); writer.Write(Height); writer.Write((short)1); //Tasa writer.Write((short)32); //Tasa writer.Write(0); // Compresión writer.Write(numPixelBytes); //Balanza de imagen en pixeles. writer.Write(0); //Densidad de Pixels/Color writer.Write(0); writer.Write(0); writer.Write(0); } } } //Instanciando Ancho y Altura public int Width { private set; get; } public int Height { private set; get; } //Funciones de configuración de Color y carga del Buffer public void SetPixel(int row, int col, Color color) { SetPixel(row, col, (int)(255 * color.R), (int)(255 * color.G), (int)(255 * color.B), (int)(255 * color.A)); } public void SetPixel(int row, int col, int r, int g, int b, int a = 255) { int index = (row * Width + col) * 4 + headerSize; buffer[index + 0] = (byte)b; buffer[index + 1] = (byte)g; buffer[index + 2] = (byte)r; buffer[index + 3] = (byte)a; } //Método para generar la imagen. public ImageSource Generate() { // Creando el MemoryStream a partir del Buffer colector de bitmaps. MemoryStream memoryStream = new MemoryStream(buffer); // Conversión a StreamImageSource. ImageSource imageSource = ImageSource.FromStream(() => { return memoryStream; }); return imageSource; } } }