处理图像无故停止中循环C#

时间:2018-10-15 15:49:06

标签: c# loops image-processing

我有一个图像,我想获取256X256像素的每个正方形,找到均值颜色,然后用所述颜色绘制该正方形。 问题:似乎在第一个平方之后,处理突然停止,但是在执行程序之后,我可以看到索引很好。我不知道问题出在我的计算机系统中是文件写入还是“ Bitmap”类函数的错误使用。

原件: original image

结果: 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 :(得分:3)

此行:

//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;