2013-11-15 154 views
2

我該如何解決這個GDI泛型異常?如何在保存圖像時修復此GDI +泛型異常?

這裏是例外:

System.Runtime.InteropServices.ExternalException was unhandled 
HResult=-2147467259 
Message=A generic error occurred in GDI+. 
Source=System.Drawing 
ErrorCode=-2147467259 

代碼:

public Bitmap resize(string FileName) 
{ 
    string[] settings; 
    string inputFolder = ""; 
    string qrFolder = ""; 
    string generalFolder = ""; 
    string archiveFolder = ""; 
    string resizedArchiveFolder =""; 
    string line; 
    int index = 0; 
    settings = System.IO.File.ReadAllLines("config.txt"); 

    foreach (string setting in settings) 
    {//access to config file info 
    var arr = setting.Split('='); 
    if (index == 0) 
     inputFolder = arr[1]; 
    else if (index == 1) 
     qrFolder = arr[1]; 
    else if (index == 2) 
     generalFolder = arr[1]; 
    else if (index == 3) 
     resizedArchiveFolder = arr[1]; 
    else 
     archiveFolder = arr[1]; 

    index++; 
    } 

    string targetPath = resizedArchiveFolder; 
    if (!System.IO.Directory.Exists(targetPath)) 
    { 
    System.IO.Directory.CreateDirectory(targetPath); 
    } 

    Bitmap a2 = (Bitmap)Image.FromFile(FileName); 

    //load file 
    a2 = new Bitmap(a2, new Size(a2.Width * 3/2, a2.Height * 3/2)); 
    a2.SetResolution(1920, 1080); 
    a2.Save(resizedArchiveFolder + System.IO.Path.GetFileName(FileName)); 

    // it throws here when I save 
    return a2; 
} 
+0

什麼是例外? –

回答

0

a2.SetResolution(1920,1080);

這是一個問題。您應該閱讀關於此功能的documentation。這當然不是你認爲的。

你以爲它是圖像的尺寸,但它實際上是圖像的DPI。標準DPI爲90. DPI用於在實際測量中定義圖像的實際尺寸。

在這種情況下,您不需要設置DPI。我會刪除該行。

我不認爲這是你的異常的原因,但。

編輯:

您的代碼不會爲我提示錯誤。它可能是圖像本身的問題(您是否嘗試過使用另一個圖像?)或者您嘗試保存的路徑有問題(您是否嘗試將另一個文件保存到同一路徑?)。

+0

dpi是識別條形碼的。 – Cferrel

+0

@CompSciStudent更新了我的答案。 –

+0

我嘗試了幾個圖像。該路徑中沒有文件,因此沒有保存問題。當我按照我的經理的要求構建配置文件時,它崩潰了。 – Cferrel

1

我以前有過類似的問題。也許這對我有用的解決方案將爲你工作?

我的問題是,Bitmap對象是「正在使用」,雖然我得到了完全相同的例外,你收到......只是一個普遍的例外。

因此,在保存之前,我創建了一個新的位圖對象Bitmap saveBitmap = new Bitmap(theBitmapYouwereTryingToSaveBefore);(傳遞您在那裏工作的位圖...),並在此新對象上調用Save()

+0

我想,之前失敗了。我做到了再次檢查,仍然失敗了。我討厭的Visual Studio!我的工作是一個微軟的商店。 – Cferrel

3

加載位圖會將文件鎖定。嘗試將另一個圖像保存到同一個文件將失敗,並出現此異常。您需要正確的做到這一點,配置位圖是一個硬性要求:

Bitmap newa2 = null; 
    using (var a2 = (Bitmap)Image.FromFile(FileName)) { 
     newa2 = new Bitmap(a2, new Size(a2.Width * 3/2, a2.Height * 3/2)); 
     newa2.SetResolution(1920, 1080); 
    } 
    newa2.Save(Path.Combine(resizedArchiveFolder, Path.GetFileName(FileName))); 
    return newa2; 

使用語句確保位圖設置和文件將不再被鎖定。 SetResolution()參數是無意義的btw。

如果仍然有問題,那麼程序中有另一個(不可見的)代碼行,它使用resizedArchiveFolder中的位圖。它可能存在於另一個程序中,如圖像查看器。

+0

這是一個偉大的try.That在Visual Studio還打破了。也許的Visual Studio 2012最終只是這麼臭? – Cferrel

+2

只有不好的木匠責備他的錘子的問題。 –

+0

所以我一定是一個壞的程序員。我喜歡C++,但我的實習需要C#。 – Cferrel

相關問題