CCCPaste

MS-BmpMakerClass-cs

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;
		}
    }
}