rectangle - windows forms c# draw line
Crear máscara de 1bpp desde la imagen (3)
Prueba esto:
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
...
public static Bitmap BitmapTo1Bpp(Bitmap img) {
int w = img.Width;
int h = img.Height;
Bitmap bmp = new Bitmap(w, h, PixelFormat.Format1bppIndexed);
BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed);
for (int y = 0; y < h; y++) {
byte[] scan = new byte[(w + 7) / 8];
for (int x = 0; x < w; x++) {
Color c = img.GetPixel(x, y);
if (c.GetBrightness() >= 0.5) scan[x / 8] |= (byte)(0x80 >> (x % 8));
}
Marshal.Copy(scan, 0, (IntPtr)((int)data.Scan0 + data.Stride * y), scan.Length);
}
bmp.UnlockBits(data);
return bmp;
}
GetPixel () es lento, puedes acelerarlo con un byte inseguro *.
¿Cómo se crea una máscara de 1 bit por píxel a partir de una imagen usando GDI en C #? La imagen de la que intento crear la máscara se guarda en un objeto System.Drawing.Graphics.
He visto ejemplos que usan Get / SetPixel en un bucle, que son demasiado lentos. El método que me interesa es aquel que usa solo BitBlits, así. Simplemente no puedo hacer que funcione en C #, cualquier ayuda es muy apreciada.
En Win32 C API, el proceso para crear una máscara mono es simple.
- Cree un mapa de bits 1bpp no inicializado tan grande como el mapa de bits de origen.
- Seleccionarlo en un DC.
- Seleccione el mapa de bits de origen en un DC.
- SetBkColor en la DC de destino para que coincida con el color de la máscara del mapa de bits de origen.
- BitBlt la fuente en el destino usando SRC_COPY.
Para los puntos de bonificación, suele ser deseable volver a enmascarar la máscara en el mapa de bits de origen (utilizando SRC_AND) para poner a cero el color de la máscara.