zoukankan      html  css  js  c++  java
  • c#图像处理基础

    1.Bitmap对象

    Bitmap对象是用于由像素数据定义的图像的对象。对图像进行处理的主要类为Bitmap类和ImageAttributes类,Bitmap类属于System.Drawing命名空间,其属性和常用方法如下:

    image

    image

    ImageAttributes类属于System.Drawing.Imaging命名空间,可用于修改图像属性。

    image

    2.颜色系统

       1: // 定义位图
       2: Bitmap bmp-new Bitmap("E:\My Pictures\180.jpg");
       3: // 定义颜色变量
       4: Color c=new Color();
       5: //获取指定位置的颜色
       6: c=bmp.GetPixel(10,10);

    颜色的基本属性如下:

    image

    颜色的基本方法:

    image 

    3.图像的读入和保存

    图像的读入

    (1)通过对象的Image属性读入。

    (2)通过打开对话框读入图片

    private void openFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "JPG File(*.jpg)|*.jpg|Bmp File(*.bmp)|*.bmp|All Files(*.*)|*.*";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                Bitmap image = new Bitmap(dlg.FileName);
                pictureBox1.Image = image;
            }
        }

    图像的保存

       1: void SaveMenuClick(object sender, EventArgs e)
       2:   {
       3:       string filename;
       4:       SaveFileDialog dlg=new SaveFileDialog();
       5:       dlg.Filter="JPG File(*.jpg)|*.jpg|Bmp File(*.bmp)|*.bmp|All Files(*.*)|*.*";
       6:       if (dlg.ShowDialog()== DialogResult.OK) {
       7:           filename=dlg.FileName;
       8:           if (pictureBox1.Image!=null) {
       9:               pictureBox1.Image.Save(filename);
      10:           }
      11:           else
      12:           {
      13:               MessageBox.Show("没有图像可以保存!");
      14:           }
      15:       }
      16:   }

    4.图像的复制、剪切和粘贴

    剪贴板的简介:

    Clipboard类由Object类派生而来,在应用程序中可以直接调用ClipBoard类,或者构建剪贴板实例来操作。

    获取剪贴板的内容:IDataObject iData=System.WinForms.Clipboard.GetDataObject();

    复制:setDataObject(str);           setDataObject(str,true);//表示应用程序退出后数据依然保留在剪贴板

    粘贴:IDataObject iData=System.WinForms.Clipboard.GetDataObject();

              if(iData.GetDataPresent(DataFormats.Text)){…}

    图像的复制:

            /// <summary>
            /// 图像的复制
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void 复制图像ToolStripMenuItemClick(object sender, EventArgs e)
            {
            	Clipboard.SetDataObject(pictureBox1.Image,true);
            }

    图像的剪切:

     void ClipMenuClick(object sender, EventArgs e)
            {
            	Clipboard.SetDataObject(pictureBox1.Image,true);
            	pictureBox1.Image=null;
            }

    图像的粘贴:

    void PasteMenuClick(object sender, EventArgs e)
          {
              IDataObject iData=Clipboard.GetDataObject();
              if (iData.GetDataPresent(DataFormats.Bitmap) ){
                      pictureBox1.Image=(Bitmap)iData.GetData(DataFormats.Bitmap);
              }
          }

    5.图像的灰度化

    这儿采用移位运算代替乘法运算,加快运行速度

       1: /// <summary>
       2:         /// 图像的灰度化
       3:         /// gray=(r*19595 + g*38469 + b*7472) >> 16;
       4:         /// </summary>
       5:         void GrayMenuClick(object sender, EventArgs e)
       6:         {
       7:             Bitmap bmp=new Bitmap(pictureBox1.Image);
       8:             Bitmap newbmp=new Bitmap(pictureBox1.Image);
       9:             Color c=new Color();
      10:             Color NewC;
      11:             Byte r,g,b,gray;
      12:             
      13:             for (int i=0;i<bmp.Width ;i++ )
      14:             {
      15:                 for (int j=0; j<bmp.Height; j++) {
      16:                     c=bmp.GetPixel(i,j);
      17:                     r=c.R;
      18:                     g=c.G;
      19:                     b=c.B;
      20:                     gray=(Byte)((r*19595 + g*38469 + b*7472) >> 16);
      21:                     NewC=Color.FromArgb(gray,gray,gray);
      22:                     newbmp.SetPixel(i,j,NewC);
      23:                 }
      24:             }
      25:             
      26:             // 刷新显示
      27:             pictureBox2.Refresh();
      28:             pictureBox2.Image=newbmp;
      29:         }

    image

    6.其他颜色处理

       1: /// <summary>
       2:         /// 逆反处理
       3:         /// </summary>
       4:         /// <param name="sender"></param>
       5:         /// <param name="e"></param>
       6:         void ReverseMenuClick(object sender, EventArgs e)
       7:         {
       8:             Bitmap bmp=new Bitmap(pictureBox1.Image);
       9:             Bitmap newbmp=new Bitmap(pictureBox1.Image);
      10:             Color c=new Color();
      11:             Color NewC;
      12:             
      13:             for (int i=0;i<bmp.Width ;i++ )
      14:             {
      15:                 for (int j=0; j<bmp.Height; j++) {
      16:                     c=bmp.GetPixel(i,j);
      17:                     NewC=Color.FromArgb(255-c.R,255-c.G,255-c.B);
      18:                     newbmp.SetPixel(i,j,NewC);
      19:                 }
      20:             }
      21:             
      22:             // 刷新显示
      23:             pictureBox2.Refresh();
      24:             pictureBox2.Image=newbmp;
      25:         }
      26:         
      27:         /// <summary>
      28:         /// 平滑处理 采用3x3窗口的中止代替该像素值
      29:         /// 注:不处理边缘
      30:         /// </summary>
      31:         /// <param name="sender"></param>
      32:         /// <param name="e"></param>
      33:         void SmoothMenuClick(object sender, EventArgs e)
      34:         {
      35:             Bitmap bmp=new Bitmap(pictureBox1.Image);
      36:             Bitmap newbmp=new Bitmap(pictureBox1.Image);
      37:             Color c=new Color();
      38:             Color NewC;
      39:             Byte r,g,b;
      40:             int r2,g2,b2;
      41:             
      42:             for (int i=1;i<bmp.Width-1 ;i++ )
      43:             {
      44:                 for (int j=1; j<bmp.Height-1; j++) {
      45:                     r2=0;g2=0;b2=0;
      46:                     for (int k1=-1; k1<=1; k1++) {
      47:                         for (int k2=-1; k2<=1; k2++) {
      48:                             c=bmp.GetPixel(i+k1,j+k2);
      49:                             r=c.R;
      50:                             g=c.G;
      51:                             b=c.B;
      52:                             
      53:                             r2=r2+r;
      54:                             g2=g2+g;
      55:                             b2=b2+b;
      56:                         }
      57:                     }
      58:                     
      59:                     r2=(Byte)(r2/9);
      60:                     g2=(Byte)(g2/9);
      61:                     b2=(Byte)(b2/9);
      62:                     NewC=Color.FromArgb(r2,g2,b2);
      63:                     newbmp.SetPixel(i,j,NewC);
      64:                 }
      65:             }
      66:             
      67:             // 刷新显示
      68:             pictureBox2.Refresh();
      69:             pictureBox2.Image=newbmp;
      70:         }
      71:         
      72:         /// <summary>
      73:         /// 首先计算源图像的像素(i, j)点的分量值与同行的下一个像素
      74:         /// (i+1, j)以及相同列的下一个像素(i, j+1)的分量的梯度,
      75:         /// 即差的平方和的平方根,然后将梯度值作为新的像素重新放回(i, j)
      76:         /// </summary>
      77:         void NihongMenuClick(object sender, EventArgs e)
      78:         {
      79:             Bitmap bmp=new Bitmap(pictureBox1.Image);
      80:             Bitmap newbmp=new Bitmap(pictureBox1.Image);
      81:             Color c1=new Color();
      82:             Color NewC;
      83:             int r1,r2,r3,g1,g2,g3,b1,b2,b3,rr,gg,bb;
      84:             
      85:             for (int i=0;i<bmp.Width;i++ )
      86:             {
      87:                 for (int j=0; j<bmp.Height; j++) {
      88:                     c1 = bmp.GetPixel(i, j);
      89:                     r1 = c1.R;
      90:                     g1 = c1.G;
      91:                     b1 = c1.B;
      92:                     if (i+1==bmp.Width) {
      93:                         c1 = bmp.GetPixel(i , j);
      94:                     }
      95:                     else
      96:                     {
      97:                         c1 = bmp.GetPixel(i + 1, j);
      98:                     }
      99:                     r2 = c1.R;
     100:                     g2 = c1.G;
     101:                     b2 = c1.B;
     102:                     if (j+1==bmp.Height) {
     103:                         c1 = bmp.GetPixel(i , j);
     104:                     }
     105:                     else
     106:                     {
     107:                         c1 = bmp.GetPixel(i, j+1);
     108:                     }
     109:                     r3 = c1.R;
     110:                     g3 = c1.G;
     111:                     b3 = c1.B;
     112:                     rr = (int)(255-2 * Math.Sqrt((r1 - r2) * (r1 - r2) + (r1 - r3) * (r1 - r3)));
     113:                     gg = (int)(255-2 * Math.Sqrt((g1 - g2) * (g1 - g2) + (g1 - g3) * (g1 - g3)));
     114:                     bb = (int)(255-2 * Math.Sqrt((b1 - b2) * (b1 - b2) + (b1 - b3) * (b1 - b3)));
     115:                     NewC=Color.FromArgb((Byte)rr,(Byte)gg,(Byte)bb);
     116:                     newbmp.SetPixel(i,j,NewC);
     117:                 }
     118:             }
     119:             
     120:             // 刷新显示
     121:             pictureBox2.Refresh();
     122:             pictureBox2.Image=newbmp;
     123:         }
  • 相关阅读:
    Android studio 几个坑,值得注意下。
    Android studio使用技巧,不定期更新。
    Android生猛上手,先写个拨号器。
    Ubuntu11.10安装教程,非虚拟机
    在线编辑器CKEditor,多图上传功能实现
    sql 中的NULL小问题 ,大bug
    工资低的.Net程序员,活该你工资低
    30岁的老龄程序员 ,不学习就会被淘汰
    计算商品税额和商品价格保留小数的时候的坑
    大话设计模式--简单工厂模式
  • 原文地址:https://www.cnblogs.com/feisky/p/1593435.html
Copyright © 2011-2022 走看看