注册 登录
编程论坛 C# 论坛

C# 如何将图片保存为矩阵形式

蓝之晴 发布于 2014-10-14 10:56, 1038 次点击
具体地说就是C#中将picturebox显示的图片保存为矩阵或数组的形式,然后转化为MWArry类型
求高手指教,代码实例
3 回复
#2
afdoa832014-10-15 10:33
据说matlab给出的文档有问题。
还有就是,C#下标是0起,matlab下标是1起
多实验试验吧
#3
邓士林2014-10-15 16:56
可以保存为二进制形式
#4
chenhongwu2014-10-16 08:35
给你一个例子吧,这是我自己写的一个代码,仅供参考哦
private double[] GetGrayArray(Bitmap srcBmp)
        {
            int left = 0;
            int top = 0;
            int width = srcBmp.Width;
            int height = srcBmp.Height;
            Rectangle rect = new Rectangle(left, top, width, height);
            //将Bitmap锁定到系统内存中,获得BitmapData
            //这里的第三个参数确定了该图像信息时rgb存储还是Argb存储
            BitmapData srcBmpData = srcBmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            //位图中第一个像素数据的地址。它也可以看成是位图中的第一个扫描行
            IntPtr srcPtr = srcBmpData.Scan0;
            //将Bitmap对象的信息存放到byte数组中
            //int src_bytes = srcBmpData.Stride * height;
            int src_bytes = width * 3 * height;
            //int srcStride = srcBmpData.Stride;
            byte[] srcRGBValues = new byte[src_bytes];
            double[] grayValues = new double[width * height];
            //RGB[] rgb = new RGB[srcBmp.Width * rows];
            //复制GRB信息到byte数组
            Marshal.Copy(srcPtr, srcRGBValues, 0, src_bytes);
            //Marshal.Copy(dstPtr, dstValues, 0, dst_bytes);
            //解锁位图
            srcBmp.UnlockBits(srcBmpData);
            //灰度化处理
            int m = 0, j = 0;
            int k = 0;
            double gray = 0.00;
            //double sumGrayValue = 0.00;
            //根据Y = 0.299*R + 0.587*G + 0.114*B,intensity为亮度
            for (int i = 0; i < height; i++)  //只获取图片的rows行像素值
            {
                for (j = 0; j < width; j++)
                {
                    //只处理每行中图像像素数据,舍弃未用空间
                    //注意位图结构中RGB按BGR的顺序存储
                    k = 3 * j;
                    gray = (double)(srcRGBValues[i * width + k + 2] * 0.299
                         + srcRGBValues[i * width + k + 1] * 0.587
                         + srcRGBValues[i * width + k + 0] * 0.114);

                    grayValues[m] = gray;  //将灰度值存到double的数组中
                    m++;
                    //sumGrayValue = sumGrayValue + gray;  //计算所有扫描到的像素的灰度值
                }
            }

            return grayValues;
        }
1