C#如何實(shí)現(xiàn)圖片的剪裁并保存
最近需要將一張圖片上傳并按指定位置剪裁,后來(lái)在網(wǎng)上找了一個(gè)剪裁圖片的插件,但是只有前臺(tái)沒(méi)有后端,然后我各種百度,并最終完成,特此寫(xiě)一篇博客略表紀(jì)念。
前臺(tái)我就不說(shuō)了,用的cropper插件,有興趣的自己去百度找找吧。腳本之家 有這個(gè)插件。
下面是代碼:
HttpPostedFile file = context.Request.Files["avatar_file"]; string datasize = context.Request.Params["avatar_data"]; //{"x":30.003846153846148,"y":16.715384615384625,"height":300.8,"width":300.8,"rotate":0} 剪裁之后參數(shù) JavaScriptSerializer jss = new JavaScriptSerializer(); ImgSize imagesize = jss.Deserialize<ImgSize>(datasize); byte[] FileByte = SetFileToByteArray(file);//圖片數(shù)組 string strtExtension = System.IO.Path.GetExtension(file.FileName);//圖片格式 MemoryStream ms1 = new MemoryStream(FileByte); Bitmap sBitmap = (Bitmap)Image.FromStream(ms1); Rectangle section = new Rectangle(new Point(imagesize.ToInt(imagesize.x), imagesize.ToInt(imagesize.y)), new Size(imagesize.ToInt(imagesize.width), imagesize.ToInt(imagesize.height))); Bitmap CroppedImage = MakeThumbnailImage(sBitmap, section.Width, section.Height, section.Width, section.Height, section.X, section.Y);
上面代碼中用到我自己創(chuàng)建了一個(gè)ImgSize類(lèi),代碼如下:
class ImgSize { //{"x":30.003846153846148,"y":16.715384615384625,"height":300.8,"width":300.8,"rotate":0} public double x { get; set; } public double y { get; set; } public double width { get; set; } public double height { get; set; } public int rotate { get; set; } public int ToInt(double doubleValue) { return Convert.ToInt32(doubleValue); } }
上面代碼中使用到的幾個(gè)方法:
文件轉(zhuǎn)化:
/// <summary> /// 將From表單file文件轉(zhuǎn)化為byte數(shù)組 /// </summary> /// <param name="File">from提交文件流</param> /// <returns></returns> private byte[] SetFileToByteArray(HttpPostedFile File) { Stream stream = File.InputStream; byte[] AyyayByte = new byte[File.ContentLength]; stream.Read(AyyayByte, 0, File.ContentLength); stream.Close(); return AyyayByte; }
核心剪裁方法:
/// <summary> /// 裁剪圖片并保存 /// </summary> /// <param name="Image">圖片信息</param> /// <param name="maxWidth">縮略圖寬度</param> /// <param name="maxHeight">縮略圖高度</param> /// <param name="cropWidth">裁剪寬度</param> /// <param name="cropHeight">裁剪高度</param> /// <param name="X">X軸</param> /// <param name="Y">Y軸</param> public static Bitmap MakeThumbnailImage(Image originalImage, int maxWidth, int maxHeight, int cropWidth, int cropHeight, int X, int Y) { Bitmap b = new Bitmap(cropWidth, cropHeight); try { using (Graphics g = Graphics.FromImage(b)) { //清空畫(huà)布并以透明背景色填充 g.Clear(Color.Transparent); //在指定位置并且按指定大小繪制原圖片的指定部分 g.DrawImage(originalImage, new Rectangle(0, 0, cropWidth, cropHeight), X, Y, cropWidth, cropHeight, GraphicsUnit.Pixel); Image displayImage = new Bitmap(b, maxWidth, maxHeight); displayImage.Save("E:\\cutimg.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); Bitmap bit = new Bitmap(b, maxWidth, maxHeight); return bit; } } catch (System.Exception e) { throw e; } finally { originalImage.Dispose(); b.Dispose(); } }
最后的結(jié)果是把存到了E盤(pán)根目錄下面
以上所述是小編給大家介紹的C#如何實(shí)現(xiàn)圖片的剪裁并保存,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的,在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
C#實(shí)現(xiàn)判斷一個(gè)時(shí)間點(diǎn)是否位于給定時(shí)間區(qū)間的方法
這篇文章主要介紹了C#實(shí)現(xiàn)判斷一個(gè)時(shí)間點(diǎn)是否位于給定時(shí)間區(qū)間的方法,涉及C#針對(duì)時(shí)間的轉(zhuǎn)換與判定相關(guān)技巧,需要的朋友可以參考下2015-08-08C#通過(guò)cmd調(diào)用7z軟件實(shí)現(xiàn)壓縮和解壓文件
這篇文章介紹了C#通過(guò)cmd調(diào)用7z軟件實(shí)現(xiàn)壓縮和解壓文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04C#實(shí)現(xiàn)讀取ini配置文件的內(nèi)容
INI就是擴(kuò)展名為"INI"的文件,其實(shí)他本身是個(gè)文本文件,可以用記事本打開(kāi),本文主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)讀取ini配置文件內(nèi)容的方法,需要的小伙伴可以了解下2023-12-12C#中ManualResetEvent實(shí)現(xiàn)線(xiàn)程的暫停與恢復(fù)
本文主要介紹了C#中ManualResetEvent實(shí)現(xiàn)線(xiàn)程的暫停與恢復(fù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C#的通用DbHelper類(lèi)(支持?jǐn)?shù)據(jù)連接池)示例詳解
這篇文章主要介紹了C#的通用DbHelper類(lèi)支持?jǐn)?shù)據(jù)連接池,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03C# 運(yùn)算符 ?、??、?: 各種問(wèn)號(hào)的用法和說(shuō)明
本文介紹C#中三種常見(jiàn)的問(wèn)號(hào)運(yùn)算符的使用方法,簡(jiǎn)單講解給大家,希望對(duì)大家有所幫助。2016-04-04c# 如何實(shí)現(xiàn)不同進(jìn)程之間的通信
這篇文章主要介紹了c# 如何實(shí)現(xiàn)不同進(jìn)程之間的通信,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下2020-11-11C#靜態(tài)構(gòu)造函數(shù)用法實(shí)例分析
這篇文章主要介紹了C#靜態(tài)構(gòu)造函數(shù)用法,以實(shí)例形式較為詳細(xì)的分析了C#靜態(tài)構(gòu)造函數(shù)的用途、實(shí)現(xiàn)方法及使用技巧,需要的朋友可以參考下2015-06-06