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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?