public static Bitmap PBinary(Bitmap src, int v)
{
int w = src.Width;
int h = src.Height;
Bitmap dstBitmap = new Bitmap(src.Width, src.Height, PixelFormat.Format24bppRgb);
BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly,
PixelFormat.Format24bppRgb);
BitmapData dstData = dstBitmap.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.WriteOnly,
PixelFormat.Format32bppRgb);
unsafe
{
byte* pIn = (byte*)srcData.Scan0.ToPointer();
byte* pOut = (byte*)dstData.Scan0.ToPointer();
byte* p;
int r, g, b;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
p = pIn;
r = p[2];
g = p[1];
b = p[0];
pOut[0] = pOut[1] = pOut[2] = (byte)(((byte)(0.2125 * r + 0.7154 * g + 0.0721 * b) >= v) ? 255 : 0);
//pOut[0] = pOut[1] = pOut[2] = (byte)(r >= v? 255 : 0);
pIn += 4;
pOut += 4;
}
pIn += srcData.Stride - w * 4;
pOut += srcData.Stride - w * 4;
}
src.UnlockBits(srcData);
dstBitmap.UnlockBits(dstData);
return dstBitmap;
}
}