Criar uma miniatura e, em seguida, converter a matriz de bytes
-
23-08-2019 - |
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!
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);
}