c# 如何快速绘制图像灰度直方图

benny周 2013-10-17 04:04:46
我写了个方法就是用Bitmap创建一个图片对象,然后通过Bitmap中的GetPixel函数获取每一个点的灰度值存到一个数组中。在通过绘制256条直线显示直方图。代码如下:

private void pictureBox1_Click(object sender, EventArgs e)
{
string filePath = null;
if (chooseFile(out filePath))
{

Bitmap bmp = new Bitmap(filePath);
try
{
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
//显示图片
pictureBox1.Image = (Image)bmp;
//图像高度
int height = bmp.Height;
//图像宽度
int width = bmp.Width;

int[] values = new int[256];
for (int i = 0; i < 256; i++) values[i] = 0;

for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
Color pixelColor = bmp.GetPixel(x, y);
//颜色的 red 分量值
byte red = pixelColor.R;
//颜色的 green 分量值
byte green = pixelColor.G;
//颜色的 blue 分量值
byte blue = pixelColor.B;
int value = (red + green + blue) / 3;
values[value]++;
}
}

//找出要画图像里数据的最高值
int max = 0;
foreach(int i in values) max = max>i?max:i;

//图像高度为最大值加10;
//Graphics g = this.pictureBox2.CreateGraphics();
Image myimage = null;

//画图
draw(ref values, max, out myimage);
// myimage.Save("e:\\123.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch(Exception exc) {
MessageBox.Show(exc.Message);
}

}
}

//画直方图
private bool draw(ref int[] datas, int height, out Image myimage)
{
myimage = new Bitmap(256, height + 10);
Graphics g = Graphics.FromImage(myimage);
Pen pen = new Pen(Color.Blue);
for (int i = 0; i <= 255; i++)
{
g.DrawLine(pen, i, height - datas[i] + 10, i, height + 10);
}
pictureBox2.Image = myimage;
return true;
}

//选者文件
private bool chooseFile(out string filePath) {
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "选择图片";
openFileDialog.Filter = "图片类型(*.jpg,*.gif,*.bmp,*.png)|*.jpg;*.gif;*.bmp;*.png";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = openFileDialog.FileName;
return true;
}
else {
filePath = null;
return false;
}

}
但这样写感觉比较笨,没效率,读一个大一点的图片就要等一大会。有人说可以把图片读到内存中在通过类似指针的方式获取值会快一点。请各位指点指点,到底怎么做
...全文
1673 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2013-10-17
  • 打赏
  • 举报
回复
Bitmap.LockBits相关的博客一搜一大把
nygfcn 2013-10-17
  • 打赏
  • 举报
回复
建议使用mschart等控件实现类似功能
sj490790083 2013-10-17
  • 打赏
  • 举报
回复
把图像切成N块,开N个线程并行处理

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧