Pergunta

Eu estou tendo um pedaço de um tempo com a criação de miniaturas e, em seguida, convertê-los em um array de bytes. Eu tentei três métodos, e todos os 3 vezes eu recebo um erro.

O primeiro estava usando Bitmap.GetThumbnailImage, que eu usei no passado e, em seguida, salvo diretamente em Response.OutputStream

O segundo foi usando System.Drawing.Graphics com DrawImage (). Ainda não ir.

O terceiro foi apenas para criar um novo bitmap, passar no antigo bitmap e definir o novo tamanho. Mesmo erro.

O valor não pode ser nulo.
Nome do parâmetro: codificador
Descrição: Uma exceção não tratada ocorreu durante a execução da solicitação da web atual. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.
Exceção detalhes: System.ArgumentNullException:. O valor não pode ser nulo
Nome do parâmetro: codificador
Origem do erro:
Uma exceção não tratada foi gerada durante a execução da solicitação da web atual. Informações sobre a origem e ao local da exceção podem ser identificadas usando o rastreamento de pilha de exceção abaixo.
Rastreamento de pilha:
[ArgumentNullException: valor não pode ser nulo
. Nome do parâmetro: codificador]
System.Drawing.Image.Save (stream Stream, codificador ImageCodecInfo, EncoderParameters encoderParams) 615.244

Aqui está o código para o meu método. Talvez alguém vai ver o que estou fazendo de errado. No caso de você não tem certeza sobre GetThumbSize, é simplesmente um método que leva no tamanho da imagem eo tamanho máximo polegar e, em seguida, calcula um tamanho real para preservar a relação de aspecto.

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();
                        }
                    }
                }
            }
        }

    }

Esta linha está jogando o erro:

thumb.Save(outStream, thumb.RawFormat);

Todas as idéias? Obrigado pela ajuda!

Foi útil?

Solução

Eu acho que o problema pode ser a codificação do imagem original. IIRC, Save (stream, formato) resulta em uma chamada para Save (stream, codificador, params), com o codificador a ser tomadas a partir do formato; que no seu caso é o formato original da imagem.

De acordo com o Conteúdo da Comunidade para o método Save , alguns formatos não vai traduzir bem em um codificador apropriado.

Eu sugiro que você especificar o codificador mesmo, usando algum formato padrão como PNG.

Tente:

thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence

Outras dicas

Se o que você está tentando fazer é salvá-lo em um formato Raw você pode tentar o seguinte, como no meu caso ele funciona quando o formato de imagem original é um suportado:

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top