zoukankan      html  css  js  c++  java
  • C#开发自动照片(图片)裁剪(缩放)工具

    1、需求分析

    用winform窗体程序,开发一个能够自动、批量对图片进行缩放和裁剪的程序。

    原本想直接从网上找类型的工具直接用,但是无奈现在网上能找到的工具,要么不能用,要么就是很

    恶心的下载完后还有一堆插件的,要么就是我用不来的。

    这个程序是我根据个人需求,想要把所有拍好的人像照,直接批处理成1寸的照片,就能省去很多裁剪图片的时间。

    这里要对生成的1寸图片做个说明:1寸图片我网上查到的大小是:照片规格(英寸) (厘米) (像素)

      1寸 2.5*3.5cm 413*295

    由于在拍摄时可能存在横拍和竖拍,所以生成后图片虽然也是1寸的,但是方向不一样,这个不影响,还可以根据需求在代码中修改。

    先看效果:

     

     可以看出缩放图片后,图片的质量也会随之变低,而裁剪则不会有这个问题。

    2、图片裁剪代码

     1      /// <summary>
     2         /// 裁剪按钮
     3         /// </summary>
     4         /// <param name="sender"></param>
     5         /// <param name="e"></param>
     6         private void Button1_Click(object sender, EventArgs e)
     7         {
     8             OpenFileDialog dialog = new OpenFileDialog();                                         //打开文件夹,选择图片
     9             dialog.Filter = "(*.jpg,*.png,*.jpeg,*.bmp,*.gif)|*.jgp;*.png;*.jpeg;*.bmp;*.gif;*.JPG;*.PNG;|All files(*.*)|*.*";
    10             dialog.Multiselect = true;
    11             if (dialog.ShowDialog() == DialogResult.OK)
    12             {
    13                 string path = dialog.FileName;
    14                 Bitmap img = new Bitmap(path);
    15                 Image img2 = ImageTailor(img, 319, 449);                                         //设置大小为1寸照片   
    16                 string imgSaveUrl = @"D:/我的图片/处理完成/" + dialog.SafeFileName;                //保存图片到文件夹
    17                 img2.Save(imgSaveUrl);
    18                 img2.Dispose();                                                                  //释放资源
    19             }
    20         }
    21 
    22         public Image ImageTailor(Bitmap bmp,int nowWidth,int nowHeight)
    23         {
    24             Bitmap newbm = new Bitmap(nowWidth, nowHeight);
    25             Graphics g = Graphics.FromImage(newbm);
    26             g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    27             g.SmoothingMode = SmoothingMode.HighQuality;
    28             g.CompositingQuality = CompositingQuality.HighQuality;
    29             //前Rectangle代表画布大小,后Rectangle代表裁剪后右边留下的区域
    30             g.DrawImage(bmp, new Rectangle(0, 0, nowWidth, nowHeight), new Rectangle(0, 0, bmp.Width / 2, bmp.Height), GraphicsUnit.Pixel);
    31             g.Dispose();
    32             return newbm;
    33         }

     裁剪按钮方法还没完善好,目前只完成了单张图片的裁剪。要想修改成批量的,只需在openfiledialog控件设置成允许多选,然后根据选中的图片数量进行循环处理,就可以了。

    后面的缩放按钮是比较完善的,可以允许多选图片,并进行批处理。

    3、图片缩放代码:

    缩放图片的代码看起来会比较复杂些,但是逻辑并不难。一些代码也是在网上看其他人写的,拿过来用(那个“中间件确实是自己写着玩的,懒得改回去,哈哈”)

      1      /// <summary>
      2         /// 显示图片
      3         /// </summary>
      4         /// <param name="sender"></param>
      5         /// <param name="e"></param>
      6         private void Button_SelectImg_Click(object sender, EventArgs e)
      7         {
      8             OpenFileDialog dialog = new OpenFileDialog();
      9             dialog.Filter = "(*.jpg,*.png,*.jpeg,*.bmp,*.gif)|*.jgp;*.png;*.jpeg;*.bmp;*.gif;*.JPG;*.PNG;|All files(*.*)|*.*";
     10             dialog.Multiselect = true;                                                              //允许文件多选
     11             string folder = "";
     12             if (Directory.Exists(@"D:/我的图片/处理完成/"))
     13             {
     14                 folder = @"D:/我的图片/处理完成/";
     15             }
     16             else
     17             {
     18                 Directory.CreateDirectory(@"D:/我的图片/处理完成/");
     19                 folder = @"D:/我的图片/处理完成/"; 
     20             }
     21             if (dialog.ShowDialog() == DialogResult.OK) 
     22             {
     23                 int fileCount = dialog.FileNames.Length;                                            //获取选中图片数量
     24                 int countNum = fileCount;
     25                 for (int i = 0; i < fileCount; i++)
     26                 {
     27                     string path = dialog.FileNames[i];                                              //图片绝对路径,包含图片名称
     28                     Image img = GetReducedImage(path);
     29                     string imgSaveUrl = folder + dialog.SafeFileNames[i];                           //保存图片到文件夹
     30                     img.Save(imgSaveUrl);
     31                     img.Dispose();                                                                  //释放资源
     32                     countNum--;
     33                     if (countNum == 0)
     34                     {
     35                         MessageBox.Show("处理图片完成,总计处理:" + fileCount + "");
     36                     }
     37                 }
     38             }
     39         }
     40 
     41         /// <summary>
     42         /// 中间件,写着玩
     43         /// </summary>
     44         /// <param name="fileName"></param>
     45         /// <returns></returns>
     46         public Image GetReducedImage(string fileName)
     47         {
     48             Image ResourceImage = Image.FromFile(fileName);
     49             Bitmap img = new Bitmap(ResourceImage);
     50             return ZoomImage(img, 449, 319);
     51         }
     52 
     53         #region 等比例缩放图片
     54         /// <summary>
     55         /// 等比例缩放图片
     56         /// </summary>
     57         /// <param name="bitmap"></param>
     58         /// <param name="destHeight"></param>
     59         /// <param name="destWidth"></param>
     60         /// <returns></returns>
     61         private Bitmap ZoomImage(Bitmap bitmap, int destHeight, int destWidth)
     62         {
     63             try
     64             {
     65                 Image sourImage = bitmap;
     66                 ImageCodecInfo ici = GetEncoder(ImageFormat.Jpeg);
     67                 int width = 0, height = 0;
     68                 //按比例缩放           
     69                 int sourWidth = sourImage.Width;
     70                 int sourHeight = sourImage.Height;
     71                 if (sourHeight > destHeight || sourWidth > destWidth)
     72                 {
     73                     if ((sourWidth * destHeight) > (sourHeight * destWidth))
     74                     {
     75                         width = destWidth;
     76                         height = (destWidth * sourHeight) / sourWidth;
     77                     }
     78                     else
     79                     {
     80                         height = destHeight;
     81                         width = (sourWidth * destHeight) / sourHeight;
     82                     }
     83                 }
     84                 else
     85                 {
     86                     width = sourWidth;
     87                     height = sourHeight;
     88                 }
     89                 Bitmap destBitmap = new Bitmap(destWidth, destHeight);
     90                 Graphics g = Graphics.FromImage(destBitmap);
     91                 g.Clear(Color.Transparent);
     92                 //设置画布的描绘质量         
     93                 g.CompositingQuality = CompositingQuality.HighQuality;
     94                 g.SmoothingMode = SmoothingMode.HighQuality;
     95                 g.InterpolationMode = InterpolationMode.HighQualityBilinear;
     96                 g.DrawImage(sourImage, new Rectangle((destWidth - width) / 2, (destHeight - height) / 2, width, height), 0, 0, sourImage.Width, sourImage.Height, GraphicsUnit.Pixel);
     97                 g.Dispose();
     98                 //设置压缩质量     
     99                 EncoderParameters encoderParams = new EncoderParameters();
    100                 long[] quality = new long[1];
    101                 quality[0] = 100;
    102                 EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
    103                 encoderParams.Param[0] = encoderParam;
    104                 sourImage.Dispose();
    105                 return destBitmap;
    106             }
    107             catch
    108             {
    109                 return bitmap;
    110             }
    111         }
    112         #endregion
    113 
    114         public static ImageCodecInfo GetEncoder(ImageFormat format)
    115         {
    116             ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
    117             foreach (ImageCodecInfo codec in codecs)
    118             {
    119                 if (codec.FormatID == format.Guid)
    120                 {
    121                     return codec;
    122                 }
    123             }
    124             return null;
    125         }

    4、总结:

    以上,就完成了简单的图片批量缩放(裁剪)成1寸图片的功能。

  • 相关阅读:
    Web Ajax入门一讲
    Delphi – 我的代码之简单五子棋
    闲话 纪念我的4520G
    Delphi 我的代码之窗体移动
    破文 黑客游戏
    破文 OD常用断点
    Web 简单的开始 – Ajax + XML +DOM
    工具 – XMLSPY 和 UModel 商业版 2010v12.0有注册机
    API InterlockedCompareExchange用法
    软件工程 设计模式学习之策略模式Strategy
  • 原文地址:https://www.cnblogs.com/seaquakear/p/11535649.html
Copyright © 2011-2022 走看看