如何摆脱无限for循环来查找像素颜色?

问题描述 投票:0回答:1

我编写了下面给出的代码来获取属于从文件上传的图像的每个像素的 RGB 值。然后我想列出列表框中每个像素的所有颜色值。但是“for”循环进入无限循环,因此列表框中没有任何内容。

 int R, G, B, xi, yi, xf, yf;
       
 private void button3_Click(object sender, EventArgs e)
 {
     listBox1.Items.Clear();
     if (pictureBox1.Image == null)
     {
         MessageBox.Show("Lütfen bir JPEG resmi yükleyin.");
         return;
     }
     Bitmap bmp2 = new Bitmap(pictureBox1.Image);

     xi = 0;
     yi = 0;
     xf = bmp2.Width -1; 
     yf = bmp2.Height -1;

     if (xi >= 0 && yi >= 0 && xf < bmp2.Width && yf < bmp2.Height)
     {
         for (int x = xi; x <= xf; x++)
         {
             for (int y = yi; y <= yf; y++)
             {
                 Color pixelColor = bmp2.GetPixel(x, y);

                 R = pixelColor.R;
                 G = pixelColor.G;
                 B = pixelColor.B;

                 listBox1.Items.Add($"Xi: {x}, Yi: {y}, R: {R}, G: {G}, B: {B}");
             }
         }

         // "test line" 
         listBox1.Items.Add("test line");
     }


 }

我尝试使用命令添加内循环的 listbox1 ouf 。我只看到了一个像素及其 RBG 值。是 x:0 和 y:0

c# for-loop listbox infinite-loop getpixel
1个回答
0
投票

我同意克劳斯的观点 - 你的循环条件看起来不错,但是在任何合理的位图上,这将需要一些时间,具体取决于“列表框”背后的代码的效率。 调试循环的通常过程是将一段非常轻量级的代码放入循环或每个循环中;这里有两个嵌套循环,因此在循环的每个级别都放入一个报告。确保您可以知道哪一行代码正在被激活,以便您可以跟踪循环的进度。 我的计算机科学讲师将此类报告称为“钩子”,其想法是在寻找错误时,钩子会有所帮助! 如果您获得报告的第一个循环的第一个条目,那么它会停止,然后用更多的钩子标点内部循环中的代码段,直到找到代码挂起的位置 - 或者慢得像爬行一样。

你们的系统有时钟时间报告功能吗? “列表框”调用需要多长时间?

另一个有用的技巧是记住所有“for”循环都可以替换为“while”、“repeat”或“do”循环(无论您的语言提供什么),并重新排列参数和比较。重写它们有时会暴露出你的逻辑缺陷。

您的“xf”和“yf”变量实际上是常量,并且在循环内永远不会改变。那么,为什么它们会出现在您的循环测试中?这看起来是一种类似“C”的语言,但并不清楚是其中的哪一种。其中一些不需要用关键字声明常量吗?

© www.soinside.com 2019 - 2024. All rights reserved.