solidbrush rectangle library filled example c# graphics gdi+ drawing gdi

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.


¿Te refieres a LockBits? Bob Powell tiene una visión general de LockBits aquí ; esto debería proporcionar acceso a los valores RGB, para hacer lo que necesita. También es posible que desee mirar ColorMatrix, como tal .


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.