2009-05-21 12 views
7

Je vais avoir un mal fou à la création de vignettes, puis les convertir en un tableau d'octets. J'ai essayé trois méthodes, et toutes les 3 fois j'ai une erreur.Créer une miniature, puis convertir en tableau d'octets

Le premier utilisait Bitmap.GetThumbnailImage, que je l'ai utilisé dans le passé et puis enregistré directement dans Response.OutputStream

La deuxième utilisait System.Drawing.Graphics avec DrawImage(). Toujours pas aller.

Le troisième était juste pour créer une nouvelle image, passez dans l'ancien bitmap, et définissez la nouvelle taille. Même erreur

Value cannot be null.
Parameter name: encoder

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: encoder

Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:
[ArgumentNullException: Value cannot be null.
Parameter name: encoder]
System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) +615244

Voici le code de ma méthode. Peut-être que quelqu'un verra ce que je fais mal. Dans le cas où vous n'êtes pas sûr à propos de GetThumbSize, c'est simplement une méthode qui prend en compte la taille de l'image et la taille maximale du pouce, puis calcule une taille réelle pour préserver le rapport d'aspect.

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

    } 

Cette ligne est de lancer l'erreur:

thumb.Save(outStream, thumb.RawFormat); 

Toutes les idées? Merci pour l'aide!

+1

Cette question sur Microsoft Connect: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98452 –

Répondre

6

Je pense que le problème peut être l'encodage de l'image originale. IIRC, Save (stream, format) entraîne un appel à Save (stream, encoder, params), l'encodeur étant pris dans le format; qui dans votre cas est le format original de l'image.

Selon le Contenu de la communauté pour la Save method, certains formats ne se traduira pas bien dans un codeur approprié.

Je vous suggère de spécifier l'encodeur vous-même, en utilisant un format standard comme PNG.

Essayez:

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

Votre suggestion me conduire à essayer quelque chose. Je venais juste d'écrire une méthode pour convertir le ImageFormat en un type MIME. J'ai couru le format de l'image originale par ceci et il a retourné "image/gif", qui était comme prévu parce que l'extension de fichier est .gif. Je remplacé l'infraction comme avec: thumb.Save (outStream, image.RawFormat); et cela fonctionne. Merci pour l'aide. – Josh

1

Si ce que vous essayez de faire est l'enregistrer dans un format Raw, vous pouvez essayer ce qui suit, comme dans mon cas, il fonctionne lorsque le format d'image d'origine est une prise en charge:

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