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

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

Первым было использование Bitmap.GetThumbnailImage, которое я использовал в прошлом, а затем сохранял непосредственно в Response.OutputStream.

Второй использовал System.Drawing.Graphics с DrawImage(). Все еще не идет.

Третьим было просто создать новое растровое изображение, передать старое растровое изображение и установить новый размер. Та же ошибка.

Значение не может быть нулевым.
Имя параметра: encoder

Описание: При выполнении текущего веб-запроса возникло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.ArgumentNullException: значение не может быть нулевым.
Имя параметра: encoder

Ошибка источника:
Во время выполнения текущего веб-запроса возникло необработанное исключение. . Информацию о происхождении и расположении исключения можно определить с помощью приведенной ниже трассировки стека исключений.

Трассировка стека:
[ArgumentNullException: значение не может быть нулевым.
Имя параметра: encoder]
System.Drawing.Image.Save(Stream stream, кодировщик 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);

Любые идеи? Спасибо за помощь!


person Josh    schedule 21.05.2009    source источник
comment
Эта проблема в Microsoft Connect: connect.microsoft.com/VisualStudio/feedback/   -  person Mauricio Scheffer    schedule 14.09.2009


Ответы (2)


Я думаю, что проблема может быть в кодировке исходного изображения. IIRC, Сохранить (поток, формат) приводит к вызову Сохранить (поток, кодировщик, параметры), при этом кодировщик берется из формата; который в вашем случае является исходным форматом изображения.

Согласно материалам сообщества для метода сохранения, некоторые форматы не будут переводиться. хорошо в соответствующий кодировщик.

Я бы посоветовал вам указать кодировщик самостоятельно, используя какой-либо стандартный формат, например PNG.

Пытаться:

thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence
person Randolpho    schedule 21.05.2009
comment
Ваше предложение побудило меня попробовать кое-что. Я только что написал метод для преобразования ImageFormat в mimetype. Я пропустил формат исходного изображения через это, и он вернул изображение/gif, что и ожидалось, потому что расширение файла .gif. Затем я заменил оскорбительный пример на: thumb.Save(outStream, image.RawFormat); и это работает. Спасибо за помощь. - person Josh; 21.05.2009

Если вы пытаетесь сохранить его в формате Raw, вы можете попробовать следующее, так как в моем случае это работает, когда исходный формат изображения поддерживается:

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
person Jaime Botero    schedule 05.01.2012