Erstellen Sie ein Thumbnail und dann konvertieren Byte-Array
-
23-08-2019 - |
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!
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);
}