前言
(突然發現斷更有段時間了
最近在做部落格的時候,需要實現一個類似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開發筆記系列裡,接下來會更新~