Мне нужно создать эскиз изображения из исходного изображения и сохранить оба изображения в локальной папке. Я использую элемент управления 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
, поэтому я тоже не могу указать путь напрямую.
Может ли кто-нибудь помочь мне решить эту проблему?
Наконец получил ответ
Установлен пакет 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;
}
}
@ChrisPratt Отредактировал ответ, не могли бы вы взглянуть на него и сообщить мне, нужны ли еще какие-либо изменения?
Вы должны заключить OpenReadStream()
в блок using
.
Что, если я хочу просто передать только высоту или ширину и сохранить соотношение сторон изображения?
Помните, что в Linux эта библиотека использует libgdiplus. И пользователь может создать файл, который вызовет использование памяти exterme на вашем сервере (например, tiff с 1000 страницами, который будет всего 100 КБ)
Копирование в новый поток памяти неэффективно. Измените свой метод, чтобы просто принять базовый тип
Stream
и напрямую передать свой файловый поток.