Pregunta

Estoy teniendo una diablos de un tiempo con la creación de miniaturas y luego convertirlos en una matriz de bytes. He probado tres métodos, y las 3 veces que aparece un error.

El primero fue el uso de Bitmap.GetThumbnailImage, que he utilizado en el pasado y luego guardada directamente en Response.OutputStream

El segundo estaba usando System.Drawing.Graphics con DrawImage (). Sigue sin ir.

El tercero era sólo para crear un nuevo mapa de bits, pasar en el viejo mapa de bits, y establecer el nuevo tamaño. Mismo error.

  

El valor no puede ser nulo.
  Nombre de parámetro: codificador
  Descripción: Una excepción no controlada durante la ejecución de la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.
  Detalles de la excepción: System.ArgumentNullException: Valor no puede ser nulo
.   Nombre de parámetro: codificador
  Origen del error:
  Una excepción no controlada se generó durante la ejecución de la solicitud Web actual. La información sobre el origen y la ubicación de la excepción pueden identificarse utilizando la pila de excepción traza a continuación.
  Seguimiento de la pila:
  [ArgumentNullException: Valor no puede ser nulo
.   Nombre de parámetro: codificador]
     System.Drawing.Image.Save (flujo de corriente, codificador ImageCodecInfo, EncoderParameters encoderParams) 615244

Aquí está el código de mi método. Tal vez alguien va a ver lo que estoy haciendo mal. En caso de que no está seguro acerca de GetThumbSize, es simplemente un método que toma en el tamaño de la imagen y el tamaño máximo del pulgar y luego calcula un tamaño real para preservar la relación 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 línea está lanzando el error:

thumb.Save(outStream, thumb.RawFormat);

¿Alguna idea? Gracias por la ayuda!

¿Fue útil?

Solución

Creo que el problema puede ser la codificación de la imagen original. IIRC, Guardar (corriente, formato) se traduce en una llamada a Save (arroyo, codificador, params), con el codificador está tomada desde el formato; que en su caso es el formato original de la imagen.

De acuerdo con el Contenido de la comunidad para el Guardar método, algunos formatos no se traducirá también en un codificador adecuado.

Yo sugeriría que especifique el codificador sí mismo, utilizando un formato estándar como PNG.

Probar:

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

Otros consejos

Si lo que estamos tratando de hacer es guardarlo en un formato Raw puede probar la siguiente, como en mi caso funciona cuando el formato de la imagen original es uno admitido:

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top