asasaas121 2015-02-07 13:49 采纳率: 0%
浏览 2576

c#图像灰度处理中关于生成灰度图像的问题

我是参照《C#数字图像处理算法典型实例》里面的代码进行处理的,用的是内存法处理打开的图像。但经过灰度处理的图像对象怎么得到呢?我想利用得到的图像进行处理,但处理的还是原来的图像,就算我保存当前的灰度图像,打开进行处理时依然是彩色图像的性质。

代码如下

//打开图片
private void open_Click(object sender, EventArgs e)
        {
            OpenFileDialog opnDlg = new OpenFileDialog();
            opnDlg.Filter = "所有图像|*.bmp;*.pcx;*.png;*.jpg;*.gif;|" + "位图(*.bmp)|*.bmp;*.jpg;*.png|" + "矢量图|*.wmf;*.eps;*.emf";
            opnDlg.Title = "打开图片";
            opnDlg.ShowHelp = true;
            if (opnDlg.ShowDialog() == DialogResult.OK)
            {
                curName = opnDlg.FileName;
                try
                {
                    curBitmap = (Bitmap)Image.FromFile(curName);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                Invalidate();
            }

        }

//图片灰度化
private void huidu_Click(object sender, EventArgs e)
        {
            //位图矩形
            Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
            //以读写方式锁定全部位图像素
            System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat);
            //得到首地址
            IntPtr ptr = bmpData.Scan0;
            //定义被锁定的数组大小,由(位图数据的未用空间+实际宽度)*实际高度组成
            int bytes = bmpData.Stride * bmpData.Height;
            //定义位图数组(需要存放的像素数量大小)
            byte[] rgbValues = new byte[bytes];
            //复制被锁定的位图像素值到该数组内
            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

            //灰度化
            double colorTemp = 0;
            for (int i = 0; i < bmpData.Height; i++)
            {

                //只处理每行中是图像像素的数据,舍弃未用空间
                for (int j = 0; j < bmpData.Width * 3; j += 3)
                {
                    colorTemp = rgbValues[i * bmpData.Stride + j + 2] * 0.299 +
                        rgbValues[i * bmpData.Stride + j + 1] * 0.587 +
                        rgbValues[i * bmpData.Stride + j] * 0.114;
                    rgbValues[i * bmpData.Stride + j] = rgbValues[i * bmpData.Stride + j + 1] = rgbValues[i * bmpData.Stride + j + 2] = (byte)colorTemp;
                }

            }

            //数组复制回位图
            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
            //解锁位图像素
            curBitmap.UnlockBits(bmpData);
            //把新生成的灰度图像赋值个curBitmap不然仍然会用原来的彩色图像来处理

            //对窗体进行重新绘制
            Invalidate();
        }


//保存图片
private void save_Click(object sender, EventArgs e)
        {
            if (curBitmap!=null)
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Title = "保存为";
                sfd.OverwritePrompt = true;
                sfd.Filter = "BMP文件|*.bmp";
                sfd.ShowHelp = true;
                if (sfd.ShowDialog()==DialogResult.OK)
                {
                    string fileName = sfd.FileName;
                    string strFileExtn = fileName.Remove(0, fileName.Length - 3);

                    //保存文件
                    switch (strFileExtn)
                    {
                        case"bmp":
                            curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp);
                            break;
                        default:
                            break;
                    }
                }
            }
        }

//绘制图片
private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            if (curBitmap != null)
            {
                g.DrawImage(curBitmap, 160, 20, curBitmap.Width, curBitmap.Height);

            }
        }

  • 写回答

3条回答 默认 最新

  • devmiao 2015-02-07 14:34
    关注
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!