通过像素BMP C#的例外情况

时间:2011-05-19 06:04:34

标签: c#

我使用以下代码来浏览BMP的像素

enter image description here

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具有有效高度和相同代码,硬编码值正常工作

@Odded

否:1显示我需要的内容,并且没有2是你的代码发生了什么?

enter image description here

6 个答案:

答案 0 :(得分:5)

你的循环中有一个一个一个错误。

如果图片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 
    }

 }

答案 1 :(得分:5)

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

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

答案 2 :(得分: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

开始

答案 3 :(得分:1)

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

答案 4 :(得分:1)

只需交换宽度和高度:

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

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

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

答案 5 :(得分: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);     
    }
}