将二值图像存入二值数组

因项目需要,需要用一个将二值图像保存在二维数组中的算法,在网上找了很久都没找到,只能自己动手写了。

        #region 读取二值图像存入二值数组

        public byte[,] BinaryBitmapToBinaryArray(Bitmap bmp)
        {
            int imgWidth = bmp.Width;
            int imgHeight = bmp.Height;

            byte[,] BinaryArray = new byte[imgHeight, imgWidth];
            for (int i = 0; i < BinaryArray.GetLength(0); i++)
            {
                for (int j = 0; j < BinaryArray.GetLength(1); j++)
                {
                    BinaryArray[i, j] = 1;
                }
            }
            int depth = Bitmap.GetPixelFormatSize(bmp.PixelFormat);
            if (depth == 1)
            {
                Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
                BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
                int imgStride = bmpData.Stride;
                //得到首地址
                IntPtr ptr = bmpData.Scan0;

                //定义被锁定的数组大小,由位图数据与未用空间组成的
                int bytes = imgStride * imgHeight;
                //定义位图数组
                byte[] bmpValues = new byte[bytes];
                //复制被锁定的位图像素值到该数组内
                Marshal.Copy(ptr, bmpValues, 0, bytes);

                int basePos = 0;
                bool isOne = false;
                for (int y = 0; y < imgHeight; y++)
                {
                    basePos = y * imgStride;
                    for (int x = 0; x < imgWidth; x ++)
                    {
                        isOne = ByteGetBit(bmpValues[basePos + (x >> 3)], (7-x & 0x7));
                        //ByteGetBit判断一个字节第几位是否是1,该函数是从后往前数的,而这里是从高位向低位数的。所以要用7减去x & 0x7
                        if (isOne)
                        {
                            BinaryArray[y, x] = 255;
                        }
                        else
                        {
                            BinaryArray[y, x] = 0;
                        }
                    }
                }
                        bmp.UnlockBits(bmpData);
            }
            return BinaryArray;
        } 

        #endregion

 

posted @ 2018-10-26 11:46  微光-倾城  阅读(1350)  评论(1编辑  收藏  举报