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寸图片的功能。

转载于:https://www.cnblogs.com/seaquakear/p/11535649.html

C#开发自动照片(图片)裁剪(缩放)工具相关推荐

  1. vue图片超出屏幕尺寸自动适应图片比例缩放

    vue图片超出屏幕尺寸自动适应图片比例缩放 <div><el-button class="blue-btn"@click="open"> ...

  2. python图片裁剪软件_python 实现图片裁剪小工具

    实现:tkinter 画布上显示图片,按下鼠标左键并且移动,实现截图 # -*- encoding=utf-8 -*- import os import tkinter as tk from PIL ...

  3. git 裁切_GitHub - taiyang0725/PicCrop: 图片裁剪的工具类,基于uCrop封装,使用十分便捷...

    注: 图片选择/拍照->裁剪->压缩 整个流程的操作已经串起到下面的库中 PicCrop 对ucrop的封装工具类,让其使用更加快捷. 在ucrop 2.2.0(compile 'com. ...

  4. iOS开发 开发笔记,图片裁剪成正方形图片;

    /// 裁剪图片,以宽度为标准,裁剪成正方形图片,size = (width,width) - (UIImage *)cutImageWithImage:(UIImage *)image {if (! ...

  5. php剪裁图片,PHP实现图片裁剪与缩放的几种方法

    图片指定大小然后由php相关函数来实现图片裁剪功能,前段的js效果在这里就不介绍了,大家可以到网上找有很多这类代码,我只整理了php操作部份. 方法一  代码如下 复制代码 图片裁剪缩放函数,支持方位 ...

  6. 如何将图片裁剪成规定尺寸?怎样裁剪多余画面尺寸?

    相信很多小伙伴遇到这种情况,我们有时候用手机拍摄的照片在分享到一些网站平台时,因为图片不符合上传要求的尺寸大小,系统会自动将图片裁剪一部分,比较影响图片的美观.这就需要我们用手机裁剪图片到指定尺寸之后 ...

  7. 【iOS】拍照/相册单选、相册多选、图片浏览、图片裁剪

    有一段时间没有写iOS系列的博客了.最近由于项目的需要,就有封装了一个拍照/相册单选.相册多选.图片浏览.图片裁剪的工具类.在封装这这类是站在巨人的肩膀上做的. 1.ZLPhotoBrowser:ht ...

  8. takephoto 框架_GitHub - Smecking/TakePhoto: 一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库...

    TakePhoto是一款用于在Android设备上获取照片(拍照或从相册.文件中选择).裁剪图片.压缩图片的开源工具库,目前最新版本4.0.2. 3.0以下版本及API说明,详见TakePhoto2. ...

  9. 使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放

    软件准备 Tengine 官网:http://tengine.taobao.org/ $ wget http://tengine.taobao.org/download/tengine-2.2.0.t ...

最新文章

  1. 动力节点Java培训告诉你Java线程的多功能用法
  2. 文巾解题1738. 找出第 K 大的异或坐标值
  3. CodeForces - 803C Maximal GCD(贪心 + 枚举)
  4. 链表应用——多项式相加
  5. Spring 事物传播特性
  6. 嵌套的json ajax,通过jquery或javascript通过AJAX读取嵌套的JSON并输出到表中
  7. nodjs npm 报错:Segmentation fault: 11
  8. js页面自适应屏幕大小_Web页面适配移动端方案研究
  9. windows下eclipse模拟运行apk
  10. 数据结构第三篇——线性表的链式存储之单链表
  11. NB-Iot烟感02:NB-IOT概念和技术特点
  12. UVC系列3-研究UVC控制协议
  13. 如何写H5/web前端工程简历中的项目经验
  14. 天下3 最多的服务器,《天下3》服务器合并规则
  15. windows 修改密码 在计算机管理中,管理员如何在Windows 10中更改其他用户的密码...
  16. 菜鸟蜕变成高手之菜鸟血淋淋的总结
  17. 核心频率个加速频率_【硬件资讯】AMD:锐龙3系列加速频率再提2%
  18. 基于Hough变换的人眼虹膜定位
  19. 卡拉兹(Callatz)猜想
  20. Yield Guild Games 和 MOBLAND 达成合作

热门文章

  1. mysql skewed_Hive分区字段含中文报错问题解决方案
  2. 保姆级教程!最全苹果相机使用技巧(系列一)
  3. 计算机网络网络层——学习笔记
  4. 打印服务器的打印机显示端口错误,使用标准 TCP/IP 端口时,2335DN 打印机可能会错误地显示为离线...
  5. 阿里云 windows 服务器卸载阿里云盾
  6. Python 中 ‘unicodeescape’ codec can’t decode bytes in position XXX: trun错误解决方案
  7. 高职对口计算机试题ppt,高职单招中职计算机练习卷和答案.doc
  8. laya-oppo 广告问题ad had showd, please reload
  9. 实验11-1-4 计算最长的字符串长度-自己的平地摔
  10. php choose handler,Guzzle 源码分析