我写了个方法就是用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;
            }
            
        }
但这样写感觉比较笨,没效率,读一个大一点的图片就要等一大会。有人说可以把图片读到内存中在通过类似指针的方式获取值会快一点。请各位指点指点,到底怎么做图片