C#開發自動照片(圖片)裁剪(縮放)工具

来源:https://www.cnblogs.com/seaquakear/archive/2019/09/17/11535649.html
-Advertisement-
Play Games

1、需求分析 用winform窗體程式,開發一個能夠自動、批量對圖片進行縮放和裁剪的程式。 原本想直接從網上找類型的工具直接用,但是無奈現在網上能找到的工具,要麼不能用,要麼就是很 噁心的下載完後還有一堆插件的,要麼就是我用不來的。 這個程式是我根據個人需求,想要把所有拍好的人像照,直接批處理成1寸 ...


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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • asp.net core 使用 signalR(二) Intro 上次介紹了 asp.net core 中使用 signalR 服務端的開發,這次總結一下web前端如何接入和使用 signalR,本文主要分兩部分,一是直接使用 這個微軟開發好的 signalR 的客戶端,另一部分是使用 h5 原生的 ...
  • 參考並感謝 + 周花卷 "https://www.jianshu.com/p/5afc6bbeb28c" 下載letsencrypt鏡像(不帶tag標簽則表示下載latest版本) 首次部署 續租時 開放80和443埠並立即生效 PS: + 啟動容器之前,需要創建好對應的宿主機的文件目錄,宿主機缺 ...
  • 今天,我們宣佈推出 .NET Core 3.0 Release Candidate 1。就像 Preview 9 一樣,我們專註於打磨 .NET Core 3.0 的最終版本。它現在已經非常非常接近了。我們打算在 9 月 23 日的 .NET Conf 上發佈最終版本。 ...
  • Net Core基於TopShelf程式運行於服務模式 [toc] 1 背景 Net Core的本質是視窗程式(windows下的表現形式是console視窗)。客戶與本公司的產品部經理都反饋如果不小心關閉了視窗,整個程式被關閉,後果可能會很嚴重,故將軟體通過TopShelf做成服務模式,通過cmd ...
  • 最近在項目中需要動態解析json,但解析json的方式有很多,如何合理的解析就是我們需要考慮的問題?比如Newtonsoft.Json.Linq下提供的JToken、JObject等,Newtonsoft.Json下提供的JsonConvert。 我們今天主要介紹不同解析方式適用的場景以及用法: 1 ...
  • 創建一個只讀屬性 ...
  • //需要引用命名空間 using System.Drawing; using System.Drawing.Text; //獲取系統字體方法 public dynamic GetFontNames() { FontFamily[] fontFamilies; InstalledFontCollect... ...
  • 1.下載protoc工具 點擊下載 2.win+r 輸入cmd,進入文件目錄,如圖: 3.輸入命令: protoc.exe --csharp_out=. test.proto 查看目錄已經生成test.cs文件 ps: test.proto對應要生成的proto文件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...