如何在C#中使用图片的字节数组

How to use the byte array of image on C#

所以,我需要使用图像的字节数组来修改,例如...我有一张 380x380 的图像,我需要取图像的 3x3 并与其他数组相乘,从而与整个图片。

我从不使用字节数组,所以我不知道我做的对不对

//Obtener byteArray de imagen
Image imageOri = Image.FromFile(Path);
var ms = new MemoryStream();
imageOri.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
var byteImage = ms.ToArray();

所以,当我运行这段代码时,byteImage有一个...列表?的数据,所以,我不知道如何获取图像的 3x3 来进行处理

我假设您想应用卷积过滤器。

首先,您可能想使用位图而不是图像,即 new Bitmap(Path)

简单的方法是遍历每个像素,然后遍历过滤器中的每个值,并 multiply/accumulate 使用相应的像素值。使用 GetPixel 获取像素值。请注意,您需要以某种方式处理图像的边界,例如跳过它们。 GetPixel 是出了名的慢,但我建议使用它来确保在优化之前确定代码。

像这样(未测试):

        var bmp = new Bitmap(@"test.bmp");
        var filter = new float[3, 3];
        var result = new Bitmap(bmp.Width - 2, bmp.Height - 2);
        for(int y = 1; y < bmp.Height-1; y++)
        {
            for (int x = 1; x < bmp.Width - 1; x++)
            {
                float r = 0;
                r += bmp.GetPixel(x-1, y-1).R * filter[0, 0];
                r += bmp.GetPixel(x  , y-1).R * filter[1, 0];
                r += bmp.GetPixel(x+1, y-1).R * filter[2, 0];
                r += bmp.GetPixel(x-1, y  ).R * filter[0, 1];
                r += bmp.GetPixel(x  , y  ).R * filter[1, 1];
                r += bmp.GetPixel(x+1, y  ).R * filter[2, 1];
                r += bmp.GetPixel(x-1, y+1).R * filter[0, 2];
                r += bmp.GetPixel(x  , y+1).R * filter[1, 2];
                r += bmp.GetPixel(x+1, y+1).R * filter[2, 2];

                // Repeat for G & B channels
                result.SetPixel(x-1, y-1, Color.FromArgb((int)r, 0, 0));
            }
        }

A more comprehensive guide can be found here.