zoukankan      html  css  js  c++  java
  • Bitmap类

    一.Bitmap类

    Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下:

    1. GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色.

    2. PixelFormat属性:返回图像的像素格式.

    3. Palette属性:获取和设置图像所使用的颜色调色板.

    4. Height Width属性:返回图像的高度和宽度.

    5. LockBits方法和UnlockBits方法:分别锁定和解锁系统内存中的位图像素.在基于像素点的图像处理方法中使用LockBits和UnlockBits是一个很好的方式,这两种方法可以使我们指定像素的范围来控制位图的任意一部分,从而消除了通过循环对位图的像素逐个进行处理,每调用LockBits之后都应该调用一次UnlockBits.

    二.BitmapData类

    BitmapData对象指定了位图的属性

    1. Height属性:被锁定位图的高度.

    2. Width属性:被锁定位图的高度.

    3. PixelFormat属性:数据的实际像素格式.

    4. Scan0属性:被锁定数组的首字节地址,如果整个图像被锁定,则是图像的第一个字节地址.

    5. Stride属性:步幅,也称为扫描宽度. 

    如上图所示,数组的长度并不一定等于图像像素数组的长度,还有一部分未用区域,这涉及到位图的数据结构,系统要保证每行的字节数必须为4的倍数.

    三.Graphics类

    Graphics对象是GDI+的关键所在,许多对象都是由Graphics类表示的,该类定义了绘制和填充图形对象的方法和属性,一个应用程序只要需要进行绘制或着色,它就必须使用Graphics对象.

    四.Image类

      这个类提供了位图和元文件操作的函数.Image类被声明为abstract,也就是说Image类不能实例化对象,而只能做为一个基类

    1.FromFile方法:它根据输入的文件名产生一个Image对象,它有两种函数形式:

    public static Image FromFile(string filename);
    public static Image FromFile(string filename, bool useEmbeddedColorManagement);

    2.FromHBitmap方法:它从一个windows句柄处创建一个bitmap对象,它也包括两种函数形式:

    public static bitmap fromhbitmap(intptr hbitmap);
    public static bitmap fromhbitmap(intptr hbitmap, intptr hpalette);

    3. FromStream方法:从一个数据流中创建一个image对象,它包含三种函数形式:

    public static image fromstream(stream stream);
    public static image fromstream(stream stream, bool useembeddedcolormanagement);
    fromstream(stream stream, bool useembeddedcolormanagement, bool validateimagedata); 

    有了上面的了解,我们便可以开始利用C#做图像处理,下面介绍几种方法:

    一.   打开、保存、显示图像        

    privateBitmap srcBitmap = null;
    privateBitmap showBitmap = null;
    //打开文件
    privatevoid menuFileOpen_Click(object sender, EventArgs e)
    {
       OpenFileDialog openFileDialog = newOpenFileDialog();
       openFileDialog.Filter = @"Bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|所有合适文件(*.bmp,*.jpg)|*.bmp;*.jpg";
       openFileDialog.FilterIndex = 3;
       openFileDialog.RestoreDirectory = true;
       if (DialogResult.OK == openFileDialog.ShowDialog())
       {
          srcBitmap = (Bitmap)Bitmap.FromFile(openFileDialog.FileName, false);
          showBitmap = srcBitmap;
          this.AutoScroll = true;
          this.AutoScrollMinSize = newSize((int)(showBitmap.Width), (int)(showBitmap.Height));
          this.Invalidate();
       }
    }
    //保存图像文件
    privatevoid menuFileSave_Click(object sender, EventArgs e)
    {
       if (showBitmap != null)
       {
          SaveFileDialog saveFileDialog = newSaveFileDialog();
          saveFileDialog.Filter = @"Bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|所有合适文件(*.bmp,*.jpg)|*.bmp;*.jpg";
          saveFileDialog.FilterIndex = 3;
          saveFileDialog.RestoreDirectory = true;
          if (DialogResult.OK == saveFileDialog.ShowDialog())
          {   
              ImageFormat format = ImageFormat.Jpeg;
              switch (Path.GetExtension(saveFileDialog.FileName).ToLower())
              {
                  case".jpg":
                      format = ImageFormat.Jpeg;
                      break;
                  case".bmp":
                      format = ImageFormat.Bmp;
                      break;
                  default:
                      MessageBox.Show(this, "Unsupported image format was specified", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                      return;
               }
               try
               {
                  showBitmap.Save(saveFileDialog.FileName,format );
               }
               catch (Exception)
               {
                  MessageBox.Show(this, "Failed writing image file", "Error",MessageBoxButtons.OK, MessageBoxIcon.Error);
               }
           }
      }
    }
  • 相关阅读:
    (转)nginx的root和alias指令的区别
    (转)Bash 快捷键 完整版
    (转)curl 命令使用
    Ansible 部署
    (转)把Sublime Text 2 加入右键菜单(带图标),Edit with Sublime Text
    配置IP地址及HOSTNAME脚本
    Linux Shell : Test命令参数解析
    计算阶乘 n! = 1 * 2 * 3 * ... * n
    .编写一个函数,输入n为偶数时,调用函数求1/2+】1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
    简单的ATM机的取款过程
  • 原文地址:https://www.cnblogs.com/vaevvaev/p/6912289.html
Copyright © 2011-2022 走看看