// 画像を必要ならば反転させ、二値化処理を行う private static Bitmap BinarizeBitmap(Bitmap bitmap, int threshold, bool inverseFlg) { var mat1 = BitmapToMonoArray(bitmap); var mat2 = new bitmapArray(); if (inverseFlg) { foreach (byte data in mat1) { if (255 - data >= threshold) { mat2.Add(255); } else { mat2.Add(0); } } } else { foreach (byte data in mat1) { if (data >= threshold) { mat2.Add(255); } else { mat2.Add(0); } } } return(ArrayToBitmap(mat2, bitmap.Width, bitmap.Height)); }
// 画像を配列化する // 参考→ // https://dobon.net/vb/dotnet/graphics/drawnegativeimage.html#lockbits // http://blueclouds.blog.so-net.ne.jp/2011-04-29 private static bitmapArray BitmapToMonoArray(Bitmap bitmap) { var bmpArr = new bitmapArray(); var bitmapData = bitmap.LockBits( new Rectangle(Point.Empty, bitmap.Size), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb ); //ピクセルデータをバイト型配列で取得する var pointer = bitmapData.Scan0; byte[] pixels = new byte[bitmapData.Stride * bitmap.Height]; System.Runtime.InteropServices.Marshal.Copy(pointer, pixels, 0, pixels.Length); //すべてのピクセルのデータを取得する for (int y = 0; y < bitmapData.Height; ++y) { for (int x = 0; x < bitmapData.Width; ++x) { //ピクセルデータでのピクセル(x,y)の開始位置を計算する int pos = y * bitmapData.Stride + x * 4; byte b = pixels[pos]; byte g = pixels[pos + 1]; byte r = pixels[pos + 2]; byte a = pixels[pos + 3]; byte grayColor = (byte)(0.299 * r + 0.587 * g + 0.114 * b); bmpArr.Add(grayColor); continue; } } bitmap.UnlockBits(bitmapData); return(bmpArr); }