.Net?Core基于ImageSharp實(shí)現(xiàn)圖片縮放與裁剪
前言
最近在做博客的時(shí)候,需要實(shí)現(xiàn)一個(gè)類似Lorempixel、LoremPicsum這樣的隨機(jī)圖片功能,圖片有了,還需要一個(gè)根據(jù)輸入的寬度高度獲取圖片的功能,由于之前處理圖片時(shí)使用到了ImageSharp庫(kù),所以這次我立刻就想到用它。
分析需求
圖片庫(kù)中的圖片基本都是我之前收集的壁紙什么的,尺寸參差不齊,有橫屏的也有豎屏
然后包裝成接口只需要輸入寬度和高度,就能隨機(jī)選一張圖片然后進(jìn)行縮放或者裁剪
我的思路是:
- 橫屏圖片,將高度調(diào)整到與輸入高度一致,寬度按比例調(diào)整
- 豎屏圖片,將寬度調(diào)整到與輸入高度一致,高度按比例調(diào)整
然后再選取中間部分進(jìn)行截取
當(dāng)然還有特殊情況,就是輸入的寬度和高度超過圖片原來高度寬度的情況,這個(gè)只能破壞圖片原有的比例,強(qiáng)行進(jìn)行拉伸~
PS:本來想畫個(gè)圖表達(dá)一下思路,不過沒找到趁手的畫圖工具(Draw.io:不要看我)
實(shí)現(xiàn)
首先讀取圖片
很簡(jiǎn)單,傳入圖片路徑即可
當(dāng)然也可以用流的方式讀取
using var image = Image.Load("imagePath");
然后就是根據(jù)圖片的大小各種情況來進(jìn)行縮放和裁剪
在網(wǎng)上查到的很多博客用的代碼都是類似image.Resize
和image.Crop
之類的,但這是舊版的ImageSharp代碼
新版全都放在image.Mutate
里,要什么操作再傳入lambda表達(dá)式
(有點(diǎn)像ORM的操作)
比如縮放就是這樣
image.Mutate(a => a.Resize(newWidth, newHeight));
裁剪就是這樣
image.Mutate(a => a.Crop(new Rectangle(x, y, width, height)));
完整代碼
功能很簡(jiǎn)單,完整代碼在此
void GetImage(string imagePath, int width, int height) { using var image = Image.Load(imagePath); Rectangle cropRect; int newWidth; int newHeight; // 橫屏圖片 if (image.Width > image.Height) { if (width > image.Width) { newWidth = width; newHeight = height; } else { newHeight = height; newWidth = image.Width / image.Height * newHeight; } cropRect = new Rectangle((newWidth - width) / 2, 0, width, height); } // 豎屏圖片 else { if (height > image.Height) { newWidth = width; newHeight = height; } else { newWidth = width; newHeight = newWidth * image.Height / image.Width; } cropRect = new Rectangle(0, (newHeight - height) / 2, width, height); } image.Mutate(a => a.Resize(newWidth, newHeight)); image.Mutate(a => a.Crop(cropRect)); image.SaveAsPng("output.png"); }
參考資料
- 隨機(jī)圖片網(wǎng)站:https://picsum.photos/
- .Net Core如何使用ImageSharp進(jìn)行圖片的生成:http://chabaoo.cn/article/251917.htm
- https://stackoverflow.com/questions/63639644/how-load-an-image-from-disk-and-save-to-a-stream-using-imagesharp-while-preservi
到此這篇關(guān)于.Net Core基于ImageSharp實(shí)現(xiàn)圖片縮放與裁剪的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.net實(shí)現(xiàn)微信公眾賬號(hào)接口開發(fā)實(shí)例代碼
這篇文章主要介紹了.net實(shí)現(xiàn)微信公眾賬號(hào)接口開發(fā)實(shí)例代碼,有需要的朋友可以參考一下2013-12-12asp.net 刪除,更新數(shù)據(jù)庫(kù)方法
asp.net 刪除,更新數(shù)據(jù)庫(kù)方法2009-07-07SQL Server 2008 R2:error 26 開啟遠(yuǎn)程連接詳解
本篇文章小編為大家介紹,SQL Server 2008 R2:error 26 開啟遠(yuǎn)程連接詳解。需要的朋友參考下2013-04-04ASP.NET Core使用微軟官方類庫(kù)實(shí)現(xiàn)漢字轉(zhuǎn)拼音
這篇文章主要為大家詳細(xì)介紹了ASP.NET Core使用微軟官方類庫(kù)實(shí)現(xiàn)漢字轉(zhuǎn)拼音,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05.NET?Core實(shí)現(xiàn)企業(yè)微信消息推送
這篇文章介紹了.NET?Core實(shí)現(xiàn)企業(yè)微信消息推送的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06asp.net SharpZipLib的壓縮與解壓?jiǎn)栴}
關(guān)于SharpZipLib的壓縮與解壓縮的實(shí)現(xiàn)代碼,網(wǎng)絡(luò)上有一堆,千遍一律,連注釋也一模一樣,一模一樣的文章拷來拷去??2009-11-11