C#圖片處理如何生成縮略圖的實(shí)現(xiàn)
縮略圖通常是將圖片內(nèi)容進(jìn)行一定的縮小展現(xiàn),或裁剪展現(xiàn),主要有兩個(gè)目的,一是提供一定的預(yù)覽功能,二是節(jié)省屏幕展示空間、節(jié)省流量。
在網(wǎng)站中我們通常運(yùn)用在商品的列表,比如商城、圖書、新聞等等列表的圖片。在C#中我們?nèi)绾紊煽s略圖呢,也就是縮小圖片,下面我們來(lái)看一看如何縮小圖片。
其中方法參數(shù)如下:
- originalImagePath:源圖路徑(物理路徑)
- thumbnailPath:縮略圖路徑(物理路徑)
- width:生成縮略圖寬度
- height:生成縮略圖高度
- mode:生成縮略圖的模式
代碼如下
public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, ThumbnailMode mode) { System.Drawing.Image img_OriginalImage = null; ImageFormat tFormat = null; try { img_OriginalImage = (Bitmap)System.Drawing.Image.FromFile(originalImagePath); tFormat = img_OriginalImage.RawFormat; } catch (Exception ex) { if (img_OriginalImage != null) { img_OriginalImage.Dispose(); } throw new Exception("壓縮圖片:" + originalImagePath + "失?。r\n" + ex.Message); } int i_ToWidth = width; int i_ToHeight = height; int x = 0; int y = 0; int i_OriginalWidth = img_OriginalImage.Width; int i_OriginalHeight = img_OriginalImage.Height; switch (mode) { case ThumbnailMode.Width: i_ToHeight = img_OriginalImage.Height * width / img_OriginalImage.Width; break; case ThumbnailMode.Height: i_ToWidth = img_OriginalImage.Width * height / img_OriginalImage.Height; break; case ThumbnailMode.Cut: if ((double)img_OriginalImage.Width / (double)img_OriginalImage.Height > (double)i_ToWidth / (double)i_ToHeight) { i_OriginalHeight = img_OriginalImage.Height; i_OriginalWidth = img_OriginalImage.Height * i_ToWidth / i_ToHeight; y = 0; x = (img_OriginalImage.Width - i_OriginalWidth) / 2; } else { i_OriginalWidth = img_OriginalImage.Width; i_OriginalHeight = img_OriginalImage.Width * height / i_ToWidth; x = 0; y = (img_OriginalImage.Height - i_OriginalHeight) / 2; } break; default: break; } //新建一個(gè)BMP圖片 System.Drawing.Image img_BitMap = new System.Drawing.Bitmap(i_ToWidth, i_ToHeight); //新建一個(gè)畫板 System.Drawing.Graphics gp = Graphics.FromImage(img_BitMap); //設(shè)置高質(zhì)量插值法 gp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //設(shè)置高質(zhì)量、低速度呈現(xiàn)平滑程度 gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; gp.CompositingQuality = CompositingQuality.HighQuality; //清空畫布并以透明背景色填充 gp.Clear(Color.Transparent); //指定位置并按大小繪制原圖片的指定部分 gp.DrawImage(img_OriginalImage, new Rectangle(0, 0, i_ToWidth, i_ToHeight), new Rectangle(x, y, i_OriginalWidth, i_OriginalHeight), GraphicsUnit.Pixel); try { EncoderParameters ep = new EncoderParameters(); long[] qy = new long[1]; qy[0] = 100;//設(shè)置壓縮的比例1-100 EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy); ep.Param[0] = eParam; ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo jpegICIinfo = null; for (int i = 0; i < arrayICI.Length; i++) { if (arrayICI[i].FormatDescription.Equals("JPEG")) { jpegICIinfo = arrayICI[i]; break; } } if (jpegICIinfo != null && Equals(tFormat, ImageFormat.Jpeg)) { //以JPG格式保存圖片 img_BitMap.Save(thumbnailPath, jpegICIinfo, ep); //Const.iSuccessCount++; } else { img_BitMap.Save(thumbnailPath, tFormat); //Const.iSuccessCount++; } } catch (Exception ex) { Console.WriteLine("復(fù)制圖片:" + originalImagePath + "失??!\r\n" + ex.Message + ex.StackTrace); } finally { if (img_OriginalImage != null) { img_OriginalImage.Dispose(); } if (img_BitMap != null) { img_BitMap.Dispose(); } if (gp != null) { gp.Dispose(); } //GC.Collect(); } }
public enum ThumbnailMode { /// <summary> /// 指定寬度,高度按照比例縮放 /// </summary> Width = 0, /// <summary> /// 指定高度,寬度按照比例縮放 /// </summary> Height = 1, /// <summary> /// 按照指定的高度和寬度剪裁 /// </summary> Cut = 2, /// <summary> /// 指定寬度,高度按照比例縮放 /// </summary> None = 3 }
在該方法中我們首先使用(Bitmap)System.Drawing.Image.FromFile將文件加載到bitmap。
根據(jù)mode傳入的壓縮模式進(jìn)行原始繪圖區(qū)域的計(jì)算。
將計(jì)算出的區(qū)域繪制到新的BitMap。
將繪制的BitMap圖片保存到指定文件。
通過(guò)如上的幾步就完成了縮略圖的生成。
到此這篇關(guān)于C#圖片處理如何生成縮略圖的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# 生成縮略圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.Net WInform開發(fā)筆記(五)關(guān)于事件Event
我前面幾篇博客中提到過(guò).net中的事件與Windows事件的區(qū)別,本文討論的是前者,也就是我們代碼中經(jīng)常用到的Event,感興趣的朋友可以了解下2013-01-01C#判斷語(yǔ)句的表達(dá)式樹實(shí)現(xiàn)
這篇文章介紹了C#判斷語(yǔ)句的表達(dá)式樹實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01c#如何利用定時(shí)器自動(dòng)備份數(shù)據(jù)庫(kù)詳解
在開發(fā)過(guò)程當(dāng)中,你一定遇到文件損壞活或丟失的煩惱,而每天備份又很麻煩,你只要設(shè)置每天備份的時(shí)間,并將程序加入啟動(dòng)項(xiàng)中,就可以自動(dòng)完成備份,這篇文章主要給大家介紹了關(guān)于c#如何利用定時(shí)器自動(dòng)備份數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2021-10-10C#基于JsonConvert解析Json數(shù)據(jù)的方法實(shí)例
最近初接觸C#語(yǔ)言,發(fā)現(xiàn)JSON解析這塊和JAVA差異過(guò)大,下面這篇文章主要給大家介紹了關(guān)于C#基于JsonConvert解析Json數(shù)據(jù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04C# 實(shí)現(xiàn)基于ADO.NET框架的DBHelper工具類(簡(jiǎn)化數(shù)據(jù)庫(kù)操作)
ADO.NET是.NET框架中用于與數(shù)據(jù)庫(kù)交互的核心組件,提供了一套用于連接數(shù)據(jù)庫(kù)、執(zhí)行SQL查詢、插入、更新和刪除數(shù)據(jù)的類庫(kù),包括SqlConnection、SqlCommand、SqlDataReader等,本文介紹如何使用DBHelper類封裝數(shù)據(jù)庫(kù)操作,以提高代碼的可維護(hù)性和復(fù)用性,感興趣的朋友一起看看吧2024-08-08Winform?控件優(yōu)化LayeredWindow無(wú)鋸齒圓角窗體
這篇文章主要為大家介紹了Winform?控件優(yōu)化LayeredWindow實(shí)現(xiàn)無(wú)鋸齒圓角窗體示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09C#+無(wú)unsafe的非托管大數(shù)組示例詳解(large unmanaged array in c# without ‘u
這篇文章主要給大家介紹了關(guān)于C#+無(wú)unsafe的非托管大數(shù)組(large unmanaged array in c# without 'unsafe' keyword)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01