Создайте миниатюру, а затем преобразуйте ее в байтовый массив.

StackOverflow https://stackoverflow.com/questions/894098

Вопрос

У меня уйма времени на создание миниатюр и их последующее преобразование в массив байтов.Я попробовал три метода, и все три раза получаю ошибку.

Первым был использование 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top