【问题标题】:Exception on traveling through pixels BMP C#穿越像素 BMP C# 的异常
【发布时间】:2011-05-19 23:17:18
【问题描述】:

我使用下面的代码来遍历 BMP 的像素

for (int i = 0; i <= Image.Width; i++)
 {
    for (int j = 0; j <= Image.Height; j++)
    {
              color = Image.GetPixel(i, j); //get 
    }

 }

但我遇到了异常

System.ArgumentOutOfRangeException was unhandled
  Message="Parameter must be positive and < Height.\r\nParameter name: y"
  Source="System.Drawing"
  ParamName="y"

我不知道为什么我得到这个..我使用具有有效高度的BMP 和具有正常工作的硬编码值的相同代码

@奇数

No:1 显示了我需要什么,No 2 是你的代码发生了什么你知道吗?

【问题讨论】:

  • 如果以下答案没有帮助,您的问题还不够清楚。
  • 我感觉您正在将一张图片复制到另一张不同宽度和高度的图片中。如果是这种情况,您的问题根本不清楚。
  • 如果您仍然有问题,首先使用 X 和 Y 而不是 I 和 J(更容易避免垂直和水平之间的混淆),然后检查代码中的任何地方:内部循环总是对应于宽度:for(int x = 0; x
  • 无法理解你想要在这里得到什么。即使有图片我也不知道..请改写。

标签: c#


【解决方案1】:

只需更改高度和宽度。这是一个在你自己的代码中看得太远的例子——这带回了很多回忆..

for(int i=0;i<BMP.Height;i++)
{
   for(int j=0;j<BMP.Width;j++)
   {
      color = BMP.GetPixel(j,i);    
   }
}

【讨论】:

  • 这将尝试访问GetPixel(Height-1, Width-1),它不存在并且会导致异常。不明白这怎么会得到任何支持,最没关系。
  • @Uw:(第一个)downvote 来自我,因为你的答案是错误的。
  • 我非常支持建设性的cmets。谢谢 Ben,我会编辑我的帖子。
  • 嗨,问题还没有解决 :-( .. 同样的事情现在垂直发生,没有逐行读取图像
  • 你能解释一下现在的问题是什么吗?
【解决方案2】:

您的循环中有一个错误。

如果图像HeightWidth 为100,则要获取“最后一个”像素,您需要将其称为GetPixel(99,99)

for (int i = 0; i < Image.Width; i++)
 {
    for (int j = 0; j < Image.Height; j++)
    {
              color = Image.GetPixel(i, j); //get 
    }

 }

【讨论】:

  • 我认为您可以将“已接受的答案”作为动力提供给新手 :-)
  • Oded 我有一个小问题......这样像素就不会逐行传播
  • @Sudantha - 这就是您编写代码的方式。究竟是什么问题?
  • @Sudantha - 您需要将Image.WidthImage.Height 切换,反之亦然。
【解决方案3】:

交换两个循环。

for(int j=0; j<BMP.Height; j++)
{
   for(int i=0; i<BMP.Width; i++)
   {
      color = BMP.GetPixel(i,j);     
   }
}

每个人都在关注宽度和高度,这不是解决方案。 GetPixel 接受两个参数,xyy 坐标必须是外循环才能得到你想要的顺序。

x 坐标始终从0 ... Width-1 运行

【讨论】:

  • 我可以看到您的第一个 for 循环中没有条件。我相信这会引发异常。
  • for(x;y;z) y 必须是布尔值 BMP.Height 不是。
  • 这是正确答案。大多数其他人都是错误的,因为 GetPixel(i,j) 中的 i 和 j 必须分别对应于 Width 和 Height。 (只是一个剩余的错字,“j
  • 是的,是的,有一个错字。您是否注意到问题包含相同的错字?您是否注意到您自己的答案@Bala 包含相同的错字?
  • @Ben 我注意到了,但我要删除我的答案,所以不想修复,但我想我会指出来。
【解决方案4】:

翻转你的循环。如果你想让它表现得像第一张图片,外环应该是高度,内环应该是宽度。

【讨论】:

  • 嗨,问题还没有解决 :-( .. 同样的事情现在垂直发生,没有逐行读取图像
【解决方案5】:

只需交换宽度和高度:

for(int i=0;i<BMP.Height;i++){

   for(int j=0;j<BMP.Width;j++){
      color=BMP.GetPixel(j, i);
   }
}

我还交换了 ij 以便 GetPixel 正常工作

【讨论】:

  • 嗨,问题还没有解决 :-( .. 同样的事情现在垂直发生,没有逐行读取图像
【解决方案6】:

让我们简化一下,使用 x 和 y 代替 i 和 j,这样在笛卡尔坐标中更容易思考。

//For each height, loop through all pixels at that height.
for(int y=0; y < BMP.Height; y++)
{
    for(int x=0; x < BMP.Width; x++)
    {
        color = BMP.GetPixel(x,y);     
    }
}

【讨论】:

  • 谢谢乔,看看我有另一个问题解决这个检查问题的底部