Создать миниатюру, а затем преобразовать в байтовый массив - PullRequest
7 голосов
/ 21 мая 2009

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

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

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

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

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

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

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

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

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

Есть идеи? Спасибо за помощь!

Ответы [ 2 ]

6 голосов
/ 21 мая 2009

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

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

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

Попробуйте:

thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence
1 голос
/ 06 января 2012

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

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
...