Domanda

Sto avendo un diavolo di un tempo con la creazione di miniature e poi convertirli in un array di byte. Ho provato tre metodi, e tutte le 3 volte ottengo un errore.

Il primo è stato con Bitmap.GetThumbnailImage, che ho usato in passato e poi salvati direttamente in Response.OutputStream

Il secondo stava usando System.Drawing.Graphics con DrawImage (). Ancora non va.

Il terzo era solo per creare una nuova bitmap, passare nel vecchio bitmap e impostare la nuova dimensione. Stesso errore.

  

Il valore non può essere nullo.
  Nome del parametro: encoder
  Descrizione: Un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Si prega di rivedere l'analisi dello stack per ulteriori informazioni sull'errore e dove ha avuto origine nel codice.
  Dettagli eccezione: System.ArgumentNullException: Il valore non può essere null
.   Nome del parametro: encoder
  Errore Origine:
  Un'eccezione non gestita veniva generata durante l'esecuzione della richiesta Web corrente. Per informazioni sull'origine e la posizione dell'eccezione può essere identificato utilizzando lo stack eccezione traccia di seguito.
  Analisi dello stack:
  [ArgumentNullException: Il valore non può essere nullo
.   Nome del parametro: encoder]
     System.Drawing.Image.Save (flusso Stream, encoder ImageCodecInfo, EncoderParameters encoderParams) 615.244

Ecco il codice per il mio metodo. Forse qualcuno vedrà che cosa sto facendo male. Nel caso non si è certi GetThumbSize, è semplicemente un metodo che prende in dimensioni dell'immagine e la dimensione massima pollice e poi calcola una dimensione reale per mantenere le proporzioni.

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

    }

Questa linea sta gettando l'errore:

thumb.Save(outStream, thumb.RawFormat);

Tutte le idee? Grazie per l'aiuto!

È stato utile?

Soluzione

Credo che il problema potrebbe essere la codifica dell'immagine originale. IIRC, Save (Stream, formato) si traduce in una chiamata a Save (Stream, encoder, params), con l'encoder viene preso dal formato; che nel tuo caso è il formato originale dell'immagine.

Secondo il contenuto comunitario per la Salva metodo , alcuni formati non si tradurrà anche in un encoder.

Vorrei suggerire di specificare l'encoder da soli, utilizzando un formato standard come PNG.

Prova:

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

Altri suggerimenti

Se ciò che si sta cercando di fare è salvarlo in un formato RAW si può provare quanto segue, come nel mio caso funziona quando il formato immagine originale è una supportata:

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top