Dies ist eine seit langem bestehende Fehler in dem .NET-Framework selbst, dass ich erwarte, dass keine Zeit bald behoben zu sehen. Es gibt mehrere ähnliche Fehler, die ich auch auf, dass die mit ‚allgemeiner Fehler in GDI + aufgetreten‘ werfen gekommen sind, wenn Sie die PropertyItem Sammlung für einige JPEGs zugreifen (die EXIF-Codes prüfen), dann von diesem Punkt an Sie nicht in der Lage sein wird, Speichere das Bild. Auch, ohne Grund und Recht, einige JPEGs, wie die, die Sie hier haben, werden einfach nicht speichern. Beachten Sie, dass das Speichern als anderes Format nicht immer funktioniert, auch wenn dies in diesem Fall der Fall ist.
Die Problemumgehung, die ich in einer App von mir verwendet habe, die Bilder aus dem ganzen Web verbraucht (und daher mehr als ihren gerechten Anteil an diesen Arten von Problemen sieht), ist die ExternalException abzufangen und das Bild in ein neues zu kopieren Bitmap wie in einem der vorhergehenden Antworten, aber einfach dies als neue JPEG-Speichern wird die Qualität sinken ziemlich viel so verwende ich Code ähnlich wie die unter die Qualität hoch zu halten:
namespace ImageConversionTest
{
using System.Drawing;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.Globalization;
class Program
{
static void Main(string[] args)
{
using(Image im = Image.FromFile(@"C:\20128X.jpg"))
{
string saveAs = @"C:\output.jpg";
EncoderParameters encoderParams = null;
ImageCodecInfo codec = GetEncoderInfo("image/jpeg");
if(codec != null)
{
int quality = 100; // highest quality
EncoderParameter qualityParam = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, quality);
encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
}
try
{
if(encoderParams != null)
{
im.Save(saveAs, codec, encoderParams);
}
else
{
im.Save(saveAs, ImageFormat.Jpeg);
}
}
catch(ExternalException)
{
// copy and save separately
using(Image temp = new Bitmap(im))
{
if(encoderParams != null)
{
temp.Save(saveAs, codec, encoderParams);
}
else
{
temp.Save(saveAs, ImageFormat.Jpeg);
}
}
}
}
}
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
// Get image codecs for all image formats
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
// Find the correct image codec
foreach(ImageCodecInfo codec in codecs)
{
if(string.Compare(codec.MimeType, mimeType, true, CultureInfo.InvariantCulture) == 0)
{
return codec;
}
}
return null;
}
}
}
Hinweis, dass Sie verliere die EXIF-Informationen, aber ich lasse das für jetzt (Sie werden immer noch in der Lage sein, die EXIF-Codes zu lesen, auch wenn das Speichern des Quellbildes fehlschlägt). Ich habe es schon lange aufgegeben, herauszufinden, was .NET an bestimmten Bildern nicht mag (und Beispiele verschiedener Fehlerfälle haben, sollte jemand jemals die Herausforderung annehmen wollen), aber der obige Ansatz funktioniert, was gut ist .
@ Sam Saffron: Sie sagen, „ohne das Problem an der Quelle Fixierung“, bedeutet das, dass das Bild nicht den Standard für JPEG folgt? Wenn dies der Fall ist, können Sie nicht erwarten, dass .NET mit Bildern arbeitet, die nicht dem Standard entsprechen, auch wenn andere Anwendungen weniger streng sind. Haben Sie auch die InnerException-Eigenschaft überprüft? Dort könnte es mehr Informationen darüber geben, warum genau das Laden fehlschlug. – casperOne
Es lädt, es speichert einfach nicht. Ich weiß, dass es das Richtige ist, einen Roboter über alle Videobilder laufen zu lassen und es zu reparieren, aber das liegt außerhalb meiner Kontrolle, und dieses Ding brauchte 30 Minuten, um es zu finden. Alles, was ich bekomme, ist ein GDI-Fehler, ohne weitere Informationen oder innere Ausnahme und Explorer scheint keine Probleme zu haben, es zu öffnen, die noch seltsamer ist. –
Ich habe gerade den gleichen Code in VB versucht und es funktioniert mit Ihrem bestimmten Bild. Hat sich das während des Uploads geändert? –