2009-05-21 13 views
7

Ich habe eine Menge Zeit mit dem Erstellen von Miniaturen und dann konvertieren sie in eine Byte-Array. Ich habe drei Methoden ausprobiert, und alle 3 mal bekomme ich einen Fehler.Erstellen Sie ein Thumbnail und dann in Byte-Array konvertieren

Die erste wurde mit Bitmap.GetThumbnailImage, die ich in der Vergangenheit verwendet haben, und dann direkt in Response.OutputStream

Die zweite wurde unter Verwendung von mit System.Drawing.Graphics DrawImage() gespeichert. Immer noch nicht gehen.

Die dritte war nur eine neue Bitmap zu erstellen, übergeben Sie die alte Bitmap und legen Sie die neue Größe fest. Derselbe Fehler.

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

Hier ist der Code für meine Methode. Vielleicht wird jemand sehen, was ich falsch mache. Falls Sie sich bei GetThumbSize nicht sicher sind, ist es einfach eine Methode, die die Bildgröße und die maximale Größe des Daumens berücksichtigt und dann eine tatsächliche Größe berechnet, um das Seitenverhältnis beizubehalten.

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

    } 

Diese Linie wirft den Fehler:

thumb.Save(outStream, thumb.RawFormat); 

Irgendwelche Ideen? Danke für die Hilfe!

+1

Dieses Problem auf Microsoft Connect: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98452 –

Antwort

6

Ich denke, das Problem könnte die Codierung des ursprünglichen Bildes sein. IIRC, Speichern (streamen, formatieren) führt zu einem Aufruf zum Speichern (Stream, Encoder, Parameter), wobei der Encoder aus dem Format übernommen wird; Das ist in Ihrem Fall das ursprüngliche Format des Bildes.

Laut dem Community-Inhalt für die Save method werden einige Formate nicht gut in einen geeigneten Encoder übersetzt.

Ich würde vorschlagen, dass Sie den Encoder selbst angeben, indem Sie ein Standardformat wie PNG verwenden.

Versuchen:

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

Ihr Vorschlag mich führen, etwas zu versuchen. Ich hatte gerade eine Methode geschrieben, um das ImageFormat in einen MIME-Typ umzuwandeln. Ich lief das Format des Originalbildes durch und es gab "image/gif" zurück, was wie erwartet war, da die Dateiendung .gif ist. Dann ersetzte ich die beleidigend wie mit: thumb.Save (outStream, image.RawFormat); und es funktioniert. Danke für die Hilfe. – Josh

1

Wenn das, was Sie versuchen, es in einem Raw-Format zu tun speichern ist, können Sie die folgende versuchen, wie in meinem Fall funktioniert es, wenn das Original-Bildformat ein unterstütztes ist:

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