Frage

Ich habe ein Heck einer Zeit mit Erstellung von Thumbnails und dann in eine Byte-Array zu konvertieren. Ich habe drei Methoden ausprobiert, und alle drei Male habe ich einen Fehler.

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

Die zweite wurde mit System.Drawing.Graphics mit DrawImage (). Noch nicht gehen.

Der dritte war nur eine neue Bitmap zu erstellen, in der alten Bitmap übergeben, und stellen Sie die neue Größe. Gleiche Fehler.

  

Der Wert darf nicht null sein.
  Parametername: Encoder
  Beschreibung: Eine nicht behandelte Ausnahme trat während der Ausführung der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über den Fehler und wo es im Code verursacht.
  Ausnahmedetails: System.ArgumentNullException: Wert darf nicht null sein
.   Parametername: Encoder
  Quellfehler:
  Eine nicht behandelte Ausnahme wurde während der Ausführung der aktuellen Webanfrage generiert. Informationen über den Ursprung und die Position der Ausnahme können die Ausnahme-Stack-Trace identifiziert werden.
  Stack-Trace:
  [Argument: Wert darf nicht null sein
.   Parametername: Encoder]
     System.Drawing.Image.Save (Stream Stream, ImageCodecInfo Encoder, EncoderParameters encoderParams) 615.244

Hier ist der Code für meine Methode. Vielleicht wird jemand sehen, was ich falsch mache. Falls Sie über GetThumbSize nicht sicher, es ist einfach eine Methode, die in der Bildgröße und die maximalen Daumengröße nimmt und berechnet dann eine tatsächliche Größe das Seitenverhältnis zu erhalten.

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 Zeile wirft den Fehler:

thumb.Save(outStream, thumb.RawFormat);

Irgendwelche Ideen? Danke für die Hilfe!

War es hilfreich?

Lösung

Ich denke, das Problem das Originalbild der Codierung sein kann. IIRC, Speicher (Strom, Format) zu einem Aufruf zu speichern (Strom, Encoder, params), mit dem Encoder aus dem Format aufgenommen wird; die in Ihrem Fall ist das ursprüngliche Format des Bildes.

Nach dem Community-Inhalt für den Methode speichern , einige Formate nicht gut in einen geeigneten Encoder übersetzen.

Ich würde vorschlagen, Sie den Encoder selbst festlegen, einige Standardformate wie PNG verwenden.

Versuchen:

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

Andere Tipps

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

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top