前言
(突然發現斷更有段時間了
最近在做博客的時候,需要實現一個類似Lorempixel、LoremPicsum這樣的隨機圖片功能,圖片有了,還需要一個根據輸入的寬度高度獲取圖片的功能,由于之前處理圖片時使用到了ImageSharp庫,所以這次我立刻就想到用它。
分析需求
圖片庫中的圖片基本都是我之前收集的壁紙什么的,尺寸參差不齊,有橫屏的也有豎屏
然后包裝成接口只需要輸入寬度和高度,就能隨機選一張圖片然后進行縮放或者裁剪
我的思路是:
橫屏圖片,將高度調整到與輸入高度一致,寬度按比例調整
豎屏圖片,將寬度調整到與輸入高度一致,高度按比例調整
然后再選取中間部分進行截取
當然還有特殊情況,就是輸入的寬度和高度超過圖片原來高度寬度的情況,這個只能破壞圖片原有的比例,強行進行拉伸~
PS:本來想畫個圖表達一下思路,不過沒找到趁手的畫圖工具(Draw.io:不要看我)
實現
首先讀取圖片
很簡單,傳入圖片路徑即可
當然也可以用流的方式讀取
using?var?image?=?Image.Load("imagePath");
然后就是根據圖片的大小各種情況來進行縮放和裁剪
在網上查到的很多博客用的代碼都是類似image.Resize
和image.Crop
之類的,但這是舊版的ImageSharp代碼
新版全都放在image.Mutate
里,要什么操作再傳入lambda表達式
(有點像ORM的操作)
比如縮放就是這樣
image.Mutate(a?=>?a.Resize(newWidth,?newHeight));
裁剪就是這樣
image.Mutate(a?=>?a.Crop(new?Rectangle(x,?y,?width,?height)));
完整代碼
功能很簡單,完整代碼在此
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");
}
后續在我的StarBlog開發筆記系列里,接下來會更新~
參考資料
隨機圖片網站:https://picsum.photos/
.NetCore如何使用ImageSharp進行圖片的生成:https://www.cnblogs.com/niwan/p/11126239.html
https://stackoverflow.com/questions/63639644/how-load-an-image-from-disk-and-save-to-a-stream-using-imagesharp-while-preservi