Создайте миниатюру, а затем преобразуйте ее в байтовый массив.
-
23-08-2019 - |
Вопрос
У меня уйма времени на создание миниатюр и их последующее преобразование в массив байтов.Я попробовал три метода, и все три раза получаю ошибку.
Первым был использование Bitmap.GetThumbnailImage, который я использовал раньше, а затем сохранял непосредственно в Response.OutputStream.
Второй использовал System.Drawing.Graphics с DrawImage().Все равно не идти.
Третий заключался в том, чтобы просто создать новое растровое изображение, передать старое растровое изображение и установить новый размер.Та же ошибка.
Значение не может быть нулевым.
Имя параметра:кодер
Описание:Во время выполнения текущего веб-запроса произошло необработанное исключение.Просмотрите трассировку стека, чтобы получить дополнительную информацию об ошибке и ее источнике в коде.
Подробности исключения:System.ArgumentNullException:Значение не может быть нулевым.
Имя параметра:кодер
Ошибка источника:
Во время выполнения текущего веб-запроса было создано необработанное исключение.Информацию о происхождении и местоположении исключения можно определить с помощью трассировки стека исключений ниже.
Трассировки стека:
[АргументНуллИсключение:Значение не может быть нулевым.
Имя параметра:кодер]
System.Drawing.Image.Save(поток потока, кодировщик ImageCodecInfo, EncoderParameters encoderParams) +615244
Вот код моего метода.Может кто-то увидит, что я делаю не так.Если вы не уверены в GetThumbSize, это просто метод, который принимает размер изображения и максимальный размер большого пальца, а затем вычисляет фактический размер для сохранения соотношения сторон.
public static System.Drawing.Image.GetThumbnailImageAbort thumbnailCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
public static bool ThumbnailCallback()
{
return false;
}
/// <summary>
///
/// </summary>
/// <param name="image"></param>
/// <param name="size"></param>
/// <remarks>
/// This method will throw a AccessViolationException when the machine OS running the server code is windows 7.
/// </remarks>
/// <returns></returns>
public static byte[] CreateThumbnail(byte[] imageData, Size size)
{
using (MemoryStream inStream = new MemoryStream())
{
inStream.Write(imageData, 0, imageData.Length);
using (System.Drawing.Image image = Bitmap.FromStream(inStream))
{
Size thumbSize = GetThumbSize(new Size(image.Width, image.Height), size);
//do not make image bigger
if (thumbSize.Equals(image.Size) || (image.Width < size.Width || image.Height < size.Height))
{
//if no shrinking is ocurring, return the original bytes
return imageData;
}
else
{
using (System.Drawing.Image thumb = image.GetThumbnailImage(thumbSize.Width, thumbSize.Height, thumbnailCallback, IntPtr.Zero))
{
using (MemoryStream outStream = new MemoryStream())
{
thumb.Save(outStream, thumb.RawFormat);
return outStream.ToArray();
}
}
}
}
}
}
Эта строка выдает ошибку:
thumb.Save(outStream, thumb.RawFormat);
Есть идеи?Спасибо за помощь!
Решение
Я думаю, проблема может быть в кодировке исходного изображения.IIRC, Save(stream, format) приводит к вызову Save(stream, encoder, params), при этом кодировщик берется из формата;что в вашем случае является исходным форматом изображения.
Согласно Содержимому сообщества для Сохранить метод, некоторые форматы не будут хорошо транслироваться в соответствующий кодировщик.
Я бы посоветовал вам указать кодировщик самостоятельно, используя какой-нибудь стандартный формат, например PNG.
Пытаться:
thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence
Другие советы
Если вы пытаетесь сохранить его в формате Raw, вы можете попробовать следующее, как в моем случае это работает, когда исходный формат изображения поддерживается:
try
{
thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
thumb.Save(outStream, ImageFormat.Png);
}