簡體   English   中英

如何在上傳到服務器 ASP.Net Core 之前從 IFormFile 壓縮圖像

[英]How to compress an image from IFormFile before upload to the server ASP.Net Core

我有一個問題,我正在 net core 中創建一個應用程序來上傳孩子的信息,但是,主要問題是我擁有的所有圖像都來自我的手機,你知道我們談論的是每張圖片 9-15 MB ,所以,我知道我不能告訴用戶“有一個限制”,但是,我認為它沒有用,所以,有一種方法可以減少圖像的大小,從而降低質量嗎?。

這是我的方法

班級

public IFormFile ImageFile { get; set; }

方法

if (vm.ImageFile != null && vm.ImageFile.Length > 0)
{
    var guid = Guid.NewGuid().ToString();
    var file = $"{guid}.jpg";

    path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\\images\\Kids", file);

    using (var stream = new FileStream(path, FileMode.Create))
    {
        //var convertedImage = MagicSolutionGivenByTheAwsomeStackOverFlowCommunity
        await vm.ImageFile.CopyToAsync(stream);
    }

}

布局

<form asp-action="Create" enctype="multipart/form-data">
 <input type="hidden" asp-for="Imagen"/>
  <div class="col-sm-4">
   <label asp-for="Imagen" class="control-label"></label>
   <div>
    <input asp-for="ImageFile" class="form-control filestyle"
           type="file" data-classbutton="btn btn-secondary"
           data-classinput="form-control inline"
           data-icon="&lt;span class='fa fa-upload mr'&gt;&lt;/span&gt;" />
   </div>
  <span asp-validation-for="Imagen" class="text-danger"></span>
 </div>
</form>

對於我的項目,我通常在后端使用這個庫: ImageResizer Here from Nuget: nuget ImageResizer

它對於壓縮和調整服務器端的大小很有用

相反,我在前端的 JS 中使用它: PlUpload

在此示例中,您可以在客戶端Image-Resizing-on-Client-Side 上調整圖像大小,或者您可以使用分塊來加速上傳到客戶端並管理服務器上的文件。

您可以使用ImageSharp調整圖像大小。 我們用它來制作上傳的 IFormFile 的 Thumb 圖像。 首先打開一個讀取流,然后為該流打開一個 ImageSharp 圖像。

using (var stream = file.OpenReadStream())
using (var image = Image.Load(stream))
{
   await ResizeAndUploadImageAsync(image, maxWidth, fileName);
}

之后,您使用 MemoryStream 將調整大小的圖像保存為 PNG,並在我們的示例中將文件上傳到 S3 存儲桶。

private async Task ResizeAndUploadImageAsync(Image<Rgba32> image, int maxWidth, string 
    fileName)
    {    
        using (var writeStream = new MemoryStream())
        {
            if (image.Width > maxWidth)
            {
                var thumbScaleFactor = maxWidth / image.Width;
                image.Mutate(i => i.Resize(maxWidth, image.Height * 
                    thumbScaleFactor));
            }

            image.SaveAsPng(writeStream);
            await storageService.UploadFileAsync(writeStream, fileName);
    }
}

我認為您關注的是一個 JS 庫,它可以像Compressor JS一樣壓縮圖像,也許這個庫可以幫助您解決問題

您無法有意義地壓縮圖像,尤其是 JPEG 圖像。 至少不是可逆的。 如果來自手機相機的圖片為 9-15 MB,則您需要降低分辨率、質量或兩者兼而有之。

您可以在客戶端中使用 JavaScript 執行此操作,您可以在其中調整圖像大小並降低質量,然后上傳修改后的圖像。 這樣做的好處是它還可以節省帶寬(上傳較小的圖像),但缺點是用戶可以根據需要繞過它。

或者您可以在服務器端進行修改,那里有很多托管庫可以這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM