using System.Drawing.Imaging;
using System.Runtime.InteropServices;...publicstaticBitmapBitmapTo1Bpp(Bitmap img){int w = img.Width;int h = img.Height;Bitmap bmp =newBitmap(w, h,PixelFormat.Format1bppIndexed);BitmapData data = bmp.LockBits(newRectangle(0,0, w, h),ImageLockMode.ReadWrite,PixelFormat.Format1bppIndexed);byte[] scan =newbyte[(w +7)/8];for(int y =0; y < h; y++){for(int x =0; x < w; x++){if(x %8==0) scan[x /8]=0;Color c = img.GetPixel(x, y);if(c.GetBrightness()>=0.5) scan[x /8]|=(byte)(0x80>>(x %8));}Marshal.Copy(scan,0,(IntPtr)((long)data.Scan0+ data.Stride* y), scan.Length);}
bmp.UnlockBits(data);return bmp;}
Vous pouvez l'accélérer, si nécessaire, en utilisant le code unsafe pour remplacer la méthode GetPixel ().
Si vous êtes déjà verrouillage de l'bits, vous pourriez aussi bien le Maréchal.Copie toutes les données d'un byte[] et de faire tout cela à la fois. Que gagnerez-vous la méthode getpixel et la répétition de maréchal.copie de frais généraux. Il n'est pas simple, la ImageFormat de la source de l'image des questions. Ron, qui ne fonctionnent pas si vous avez un non-minimale foulée dans la source de l'image, sauf si vous avez le même dans l'image de destination. (Stride >= largeur * bytesPerPixel)
Ce code va faire le travail:
Vous pouvez l'accélérer, si nécessaire, en utilisant le code unsafe pour remplacer la méthode GetPixel ().
Il n'est pas simple, la ImageFormat de la source de l'image des questions.
Ron, qui ne fonctionnent pas si vous avez un non-minimale foulée dans la source de l'image, sauf si vous avez le même dans l'image de destination. (Stride >= largeur * bytesPerPixel)
OriginalL'auteur Hans Passant
La plus facile façon de le faire parvenir à l'aide de la Clone()
Que déclinons ce sera peut-être pas le moyen le plus rapide pour ce faire, il y a beaucoup de façon plus rapide est de faire ce
OriginalL'auteur WiiMaxx