Créer un masque 1bpp à partir d’une image

Comment créer un masque de 1 bit par pixel à partir d’une image utilisant GDI en C #? L’image à partir de laquelle je tente de créer le masque est conservée dans un object System.Drawing.Graphics.

J’ai vu des exemples qui utilisent Get / SetPixel dans une boucle, qui sont trop lents. La méthode qui m’intéresse est celle qui utilise uniquement BitBlits, comme ceci . Je ne peux tout simplement pas le faire fonctionner en C #, toute aide est très appréciée.

Essaye ça:

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.Ssortingde * y), scan.Length); } bmp.UnlockBits(data); return bmp; } 

GetPixel () est lent, vous pouvez l’accélérer avec un octet dangereux *.

Dans l’API C Win32, la création d’un masque mono est simple.

  • Créez un bitmap 1bpp non initialisé de la taille du bitmap source.
  • Sélectionnez-le dans un CD.
  • Sélectionnez le bitmap source dans un contrôleur de domaine.
  • DéfinissezBkColor sur le contrôleur de domaine de destination pour qu’il corresponde à la couleur de masque du bitmap source.
  • BitBlt la source sur la destination en utilisant SRC_COPY.

Pour les points bonus, il est alors généralement souhaitable de placer le masque sur le bitmap source (à l’aide de SRC_AND) afin de définir la couleur du masque.

Voulez-vous dire LockBits? Bob Powell a un aperçu des LockBits ici ; Cela devrait donner access aux valeurs RVB, pour faire ce dont vous avez besoin. Vous pouvez également vouloir regarder ColorMasortingx, comme tel .