2013-06-18 42 views
1

我試圖使用GDI +保存文件,但我剛剛得到「GDI +中發生的通用錯誤」異常。代碼幾乎適用於每張照片,但這個(我們多年來處理數千個,這是我聽到的第一張照片)。我認爲這可能與Exif數據有關,或者可能與攝影師相機或編輯器中的其他內容有關。爲什麼GDI +不保存這張圖片?

Here's the photo in question

這裏是代碼重現錯誤與這張照片:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var img = Image.FromFile("Err.jpg")) 
     using (var ms = new MemoryStream()) 
     { 
      img.Save(ms, ImageFormat.Jpeg); 
     } 
    } 
} 

我應該如何在GDI +來處理呢?有沒有辦法去除導致問題的額外材料?

+1

您的圖片缺失。你應該把它發佈在這裏。 –

+0

「你的形象缺失」是什麼意思?該網址似乎爲我工作。你有404嗎? – Brian

+0

嗯,我現在看到它。我得到了「未找到圖像」 –

回答

0

看來,將圖像轉換爲bmp首先解決了這個問題。找到一種效率更高的方法(不需要創建多個圖像並將其加載到內存中)會很好,但這是迄今爲止我發現的最好的方法。

static void Main(string[] args) 
{ 
    var path = @"gdi_err.jpg"; 
    using (var img1 = Image.FromFile(path)) 
    using (var ms1 = new MemoryStream()) 
    { 
     img1.Save(ms1, ImageFormat.Bmp); 
     ms1.Position = 0; 
     using (var img2 = Image.FromStream(ms1)) 
     using (var ms2 = new MemoryStream()) 
     { 
      img2.Save(ms2, ImageFormat.Jpeg); 
     } 
    } 
} 
0

您的圖像的exif配置文件似乎是問題。當我刪除它時,我可以將圖像保存到內存流中。我用Magick.NET刪除exif配置文件。

using (MagickImage magickImage = new MagickImage()) 
{ 
    using (var magickStream = new MemoryStream()) 
    { 
    magickImage.Read(@"gdi_err.jpg"); 
    magickImage.Strip(); 
    magickImage.Write(magickStream); 
    magickStream.Position = 0; 

    // This part is just here to demonstrate that saving the image works. 
    // You don't need it because magickStream already contains the data you want. 
    using (Image image = Image.FromStream(magickStream)) 
    { 
     using (var ms = new MemoryStream()) 
     { 
     image.Save(ms, ImageFormat.Jpeg); 
     } 
    } 
    } 
}