Pracuję nad projektem ASP.NET Core, jedną z głównych funkcji, które muszę wypracować, jest umożliwienie użytkownikom przesyłania obrazu, który jest automatycznie przeskalowywany i konwertowany na „jpg”. Oznacza to, że użytkownik może przesłać obraz w dowolnym rozmiarze i formacie, a jego rozmiar zostanie automatycznie zmieniony na 250px szerokości przy zachowaniu proporcji.

W przeszłości używałem 'ImageResizer' w moich aplikacjach MVC, ale przeczytałem, że nie jest kompatybilny z .NET Core. Dalsze poszukiwania ujawniły, że „ImageSharp" jest dostępny z SixLabors.

Zacząłem z nim pracować, ale staram się nadać temu sens mojej aplikacji. Mam prosty formularz z okienkiem do przesyłania plików. Po przesłaniu formularza wszystkie dane są przekazywane do metody Create poniżej. Po utworzeniu rekordu identyfikator jest następnie pobierany w celu wypełnienia obrazu we właściwej lokalizacji na platformie Azure. Ta część działa dobrze, część, z którą potrzebuję pomocy, to przetwarzanie obrazu w sposób, o którym wspomniałem powyżej.

Co muszę osiągnąć

  • Zmień rozmiar obrazu na szerokość 250 pikseli
  • Zachowaj proporcje
  • Konwertuj na JPG
  • Przejdź do platformy Azure w celu zapisania.

Metoda mojego kontrolera

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Car car) 
{
    if (ModelState.IsValid)
    {
        //Create the record
        _carService.InsertCar(car);

        //Grab the newly created record ID
        int id = car.Id;

        if (car.File !=null)
        {
            //Perpare a category for the structure
            string artifact = "car";

            //Get file name, mime type and data structure
            var fileName = Path.GetFileName(car.File.FileName);
            string mimeType = car.File.ContentType;
            byte[] fileData = new byte[car.File.Length];

            //For saving to memorystream, ImageSharp
            var outStream = new MemoryStream();

            //Process Image
            using (Image<Rgba32> image = Image.Load(fileData))
            {
                 //Not sure how to process at this stage.     
            }

            //Create instance of the blob storage service
            BlobStorageService objBlobService = new BlobStorageService();

            //Prepare upload path and pass arguemnts to the service.
            car.ImagePath = objBlobService.UploadFileToBlob(car.File.FileName, fileData, mimeType, id, artifact);
            }
            //Redirect to index
            return RedirectToAction(nameof(Index));
        }
            else 
            {
                return View(vessel);
            }
        }

Czy ktoś może pomóc w prawidłowym przetworzeniu obrazu?

0
Yanayaya 17 grudzień 2019, 12:29
Przykład w pliku Readme repozytorium. github.com/sixLabors/ImageSharp#api tutaj znajdziesz dokumentację API docs.sixlabors.com/api/index.html
 – 
James South
21 grudzień 2019, 16:00

1 odpowiedź

Wystarczy użyć zawartości outStream i metody UploadStream z pakietu nuget Microsoft.Azure.Storage.Blob:

CloudBlobClient blobClient = GetBlobClient(storageAccountName);
var container = blobClient.GetContainerReference(containerName);

var blob = container.GetBlockBlobReference("sample.png");

blob.UploadFromStream(outStream);
-1
Thiago Custodio 17 grudzień 2019, 17:55