Как использовать байтовый массив изображения на C# - PullRequest
0 голосов
/ 09 июля 2020

Итак, мне нужно использовать массив байтов моего изображения для изменения, например ... У меня есть изображение размером 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 изображения, чтобы сделать процесс

1 Ответ

0 голосов
/ 09 июля 2020

Я предполагаю, что вы хотите применить фильтр свертки.

Для начала вы, вероятно, захотите использовать Bitmap вместо изображения, т.е. new Bitmap(Path).

Тривиальный метод будет быть l oop по каждому пикселю, а затем l oop по каждому значению в фильтре и умножать / накапливать с соответствующими значениями пикселей. Использование 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 более подробное руководство можно найти здесь .

...