C# 通过BMP C时出现异常

C# 通过BMP C时出现异常,c#,C#,我使用下面的代码来遍历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="

我使用下面的代码来遍历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具有有效高度和相同代码,硬编码值工作正常

@古怪的

否:1显示我需要的,2显示你的代码发生了什么,有什么想法吗


您的循环中出现了一个off by one错误

如果图像的高度和宽度为100,要获取最后一个像素,需要将其称为GetPixel99,99


只需改变高度和宽度。这是一个在你自己的代码中看得太远的例子-这会带来太多的记忆

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

翻转你的环。如果你想让外环像第一幅图像一样,那么外环应该是高度,内环应该是宽度。

只需在宽度和高度之间切换即可:

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

   for(int j=0;j<BMP.Width;j++){
      color=BMP.GetPixel(j, i);
   }
}
我还交换了I和j,以便GetPixel正确工作

交换这两个循环

for(int j=0; j<BMP.Height; j++)
{
   for(int i=0; i<BMP.Width; i++)
   {
      color = BMP.GetPixel(i,j);     
   }
}
每个人都在关注宽度和高度,这不是解决方案。GetPixel接受两个参数,x和y。y坐标必须是外环才能获得所需的顺序


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

让我们简化这个过程,使用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);     
    }
}


我想你可以给一个新手一个“公认的答案”作为动力:-Oded我有一个小问题。。。这样像素就不会逐行移动line@Sudantha-你就是这样写代码的。到底是什么问题?@Sudantha-您需要将Image.Width与Image.Height切换,反之亦然。这将尝试访问不存在的GetPixelHeight-1,Width-1,这将导致异常。我不明白这是怎么得到任何赞成票的,哪怕是最多的。@Uw:第一个反对票是我投的,因为你的答案是错误的。我非常支持建设性的评论。谢谢你,本,我将编辑我的帖子。嗨,问题还没有解决:-。。同样的事情现在垂直发生,不逐行读取图像。你能再解释一点问题是什么吗?我可以看到你的第一个for循环中没有任何条件。我相信这会引发一个例外;Yz y必须是布尔值。高度不是。这是正确答案。大多数人都错了,因为在GetPixeli中,i和j必须分别对应于宽度和高度。只剩下一个打字错误,是的,是的,有一个打字错误。你注意到问题中有同样的打字错误吗?你注意到你自己的答案,@Bala,包含相同的打字错误吗?@Ben我注意到了,但我要删除我的答案,所以不想修改,但我想我会指出。嗨,问题还没有解决:-。。同样的事情现在垂直发生,不逐行读取图像。问题还没有解决:-。。同样的事情垂直发生现在不逐行阅读图像谢谢Joe只是检查我有另一个问题解决这个问题检查问题的底部如果下面的答案没有帮助,你的问题不够清楚。我感觉你正在将一个图像复制到另一个不同宽度和高度的图像中。如果是这样的话,你的问题根本就不清楚。如果你仍然有这个问题,首先使用X和Y,而不是I和J,这样更容易避免垂直和水平之间的混淆,然后在你的代码中到处检查:内部循环总是对应于宽度:forint X=0;x//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); } }