簡體   English   中英

使用 SaveFileDialog 后在 GDI+ 處 Bitmap.Save() 發生一般錯誤

[英]A Generic error occurs at GDI+ at Bitmap.Save() after using SaveFileDialog

我在 using 塊中使用以下代碼塊和更多代碼:

using (System.Drawing.Bitmap tempImg =
       (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap))
{
    // ...
    tempImg.Save("..\\..\\testdata\\tempImg.bmp", ImageFormat.Bmp);                            
    // ...
}

但我仍然得到錯誤:

GDI+ 發生一般錯誤

只有在我做了一些與 using 塊內的代碼無關的操作之后。 在其他時候,這很好用。 tempImg.bmp 也是一個臨時文件,所以我在 using 塊本身中刪除了 tempImg.bmp。

由於 tempImg 在 using 內部並且它已被處理,我認為應該解決鎖定問題。

有人可以讓我知道這段代碼有什么錯誤嗎?

編輯: System.Drawing.ImageSystem.Drawing.Bitmap作為tempImg的類型。

編輯:我已經確定只有在創建 SaveFileDialog 並且用戶單擊“保存”后才會收到此錯誤。

最后我可以在我的代碼中找到錯誤並想在這里提及它,因為我認為它可能對某人有用......

由於我在 tempImg.Save 中給出了相對路徑,並且用戶在 SaveFileDialog 中單擊“保存”后,tempImg.Save 的實際路徑變為:

SaveFileDialog 指定的路徑 + 相對路徑

自動地。

因此,如果路徑不存在,則會發生此錯誤。

謝謝大家的回答。

我也遇到過這個問題 - 它發生是因為 bitmap 鎖定並且你無法保存它(如果你想我可以找到確切的解釋)所以無論如何解決方法是這樣的:創建一個新的 bitmap 大小為原始 Z86BB33755028458AF74F8將原來的 bitmap 復制到新創建的 bitmap,然后處理原來的 bitmap 並保存新的。

Bitmap bm3 = new Bitmap(bm2);

然后保存。

這通常表明其他東西,可能是您自己的應用程序中的其他線程,已經將您嘗試保存的目標文件鎖定在文件系統級別。 如果您查看內部異常,我相信它應該提到這一點。 如果它不是直接在 InnerException 中確認這一點的另一種方法(或發現它可能實際上是什么)是在調試器中打開第一次機會異常並觀察在“下方”拋出什么異常保存,然后變成這個通用異常。

嘗試了這里給出的所有解決方案,但徒勞無功。 最終找到了解決方案。

  1. 處理應用在圖像上的任何圖形: g.dispose();
  2. 確保保存路徑存在: System.IO.Directory.Exists(dir);

GDI+ 處 Bitmap 出現一般錯誤。當文件夾受保護或文件名無效時,通常會收到 Save()。

一個常見的錯誤是忘記命名,只寫文件夾名稱。

在我的情況下,它是一個 ASP.NET 應用程序,我在其中替換了一個 DLL,並且我必須在部署后簡單地重新啟動應用程序池。 然后它工作得很好。

這是 ASP.NET 應用程序嗎?

asp.net 中的 GDI+ 發生一般錯誤,主要是因為缺少目標文件夾/訪問權限。

您的代碼也可以簡化為:

       using (Image image= dataObject.GetImage())
       {
            if (image != null)
            {
                image.Save("test.bmp");
            }
        }

我正在嘗試從資源中保存圖像,當我直接使用方法 Bitmap.Save(filepath) 時,它也給了我 GDI 錯誤。 我認為我們可以通過克隆它來對任何其他 bitmap 圖像使用相同的以下代碼。

Private void SaveResourceImage() {
    object resBmpObject = Resource.Image1.Clone();//Bitmap Image from resource file
    //object resBmpObject = anyBmpImage.clone(); //for image other than resource image
    Bitmap resBmpImage = (Bitmap)resBmpObject;
    resBmpImage.Save(destFilePath, System.Drawing.Imaging.ImageFormat.Png);
    resBmpImage.dispose();
}

保存圖像后處理您的bitMap object:

 bitMap.Dispose()
 oimg.Dispose()

 bitMap = Nothing
 oimg = Nothing

就我而言,我將 bitmap 文件保存在與源相同的位置,所以這就是問題所在。 我將 bitmap 保存到新位置,現在一切正常。

我遇到了同樣的問題,通過將圖像類型“.bmp”更改為“.png”它的工作形式我

這是來自 Microsoft 論壇的代碼示例。

// new image with transparent Alpha layer
using (var bitmap = new Bitmap(330, 18, PixelFormat.Format32bppArgb))
{
    using (var graphics = Graphics.FromImage(bitmap))
    {
        // add some anti-aliasing
        graphics.SmoothingMode = SmoothingMode.AntiAlias;

        using (var font = new Font("Arial", 14.0f, GraphicsUnit.Pixel))
        {
            using (var brush = new SolidBrush(Color.White))
            {
                // draw it
                graphics.DrawString(user.Email, font, brush, 0, 0);
            }
        }
    }

    // setup the response
    Response.Clear();
    Response.ContentType = "image/png";
    Response.BufferOutput = true;

    // write it to the output stream
    bitmap.Save(Response.OutputStream, ImageFormat.Png);
    Response.Flush();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM