<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .NetCore實現(xiàn)圖片縮放與裁剪 - 基于ImageSharp

          共 3614字,需瀏覽 8分鐘

           ·

          2022-06-20 06:45

          前言

          (突然發(fā)現(xiàn)斷更有段時間了

          最近在做博客的時候,需要實現(xiàn)一個類似Lorempixel、LoremPicsum這樣的隨機圖片功能,圖片有了,還需要一個根據(jù)輸入的寬度高度獲取圖片的功能,由于之前處理圖片時使用到了ImageSharp庫,所以這次我立刻就想到用它。

          分析需求

          圖片庫中的圖片基本都是我之前收集的壁紙什么的,尺寸參差不齊,有橫屏的也有豎屏

          然后包裝成接口只需要輸入寬度和高度,就能隨機選一張圖片然后進行縮放或者裁剪

          我的思路是:

          • 橫屏圖片,將高度調整到與輸入高度一致,寬度按比例調整
          • 豎屏圖片,將寬度調整到與輸入高度一致,高度按比例調整

          然后再選取中間部分進行截取

          當然還有特殊情況,就是輸入的寬度和高度超過圖片原來高度寬度的情況,這個只能破壞圖片原有的比例,強行進行拉伸~

          PS:本來想畫個圖表達一下思路,不過沒找到趁手的畫圖工具(Draw.io:不要看我)

          實現(xiàn)

          首先讀取圖片

          很簡單,傳入圖片路徑即可

          當然也可以用流的方式讀取

          using var image = Image.Load("imagePath");

          然后就是根據(jù)圖片的大小各種情況來進行縮放和裁剪

          在網(wǎng)上查到的很多博客用的代碼都是類似image.Resizeimage.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) / 20, 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");
          }

          后續(xù)在我的StarBlog開發(fā)筆記系列里,接下來會更新~

          參考資料

          • 隨機圖片網(wǎng)站: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


          瀏覽 58
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天狠天天透天干天天怕∴ | 在线一级片免费观看 | 无码一二区三区 | 精品人妻无码一区三区蜜桃 | 一道本无码专区 |