Как создать эскиз изображения в ядре .NET? Использование IFormFile

Мне нужно создать эскиз изображения из исходного изображения и сохранить оба изображения в локальной папке. Я использую элемент управления html-файлом для загрузки изображения

<input type = "file" class = "form-control" asp-for = "ImageName" name = "ProductImage" id = "ProductImage">

И к моменту отправки формы я получаю его как IFromFile.

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Guid id, ProductDTO product, IFormFile 
    ProductImage)
{
    if (ModelState.IsValid)
    {
        byte[] fileBytes;
        using (var ms = new MemoryStream())
        {
            ProductImage.CopyTo(ms);
            fileBytes = ms.ToArray();
        }
    }
}

Я преобразовал его в byte [] и передал его одному из моих методов сохранения. Здесь мне нужна миниатюра конкретного изображения

Что я пробовал до сих пор, так это добавить package Install-Package System.Drawing.Common -Version 4.5.1

И создал метод конвертации изображения

public string ErrMessage;

public bool ThumbnailCallback()
{
    return false;
}
public Image GetReducedImage(int Width, int Height, Image ResourceImage)
{
    try
    {
        Image ReducedImage;

        Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

        ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);

        return ReducedImage;
    }
    catch (Exception e)
    {
        ErrMessage = e.Message;
        return null;
    }
}

Но метод, который я создал, принимает тип Image. Так что немного запутался здесь, не уверен, как мы можем сделать это с byte[]. Также я не получаю локальный путь к изображению от IFileForm, поэтому я тоже не могу указать путь напрямую.

Может ли кто-нибудь помочь мне решить эту проблему?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
16
0
12 695
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец получил ответ

Установлен пакет System.Drawing.Common -Version 4.5.1

Откройте диспетчер пакетов и запустите приведенный ниже код для установки пакета.

Install-Package System.Drawing.Common -Version 5.0.2

Затем используйте приведенный ниже код:

using System.Drawing;

var stream = ProductImage.OpenReadStream();

var newImage = GetReducedImage(32,32,stream);
newImage.Save("path+filename");

public Image GetReducedImage(int width, int height, Stream resourceImage)
{
    try
    {
        var image = Image.FromStream(resourceImage);
        var thumb = image.GetThumbnailImage(width, height, () => false, IntPtr.Zero);

        return thumb;
    }
    catch (Exception e)
    {
        return null;
    }
}

Копирование в новый поток памяти неэффективно. Измените свой метод, чтобы просто принять базовый тип Stream и напрямую передать свой файловый поток.

Chris Pratt 07.01.2019 16:25

@ChrisPratt Отредактировал ответ, не могли бы вы взглянуть на него и сообщить мне, нужны ли еще какие-либо изменения?

Arunprasanth K V 07.01.2019 17:08

Вы должны заключить OpenReadStream() в блок using.

Chris Pratt 07.01.2019 17:45

Что, если я хочу просто передать только высоту или ширину и сохранить соотношение сторон изображения?

tnk479 13.07.2020 21:06

Помните, что в Linux эта библиотека использует libgdiplus. И пользователь может создать файл, который вызовет использование памяти exterme на вашем сервере (например, tiff с 1000 страницами, который будет всего 100 КБ)

norekhov 09.10.2020 11:23

Другие вопросы по теме

Выделение резкой области из размытого фона на одном изображении с использованием python и opencv
Другая кодировка base64 для одного и того же изображения
Распознавание прямоугольников в изображениях шаблонов
Фильтр LoG на изображении в градациях серого, сохраненном как двоичный файл
Tabula Py не определяет таблицы в PDF
Как я могу объединить три 2D-массива, которые содержат значения оттенка, насыщенности и интенсивности в своих соответствующих массивах, и отобразить их как изображение?
Выявление мелких объектов на больших зашумленных изображениях - opencv
Как использовать мой видеопоток DroidCam (через USB) в Python для обработки изображений с помощью OpenCV?
Создание пакетов в массиве, содержащем изображения
Как выбрать несколько координат текста, чтобы они не перекрывались с несколькими координатами изображения в одном фоновом изображении с использованием Python?