日期:2014-05-18  浏览次数:20909 次

求救,以下是我做的一个灰度直方图的代码。麻烦帮我看看到底是哪里出现问题了
在设计界面上放了一个picturebox1的控件,bmp在外部调用的已经有个了一个实例

public partial class zhifangtu : Form
  {
  public Bitmap bmp;
  public zhifangtu(Bitmap temp)
  {
  InitializeComponent();
  bmp = new Bitmap(temp);
  }

  private void zhifangtu_Load(object sender, EventArgs e)
  {
  int[,] h = new int[bmp.Width, bmp.Height];
  int[] t = new int[256];
  Color c = Color.FromArgb(128);
  int i, j;
  int r;
  int max = 0;
  for (i = 0; i < bmp.Width; i++)
  {
  for (j = 0; j < bmp.Height; j++)
  {
  c = bmp.GetPixel(i, j);
  r = (c.R + c.G + c.B) / 3;
  h[i, j] = r;
  t[r] = t[r] + 1;
  }
  }
  max = t[0];
  for (i = 1; i < t.Length ; i++)
  {

  if (t[i] > max)
  {
  max = t[i];
  }
  }
  Bitmap box3 = new Bitmap(256, max);
  c = Color.FromArgb(0,0,0);
  for (r = 0; r < 256; r++)
  {
  for (j = 1; j <=t[r]; j++)
  {
  box3.SetPixel(r, max-j, c);
  }
  pictureBox1.Refresh();
  pictureBox1.Image = box3;
  }
  this.pictureBox1.Image = box3;
  }
  }
}


我这个程序很奇怪,有的图片载入后可以画出直方图,有的图片载入后却不能,产生错误,说”参数无效!“,”未处理ArgumentException“。我真的是搞不懂呀,请各位高人帮帮忙,

------解决方案--------------------
问题之一:
没有做正规化(Normalization), 对大图, max动辄到几万,几百万.
Bitmap box3 = new Bitmap(256, max); 会出问题.


你可以把把最大值设定为比如说256, 作一下Normalization:
C# code

for (i = 0; i < t.Length; i++)
{
     t[i] = t[i] * 256 / max;  //或t[i] = (int)(t[i] * 256.0f / max);
}

------解决方案--------------------
详细的错误信息贴出来;
你打个断点调试一下,看看在什么地方出错的