Обработка изображения останавливается в середине цикла без причины c # - PullRequest
0 голосов
/ 15 октября 2018

У меня есть изображение, и я хочу взять каждый квадрат 256х256 пикселей, найти средний цвет и нарисовать этот квадрат указанным цветом.Проблема: кажется, что после первого квадрата обработка внезапно останавливается, но после следования программе я вижу, что индексы в порядке.Я понятия не имею, связана ли проблема с записью файлов в моей компьютерной системе или неправильным использованием функций класса «Bitmap».

original: original image

result: result image

код:

        public const int big =256;
        public const int small = 16;
        static void Main(string[] args)
        {
            Bitmap bt = new Bitmap(@"C:\Users\mishe\Desktop\00_sorted images - training\general shores\agulhas_oli_2016146_lrg.jpg");
            Bitmap bt2 = bt;
            Color MeanColor;
            double r = 0;
            double g = 0;
            double b = 0;
            int i = 0;
            int j = 0;

            //big loop to go over all image
            for (i = 0; i < bt.Height-257; i+=256)
            {
                for (j = 0; j < bt.Width-257; j+=256)
                {
                    /////////////////////////////
                    //small loop on 1 square to get the mean color of the area
                    for (int x = i; x < big; x++)
                    {
                        for (int y = j; y < big; y++)
                        {
                            r += bt.GetPixel(x, y).R;
                            g += bt.GetPixel(x, y).G;
                            b += bt.GetPixel(x, y).B;
                        }
                    }
                    /////////////////////////////
                    r = r / Math.Pow(big, 2);
                    g = g / Math.Pow(big, 2);
                    b = b / Math.Pow(big, 2);
                    MeanColor = Color.FromArgb((int)r, (int)g, (int)b);
                    /////////////////////////////
                    //small loop on the same square to set the color
                    for (int x = i; x < big; x++)
                    {
                        for (int y = j; y < big; y++)
                        {
                            bt2.SetPixel(x, y, MeanColor);
                        }
                    }
                    /////////////////////////////
                }
            }
            bt2.Save(@"C:\Users\mishe\Desktop\compressed image.jpg", ImageFormat.Jpeg);
        }

1 Ответ

0 голосов
/ 15 октября 2018

Эта строка:

//small loop on 1 square to get the mean color of the area
for (int x = i; x < big; x++)

После первого квадрата x будет 256, поэтому он не будет выполнять небольшой цикл.

Я думаю, вы хотите:

for (int x = i; x < i + big; x++)

Или ваш маленький цикл может быть:

for (int x = 1; x < big; x++)

, а затем добавить большие и маленькие значения внутри цикла:

 r += bt.GetPixel(i + x, j + y).R;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...