C#图像处理学习笔记(屏幕截取,打开保存图像、旋转图像、黑白、马赛克、降低亮度、浮雕)

1、创建Form窗体应用程序

         打开VS,创建新项目-语言选择C#-Window窗体应用(.NET Framework)

         如果找不到,检查一下有没有安装.NET 桌面开发模块,如果没有,需要下载,记得勾选相关开发工具

         接上一步,选择windows窗体应用程序之后,点击下一步,修改相关路径和名字之后,点击创建。就可以得到一个如下的form设计界面。

 2、使用到的程序包和控件
        2.1、程序包

                使用到Nuget程序包中的System.Drawing.Common,下载方式如下:

        2.2、控件

                通过视图-工具箱,把工具箱调出来,在工具箱选择需要的控件。

        1)、此功能会运用openFileDialog、saveFileDialog、Button、Picturebox、label控件

        2)、在Form设计界面布置界面,加入图片文件的Picturebox1控件,处理图片后显示图片的Picturebox2控件。 

        3)、一个openFileDialog控件,两个saveFileDialog控件

        4)、接下来布置按钮,Button1:“打开”,Button2:“保存”,Button3:“添加暗角”,Button4:“降低亮度”,Button5:“去色”,Button6:“浮雕”,Button7:“马赛克”,Button8:“扩散”,Button9:“清除图片”,Button10:“保存2”,Button11:“油画效果”,Button12:“柔化”,Button13:“截屏”,Button14:“旋转90”。

        5)、label控件。改名为:运行时间

        提示:右键控件属性,即可改名

界面如下:

 3、代码实现
        3.1、Button1打开按钮
   //打开按钮
   private void button1_Click(object sender, EventArgs e)
   {
       if (openFileDialog1.ShowDialog() == DialogResult.OK)
       {
           //获取打开文件的路径
           string path = openFileDialog1.FileName;
           bitmap = (Bitmap) Bitmap.FromFile(path);
           pictureBox1.Image = bitmap.Clone() as Image;
       }
   }
         3.2、Button2保存按钮
    //保存按钮
    private void button2_Click(object sender, EventArgs e)
    {
        bool isSvae = true;
        if(saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string fileName = saveFileDialog1.FileName.ToString();
            if(fileName != "" && fileName != null)
            {
                //获取文件格式
                string fileExtName = fileName.Substring(fileName.LastIndexOf('.') + 1).ToString();
                System.Drawing.Imaging.ImageFormat imgformat = null;
                if(fileExtName != "")
                {
                    //确定文件格式
                    switch (fileExtName)
                    {
                        case "jpg":
                            imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                            break;
                        case "bmp":
                            imgformat = System.Drawing.Imaging.ImageFormat.Bmp;
                            break;
                        case "gif":
                            imgformat = System.Drawing.Imaging.ImageFormat.Gif;
                            break;
                        default:
                            MessageBox.Show("只能存储为:jpg,bmp, gif 格式");
                            isSvae = false;
                            break;
                    }
                 }

                //默认保存为jpg格式
                if(imgformat == null)
                {
                    imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                }

                if(isSvae)
                {
                    try
                    {
                        pictureBox2.Image.Save(fileName, imgformat);
                        MessageBox.Show("图片保存成功!");
                    }
                    catch
                    {
                        MessageBox.Show("保存失败! 你还没有截取过图片或者图片已经清空!");
                    }
                }
            }
        }
    }
        3.3、Button3添加暗角按钮
  //添加暗角按钮
  private void button3_Click(object sender, EventArgs e)
  {
      if (bitmap != null)
      {
          newbitmap = bitmap.Clone() as Bitmap;
          
          sw.Reset();
          sw.Restart();

          int width = newbitmap.Width;
          int height = newbitmap.Height;
          float cx = width / 2;
          float cy = height / 2;
          float maxDist = cx * cx + cy * cy;
          float currDist = 0, factor;
          Color pixel;

          for (int i = 0; i < width; i++)
          {
              for (int j = 0; j < height; j++)
              {
                  currDist = ((float)i - cx) * ((float)i - cx) + ((float)j - cy) * ((float)j - cy);
                  factor = currDist / maxDist;

                  pixel = newbitmap.GetPixel(i, j);
                  int red = (int)(pixel.R * (1 - factor));
                  int green = (int)(pixel.G * (1 - factor));
                  int blue = (int)(pixel.B * (1 - factor));
                  newbitmap.SetPixel(i, j, Color.FromArgb(red, green, blue));
              }
          }
          
          sw.Stop();
          label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
          //显示处理好的图片
          pictureBox2.Image = newbitmap.Clone() as Image;
      }
  }
        3.4、Button4降低亮度按钮 
//降低亮度按钮
private void button4_Click(object sender, EventArgs e)
{
    if(bitmap != null)
    {
        newbitmap = bitmap.Clone() as Bitmap;
        sw.Reset();
        sw.Restart();
        Color pixel;
        int red, green, blue;
        for (int x = 0; x < newbitmap.Width; x++)
        {
            for (int y = 0; y < newbitmap.Height; y++)
            {
                pixel = newbitmap.GetPixel(x, y);
                red = (int)(pixel.R * 0.6);
                green = (int)(pixel.G * 0.6);
                blue = (int)(pixel.B * 0.6);
                newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
            }
        }

        sw.Stop();
        label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
        pictureBox2.Image = newbitmap.Clone() as Image;
    }
}
       3.5、Button5去色按钮
   //去色按钮
   private void button5_Click(object sender, EventArgs e)
   {
       if(bitmap != null)
       {
           newbitmap = bitmap.Clone() as Bitmap;
           sw.Reset();
           sw.Restart();
           Color pixel;
           int gray;
           for (int x = 0; x < newbitmap.Width; x++)
           {
               for(int y = 0; y< newbitmap.Height; y++)
               {
                   pixel = newbitmap.GetPixel(x, y);
                   gray = (int)(0.3 * pixel.R + 0.59 * pixel.G + 0.11 * pixel.B);
                   newbitmap.SetPixel(x, y, Color.FromArgb(gray, gray, gray));
               }
           }

           sw.Stop();
           label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
           pictureBox2.Image = newbitmap.Clone() as Image;
       }
   }
        3.6、Button6 浮雕按钮
  //浮雕按钮
  private void button6_Click(object sender, EventArgs e)
  {
      if (bitmap != null)
      {
          newbitmap = bitmap.Clone() as Bitmap;

          sw.Reset();
          sw.Restart();
          Color pixel;
          int red, green, blue;
          
          for (int x = 0; x < newbitmap.Width; x++)
          {
              for (int y = 0;y < newbitmap.Height; y++)
              {
                  pixel = newbitmap.GetPixel(x, y);
                  red = (int)(255 - pixel.R);
                  green = (int)(255 - pixel.G);
                  blue = (int)(255 - pixel.B);
                  newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
              }
          }

          sw.Stop ();
          label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
          pictureBox2.Image = newbitmap.Clone() as Image;
      }
   }
        3.7、Button7马赛克按钮
  //马赛克按钮
  private void button7_Click(object sender, EventArgs e)
  {
      if (bitmap != null)
      {
          newbitmap = bitmap.Clone() as Bitmap;
          sw.Reset();
          sw.Restart();
          int RIDIO = 50; // 马赛克的尺度,默认为周围的两个像素

          for (int h = 0; h < newbitmap.Height; h += RIDIO)
          {
              for( int w = 0; w < newbitmap.Width; w+= RIDIO)
              {
                  int avgRed = 0, avgGreed = 0, avgBlue = 0;
                  int count = 0;
                  for( int x = w; (x < w + RIDIO && x < newbitmap.Width);  x++)
                  {
                      for ( int y = h; (y < h + RIDIO && y < newbitmap.Height); y++)
                      {
                          Color pixel = newbitmap.GetPixel(x, y);
                          avgRed += pixel.R;
                          avgGreed += pixel.G;
                          avgBlue += pixel.B;
                          count++;
                      }
                  }

                  //取平均值
                  avgRed = avgRed / count;
                  avgBlue = avgBlue / count;
                  avgGreed = avgGreed / count;

                  //设置颜色
                  for( int x = w; ( x < w + RIDIO && x<newbitmap.Width); x++)
                  {
                      for (int y = h; ( y < h + RIDIO && ( y < newbitmap.Height) ); y++)
                       {
                          Color newColor = Color.FromArgb(avgRed, avgGreed, avgBlue);
                          newbitmap.SetPixel(x, y, newColor);
                       }
                  }    
              }
          }

          sw.Stop();
          label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
          pictureBox2.Image = newbitmap.Clone() as Image;
      }
   }
         3.8、Button8扩散按钮
   //扩散按钮
   private void button8_Click(object sender, EventArgs e)
   {
       if (bitmap != null)
       {
           newbitmap = bitmap.Clone() as Bitmap;
           sw.Reset();
           sw.Restart();
           Color pixel;
           int red, green, blue;

           for (int x = 0; x < newbitmap.Width; x++)
           {
               for (int y = 0; y < newbitmap.Height; y++)
               {
                   Random ran = new Random();
                   int RankKey = ran.Next(-5, 5);
                   if (x + RankKey >= newbitmap.Width || y + RankKey >= newbitmap.Height || x + RankKey < 0 || y + RankKey < 0)
                   {
                       continue;
                   }

                   pixel = newbitmap.GetPixel(x + RankKey, y + RankKey);
                   red = (int)(pixel.R);
                   green = (int)(pixel.G);
                   blue = (int)(pixel.B);
                   newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
               }
           }

           sw.Stop();
           label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
           pictureBox2.Image = newbitmap.Clone() as Image;
       }
    }
        3.9、Button9清除图片按钮
 //清除图片按钮
 private void button9_Click(object sender, EventArgs e)
 {
     pictureBox1.Image = null;
     pictureBox2.Image = null;
 }
         3.10、保存2按钮
//保存2按钮
private void button10_Click(object sender, EventArgs e)
{
    if(saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        string path = saveFileDialog1.FileName;
        ImageFormat imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
        pictureBox2.Image.Save(path, imgformat);
    }
}
         3.11、Button11油画按钮
  //油画按钮
  private void button11_Click(object sender, EventArgs e)
  {
      if (bitmap != null)
      {
          newbitmap = bitmap.Clone() as Bitmap;
          //取得图片尺寸
          int width = newbitmap.Width;
          int height = newbitmap.Height;

          sw.Reset();
          sw.Restart();
          //产生随机数序列
          Random rnd = new Random();
          //取不同的值决定油画效果的不同程度
          int iModel = 2;
          int i = width - iModel;
          while (i > 1)
          {
              int j = height - iModel;
              while (j > 1)
              {
                  int iPos = rnd.Next(100000) % iModel;
                  //将该点的RGB值设置成附近iModel点之内的任一点
                  Color color = newbitmap.GetPixel(i + iPos, j + iPos);
                  newbitmap.SetPixel(i, j, color);
                  j = j - 1;
              }
              i = i - 1;
          }

          sw.Stop();
          label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
          pictureBox2.Image = newbitmap.Clone() as Image;
      }
   }
         3.12、Button12柔化按钮
    //柔化按钮
    private void button12_Click(object sender, EventArgs e)
    {
        if (bitmap != null)
        {
            newbitmap = bitmap.Clone() as Bitmap;
            //取得图片尺寸
            int width = newbitmap.Width;
            int height = newbitmap.Height;

            sw.Reset();
            sw.Restart();
            Color piexl;

            //高斯模板
            int[] Gauss = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
            for(int x = 1; x < width - 1; x++)
            {
                for(int y = 1; y < height - 1; y++)
                {
                    int r = 0, g = 0, b = 0;
                    int index = 0;
                    for(int col = -1; col <= 1; col++)
                    {
                        for (int row = -1; row <= 1; row++)
                        {
                            piexl = newbitmap.GetPixel(x + row, y + col);
                            r += piexl.R * Gauss[index];
                            g += piexl.G * Gauss[index];
                            b += piexl.B * Gauss[index];
                            index++;
                        }
                    }
                    r /= 16;
                    g /= 16;
                    b /= 16;
                    //处理颜色溢出
                    r = r > 255 ? 255 : r;
                    r = r < 0 ? 0 : r;
                    g = g > 255 ? 255 : g;
                    g = g < 0 ? 0 : g;
                    b = b > 255 ? 255 : b;
                    b = b < 0 ? 0 : b;
                    bitmap.SetPixel(x - 1, y -1, Color.FromArgb(r, g, b));
                }
            }

            sw.Stop();
            label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
            pictureBox2.Image = newbitmap.Clone() as Image;
        }
     }
         3.13、Button13截屏按钮
struct POINT
{
    public Int32 x;
    public Int32 y;
}

struct CURSORINFO
{
    public Int32 cbSize;
    public Int32 flags;
    public IntPtr hCursor;
    public POINT ptScreenPos;
}

 
// 按指定尺寸对图像pic进行非拉伸缩放
 public static Bitmap shrinkTo(Image pic, Size S, Boolean cutting)
 {
     //创建图像
     Bitmap tmp = new Bitmap(S.Width, S.Height);//按指定大小创建图像

     //绘制
     Graphics g = Graphics.FromImage(tmp);//从位图创建Graphics对象
     g.Clear(Color.FromArgb(0, 0, 0)); //清空

     Boolean mode = (float)pic.Width / S.Width > (float)pic.Height / S.Height;  //zoom缩放
     if (cutting) mode = !mode;  //裁剪缩放

     //计算zoom绘制区域
     if (mode)
     {
         S.Height = (int)((float)pic.Height * S.Width / pic.Width);
     }
     else
     {
         S.Width = (int)((float)pic.Width * S.Height / pic.Height);
     }

     Point p = new Point((tmp.Width - S.Width) / 2, (tmp.Height - S.Height) / 2);

     g.DrawImage(pic, new Rectangle(p, S));
     return tmp;//返回构建的新图像
 }

 //根据文件拓展名,获取对应的存储类型
 public static ImageFormat getFormat(string filePath)
 {
     ImageFormat format = ImageFormat.MemoryBmp;
     String Ext = System.IO.Path.GetExtension(filePath).ToLower();

     if (Ext.Equals(".png")) format = ImageFormat.Png;
     else if (Ext.Equals(".jpg") || Ext.Equals(".jpeg")) format = ImageFormat.Jpeg;
     else if (Ext.Equals(".bmp")) format = ImageFormat.Bmp;
     else if (Ext.Equals(".gif")) format = ImageFormat.Gif;
     else if (Ext.Equals(".ico")) format = ImageFormat.Icon;
     else if (Ext.Equals(".emf")) format = ImageFormat.Emf;
     else if (Ext.Equals(".exif")) format = ImageFormat.Exif;
     else if (Ext.Equals(".tiff")) format = ImageFormat.Tiff;
     else if (Ext.Equals(".wmf")) format = ImageFormat.Wmf;
     else if (Ext.Equals(".memorybmp")) format = ImageFormat.MemoryBmp;

     return format;
 }

 //保存图像pic到文件fileName中,指定图像保存格式
 public static void SaveToFile(Image pic, string fileName, bool replace, ImageFormat format)
 {
     //若图像已存在,则删除
     if (System.IO.File.Exists(fileName) && replace)
     {
         System.IO.File.Delete(fileName);
     }

     //若不存在则创建
     if (!System.IO.File.Exists(fileName))
     {
         if (format == null)
         {
             format = getFormat(fileName); //根据拓展名获取图像的对应存储类型
         }

         if (format == ImageFormat.MemoryBmp)
         {
             pic.Save(fileName);
             MessageBox.Show("图片保存成功!");
         }
         else
         {
             pic.Save(fileName, format);//按给定格式保存图像
             MessageBox.Show("图片保存成功!");
         }
     }
 }

 // 缩放icon为指定的尺寸,并保存到路径PathName
 public static void saveImage(Image image, Size size, String PathName)
 {
     Image tmp = shrinkTo(image, size, false);
     SaveToFile(tmp, PathName, true, null);
 }

 // 截取屏幕指定区域为Image,保存到路径savePath下,haveCursor是否包含鼠标
 private static Image getScreen(int x = 0, int y = 0, int width = -1, int height = -1, String savePath = "", bool haveCursor = true)
 {
     if (width == -1)
     {
         width = SystemInformation.VirtualScreen.Width + 1280;//虚拟屏幕界限
     }
     if (height == -1)
     {
         height = SystemInformation.VirtualScreen.Height + 800;
     }

     Bitmap tmp = new Bitmap(width, height); //按指定大小创建位图
     Graphics g = Graphics.FromImage(tmp); //从位图创建Graphics对象
     g.CopyFromScreen(x, y, 0, 0, new Size(width, height)); //绘制

     // 绘制鼠标
     if (haveCursor)
     {
         try
         {
             CURSORINFO pci;
             pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
             GetCursorInfo(out pci);
             System.Windows.Forms.Cursor cur = new System.Windows.Forms.Cursor(pci.hCursor);
             cur.Draw(g, new Rectangle(pci.ptScreenPos.x, pci.ptScreenPos.y, cur.Size.Width, cur.Size.Height));
         }
         catch (Exception ex)
         {
             // 若获取鼠标异常则不显示
         }
     }
     if (!savePath.Equals(""))
     {
         saveImage(tmp, tmp.Size, savePath); // 保存到指定的路径下
     }
     return tmp;  //返回构建的新图像
 }

 private static void GetCursorInfo(out CURSORINFO pci)
 {
     throw new NotImplementedException();
 }

 //截屏按钮
 private void button13_Click(object sender, EventArgs e)
 {
     screen = getScreen();                       // 截取屏幕  
     pictureBox1.Image = screen;
 }

       
//旋转90度按钮 
private void button14_Click(object sender, EventArgs e)
 {
     //获取需要旋转的图片
     //  Bitmap bmp = (Bitmap)screen;
     Bitmap bmp = (Bitmap)pictureBox1.Image;

     sw.Reset();
     sw.Restart();

     //向右90度旋转
     bmp.RotateFlip(RotateFlipType.Rotate270FlipXY);

     sw.Stop();
     label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
     pictureBox2.Image = bmp.Clone() as Image;
 }

 补充:旋转使用了Image类的RotateFlip方法

4、运行结果 

        打开一张图片显示到pictureBox1中,然后点击相应的按钮,便会在pictureBox2中显示处理后的图片。

5、完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        //创建一个新的位图
        private Bitmap bitmap,  newbitmap;
        private Stopwatch sw;//计算运行时间

        //截屏的图片
        Image screen;

        public Form1()
        {
            InitializeComponent();
            sw = new Stopwatch();
        }

        struct POINT
        {
            public Int32 x;
            public Int32 y;
        }

        struct CURSORINFO
        {
            public Int32 cbSize;
            public Int32 flags;
            public IntPtr hCursor;
            public POINT ptScreenPos;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        //保存按钮
        private void button2_Click(object sender, EventArgs e)
        {
            bool isSvae = true;
            if(saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string fileName = saveFileDialog1.FileName.ToString();
                if(fileName != "" && fileName != null)
                {
                    string fileExtName = fileName.Substring(fileName.LastIndexOf('.') + 1).ToString();
                    System.Drawing.Imaging.ImageFormat imgformat = null;
                    if(fileExtName != "")
                    {
                        switch (fileExtName)
                        {
                            case "jpg":
                                imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                                break;
                            case "bmp":
                                imgformat = System.Drawing.Imaging.ImageFormat.Bmp;
                                break;
                            case "gif":
                                imgformat = System.Drawing.Imaging.ImageFormat.Gif;
                                break;
                            default:
                                MessageBox.Show("只能存储为:jpg,bmp, gif 格式");
                                isSvae = false;
                                break;
                        }
                     }

                    //默认保存为jpg格式
                    if(imgformat == null)
                    {
                        imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                    }

                    if(isSvae)
                    {
                        try
                        {
                            pictureBox2.Image.Save(fileName, imgformat);
                            MessageBox.Show("图片保存成功!");
                        }
                        catch
                        {
                            MessageBox.Show("保存失败! 你还没有截取过图片或者图片已经清空!");
                        }
                    }
                }
            }
        }

        //打开按钮
        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string path = openFileDialog1.FileName;
                bitmap = (Bitmap) Bitmap.FromFile(path);
                pictureBox1.Image = bitmap.Clone() as Image;
            }
        }

        //添加暗角按钮
        private void button3_Click(object sender, EventArgs e)
        {
            if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;

                sw.Reset();
                sw.Restart();

                int width = newbitmap.Width;
                int height = newbitmap.Height;
                float cx = width / 2;
                float cy = height / 2;
                float maxDist = cx * cx + cy * cy;
                float currDist = 0, factor;
                Color pixel;

                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        currDist = ((float)i - cx) * ((float)i - cx) + ((float)j - cy) * ((float)j - cy);
                        factor = currDist / maxDist;

                        pixel = newbitmap.GetPixel(i, j);
                        int red = (int)(pixel.R * (1 - factor));
                        int green = (int)(pixel.G * (1 - factor));
                        int blue = (int)(pixel.B * (1 - factor));
                        newbitmap.SetPixel(i, j, Color.FromArgb(red, green, blue));
                    }
                }

                sw.Stop();
                label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
        }

        //降低亮度按钮
        private void button4_Click(object sender, EventArgs e)
        {
            if(bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                sw.Reset();
                sw.Restart();
                Color pixel;
                int red, green, blue;
                for (int x = 0; x < newbitmap.Width; x++)
                {
                    for (int y = 0; y < newbitmap.Height; y++)
                    {
                        pixel = newbitmap.GetPixel(x, y);
                        red = (int)(pixel.R * 0.6);
                        green = (int)(pixel.G * 0.6);
                        blue = (int)(pixel.B * 0.6);
                        newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
                    }
                }

                sw.Stop();
                label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
        }

        //马赛克按钮
        private void button7_Click(object sender, EventArgs e)
        {
            if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                sw.Reset();
                sw.Restart();
                int RIDIO = 50; // 马赛克的尺度,默认为周围的两个像素

                for (int h = 0; h < newbitmap.Height; h += RIDIO)
                {
                    for( int w = 0; w < newbitmap.Width; w+= RIDIO)
                    {
                        int avgRed = 0, avgGreed = 0, avgBlue = 0;
                        int count = 0;
                        for( int x = w; (x < w + RIDIO && x < newbitmap.Width);  x++)
                        {
                            for ( int y = h; (y < h + RIDIO && y < newbitmap.Height); y++)
                            {
                                Color pixel = newbitmap.GetPixel(x, y);
                                avgRed += pixel.R;
                                avgGreed += pixel.G;
                                avgBlue += pixel.B;
                                count++;
                            }
                        }

                        //取平均值
                        avgRed = avgRed / count;
                        avgBlue = avgBlue / count;
                        avgGreed = avgGreed / count;

                        //设置颜色
                        for( int x = w; ( x < w + RIDIO && x<newbitmap.Width); x++)
                        {
                            for (int y = h; ( y < h + RIDIO && ( y < newbitmap.Height) ); y++)
                             {
                                Color newColor = Color.FromArgb(avgRed, avgGreed, avgBlue);
                                newbitmap.SetPixel(x, y, newColor);
                             }
                        }    
                    }
                }

                sw.Stop();
                label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
         }

        //去色按钮
        private void button5_Click(object sender, EventArgs e)
        {
            if(bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                sw.Reset();
                sw.Restart();
                Color pixel;
                int gray;
                for (int x = 0; x < newbitmap.Width; x++)
                {
                    for(int y = 0; y< newbitmap.Height; y++)
                    {
                        pixel = newbitmap.GetPixel(x, y);
                        gray = (int)(0.3 * pixel.R + 0.59 * pixel.G + 0.11 * pixel.B);
                        newbitmap.SetPixel(x, y, Color.FromArgb(gray, gray, gray));
                    }
                }

                sw.Stop();
                label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
        }

        //浮雕按钮
        private void button6_Click(object sender, EventArgs e)
        {
            if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;

                sw.Reset();
                sw.Restart();
                Color pixel;
                int red, green, blue;
                
                for (int x = 0; x < newbitmap.Width; x++)
                {
                    for (int y = 0;y < newbitmap.Height; y++)
                    {
                        pixel = newbitmap.GetPixel(x, y);
                        red = (int)(255 - pixel.R);
                        green = (int)(255 - pixel.G);
                        blue = (int)(255 - pixel.B);
                        newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
                    }
                }

                sw.Stop ();
                label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
         }

        //扩散按钮
        private void button8_Click(object sender, EventArgs e)
        {
            if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                sw.Reset();
                sw.Restart();
                Color pixel;
                int red, green, blue;

                for (int x = 0; x < newbitmap.Width; x++)
                {
                    for (int y = 0; y < newbitmap.Height; y++)
                    {
                        Random ran = new Random();
                        int RankKey = ran.Next(-5, 5);
                        if (x + RankKey >= newbitmap.Width || y + RankKey >= newbitmap.Height || x + RankKey < 0 || y + RankKey < 0)
                        {
                            continue;
                        }

                        pixel = newbitmap.GetPixel(x + RankKey, y + RankKey);
                        red = (int)(pixel.R);
                        green = (int)(pixel.G);
                        blue = (int)(pixel.B);
                        newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
                    }
                }

                sw.Stop();
                label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
         }

        //清除图片按钮
        private void button9_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = null;
            pictureBox2.Image = null;
        }

        //保存2按钮
        private void button10_Click(object sender, EventArgs e)
        {
            if(saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string path = saveFileDialog1.FileName;
                ImageFormat imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                pictureBox2.Image.Save(path, imgformat);
            }
        }

        //油画按钮
        private void button11_Click(object sender, EventArgs e)
        {
            if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                //取得图片尺寸
                int width = newbitmap.Width;
                int height = newbitmap.Height;

                sw.Reset();
                sw.Restart();
                //产生随机数序列
                Random rnd = new Random();
                //取不同的值决定油画效果的不同程度
                int iModel = 2;
                int i = width - iModel;
                while (i > 1)
                {
                    int j = height - iModel;
                    while (j > 1)
                    {
                        int iPos = rnd.Next(100000) % iModel;
                        //将该点的RGB值设置成附近iModel点之内的任一点
                        Color color = newbitmap.GetPixel(i + iPos, j + iPos);
                        newbitmap.SetPixel(i, j, color);
                        j = j - 1;
                    }
                    i = i - 1;
                }

                sw.Stop();
                label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
         }

        //柔化按钮
        private void button12_Click(object sender, EventArgs e)
        {
            if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                //取得图片尺寸
                int width = newbitmap.Width;
                int height = newbitmap.Height;

                sw.Reset();
                sw.Restart();
                Color piexl;

                //高斯模板
                int[] Gauss = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
                for(int x = 1; x < width - 1; x++)
                {
                    for(int y = 1; y < height - 1; y++)
                    {
                        int r = 0, g = 0, b = 0;
                        int index = 0;
                        for(int col = -1; col <= 1; col++)
                        {
                            for (int row = -1; row <= 1; row++)
                            {
                                piexl = newbitmap.GetPixel(x + row, y + col);
                                r += piexl.R * Gauss[index];
                                g += piexl.G * Gauss[index];
                                b += piexl.B * Gauss[index];
                                index++;
                            }
                        }
                        r /= 16;
                        g /= 16;
                        b /= 16;
                        //处理颜色溢出
                        r = r > 255 ? 255 : r;
                        r = r < 0 ? 0 : r;
                        g = g > 255 ? 255 : g;
                        g = g < 0 ? 0 : g;
                        b = b > 255 ? 255 : b;
                        b = b < 0 ? 0 : b;
                        bitmap.SetPixel(x - 1, y -1, Color.FromArgb(r, g, b));
                    }
                }

                sw.Stop();
                label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
         }

        /// 按指定尺寸对图像pic进行非拉伸缩放
        public static Bitmap shrinkTo(Image pic, Size S, Boolean cutting)
        {
            //创建图像
            Bitmap tmp = new Bitmap(S.Width, S.Height);//按指定大小创建图像

            //绘制
            Graphics g = Graphics.FromImage(tmp);//从位图创建Graphics对象
            g.Clear(Color.FromArgb(0, 0, 0)); //清空

            Boolean mode = (float)pic.Width / S.Width > (float)pic.Height / S.Height;  //zoom缩放
            if (cutting) mode = !mode;  //裁剪缩放

            //计算zoom绘制区域
            if (mode)
            {
                S.Height = (int)((float)pic.Height * S.Width / pic.Width);
            }
            else
            {
                S.Width = (int)((float)pic.Width * S.Height / pic.Height);
            }

            Point p = new Point((tmp.Width - S.Width) / 2, (tmp.Height - S.Height) / 2);

            g.DrawImage(pic, new Rectangle(p, S));
            return tmp;//返回构建的新图像
        }

        //根据文件拓展名,获取对应的存储类型
        public static ImageFormat getFormat(string filePath)
        {
            ImageFormat format = ImageFormat.MemoryBmp;
            String Ext = System.IO.Path.GetExtension(filePath).ToLower();

            if (Ext.Equals(".png")) format = ImageFormat.Png;
            else if (Ext.Equals(".jpg") || Ext.Equals(".jpeg")) format = ImageFormat.Jpeg;
            else if (Ext.Equals(".bmp")) format = ImageFormat.Bmp;
            else if (Ext.Equals(".gif")) format = ImageFormat.Gif;
            else if (Ext.Equals(".ico")) format = ImageFormat.Icon;
            else if (Ext.Equals(".emf")) format = ImageFormat.Emf;
            else if (Ext.Equals(".exif")) format = ImageFormat.Exif;
            else if (Ext.Equals(".tiff")) format = ImageFormat.Tiff;
            else if (Ext.Equals(".wmf")) format = ImageFormat.Wmf;
            else if (Ext.Equals(".memorybmp")) format = ImageFormat.MemoryBmp;

            return format;
        }

        //保存图像pic到文件fileName中,指定图像保存格式
        public static void SaveToFile(Image pic, string fileName, bool replace, ImageFormat format)
        {
            //若图像已存在,则删除
            if (System.IO.File.Exists(fileName) && replace)
            {
                System.IO.File.Delete(fileName);
            }

            //若不存在则创建
            if (!System.IO.File.Exists(fileName))
            {
                if (format == null)
                {
                    format = getFormat(fileName); //根据拓展名获取图像的对应存储类型
                }

                if (format == ImageFormat.MemoryBmp)
                {
                    pic.Save(fileName);
                    MessageBox.Show("图片保存成功!");
                }
                else
                {
                    pic.Save(fileName, format);//按给定格式保存图像
                    MessageBox.Show("图片保存成功!");
                }
            }
        }

        /// 缩放icon为指定的尺寸,并保存到路径PathName
        public static void saveImage(Image image, Size size, String PathName)
        {
            Image tmp = shrinkTo(image, size, false);
            SaveToFile(tmp, PathName, true, null);
        }

        // 截取屏幕指定区域为Image,保存到路径savePath下,haveCursor是否包含鼠标
        private static Image getScreen(int x = 0, int y = 0, int width = -1, int height = -1, String savePath = "", bool haveCursor = true)
        {
            if (width == -1)
            {
                width = SystemInformation.VirtualScreen.Width + 1280;//虚拟屏幕界限
            }
            if (height == -1)
            {
                height = SystemInformation.VirtualScreen.Height + 800;
            }

            Bitmap tmp = new Bitmap(width, height); //按指定大小创建位图
            Graphics g = Graphics.FromImage(tmp); //从位图创建Graphics对象
            g.CopyFromScreen(x, y, 0, 0, new Size(width, height)); //绘制

            // 绘制鼠标
            if (haveCursor)
            {
                try
                {
                    CURSORINFO pci;
                    pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
                    GetCursorInfo(out pci);
                    System.Windows.Forms.Cursor cur = new System.Windows.Forms.Cursor(pci.hCursor);
                    cur.Draw(g, new Rectangle(pci.ptScreenPos.x, pci.ptScreenPos.y, cur.Size.Width, cur.Size.Height));
                }
                catch (Exception ex)
                {
                    // 若获取鼠标异常则不显示
                }
            }
            if (!savePath.Equals(""))
            {
                saveImage(tmp, tmp.Size, savePath); // 保存到指定的路径下
            }
            return tmp;  //返回构建的新图像
        }

        private static void GetCursorInfo(out CURSORINFO pci)
        {
            throw new NotImplementedException();
        }

        //旋转90度按钮
        private void button14_Click(object sender, EventArgs e)
        {
            //获取需要旋转的图片
            //  Bitmap bmp = (Bitmap)screen;
            Bitmap bmp = (Bitmap)pictureBox1.Image;

            sw.Reset();
            sw.Restart();

            //向右90度旋转
            bmp.RotateFlip(RotateFlipType.Rotate270FlipXY);

            sw.Stop();
            label1.Text = "运行时间: " + sw.ElapsedMilliseconds.ToString();
            pictureBox2.Image = bmp.Clone() as Image;
        }

        //截屏按钮
        private void button13_Click(object sender, EventArgs e)
        {
            screen = getScreen();                       // 截取屏幕  
            pictureBox1.Image = screen;
        }

       
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值