none
圖片存檔時 發生錯誤 RRS feed

  • 問題

  • private int[] WindowScreenCopy(string WindowName) { rect = new Rectangle(); handle = WindowApi.FindWindow(null, WindowName); WindowApi.ShowWindow((int)handle, WindowApi.SW_SHOWNORMAL); this.Focus(); WindowApi.BringWindowToTop(handle); WindowApi.GetWindowRect(handle, out rect); this.Text = handle.ToString(); int[] win_par = new int[4] { rect.X, rect.Y, rect.Width, rect.Height }; Bitmap screenshot = new Bitmap(rect.Width - rect.X, rect.Height - rect.Y, PixelFormat.Format24bppRgb); using (Graphics gfx = Graphics.FromImage(screenshot)) gfx.CopyFromScreen(rect.X, rect.Y, 0, 0, rect.Size, CopyPixelOperation.SourceCopy); screenshot.Save(@"C:\Users\rcg24\Documents\Visual Studio 2015\Projects\GameTest\GameTest\bin\Debug\ScreenCopy.bmp"); screenshot.Dispose(); return win_par; }

    我程式會反覆執行WindowScreenCopy這副程式,但在screenshot.Save這行,執行個幾次就會出現"GDI+ 中發生泛型錯誤。"的錯誤訊息

    請問各位前輩 我該怎麼修正這錯誤呢?

    謝謝



    • 已編輯 rcgrcg 2021年4月13日 上午 05:19
    2021年4月13日 上午 02:51

所有回覆

  • 下面文章,或許有幫助:

    《bitmap.Save 在 GDI+ 中發生泛型錯誤》

    https://social.msdn.microsoft.com/Forums/zh-TW/7b96c7f0-d25d-441e-aaa1-b5e133e39349/bitmapsave-22312-gdi-2001330332299832786722411376793549212290?forum=233

    《在 GDI+ 中發生泛型錯誤。鼠標移到pictureBox區域改變滑鼠圖示,開始不會報錯,但是頻繁將滑鼠移入移出一段時間後程式報錯》

    https://bbs.csdn.net/topics/391814673


    2021年4月13日 上午 08:00
  • 這篇文章其實我有google到

    但由於我必須要把擷取到的畫面 畫在bitmap上

    我找不出有什麼方法可以避免使用 Graphics.FromImage(screenshot))




    • 已編輯 rcgrcg 2021年4月13日 上午 10:33
    2021年4月13日 上午 09:38
  • 您可以參考這篇文件的解法:

    Image.Save exception “A generic error occurred in GDI+.” when saving to MemoryStream

    這篇文章有提供不少方法,裡面還有其他連結點有更多的討論

    由於小弟我不是資工畢業,有些方法看不是很懂,需要專研一下

    其他看得懂的有試了一下 但似乎依樣有錯誤

    之後有試出解決方法的話 在上來跟大家報告一下

    感謝喔

    • 已編輯 rcgrcg 2021年4月16日 上午 07:33
    2021年4月16日 上午 07:28
  • 虽然错误信息是“GDI+中发生一般性错误”,但其真正的意思是说错误不在GDI+中,而是由系统原因导致的。之所以叫做“一般性错误”,就是因为这个错误不在GDI+里面,所以没有详细分类。通常这个错误是由文件系统或系统级编解码器导致的。例如您想要写入ScreenCopy.bmp这个文件,但这个文件被其他程序占用了,那么此时写入就会失败。因此您应该用try catch包裹Save这个函数,如果失败了就提示用户重新保存。此外截图通常都是每一次新建一个文件,用当前的日期和时间做文件名或文件名后缀,如果每次都写入同一个文件就有可能因为文件被占用而导致写入失败。

    目前有個暫時性的解法

    就是反覆輪流存在100個檔案

    暫時解決我的問題

    感謝您的回答



    • 已編輯 rcgrcg 2021年4月16日 上午 07:32
    2021年4月16日 上午 07:32
  • 我建议您使用如下的代码来保存文件,这样即使出了问题,您也可以得到更有意义的错误信息。

    try
    {
        using (var screenshot = new Bitmap(rect.Width - rect.X, rect.Height - rect.Y, PixelFormat.Format24bppRgb))
        {
            using (var gfx = Graphics.FromImage(screenshot))
            {
                gfx.CopyFromScreen(rect.X, rect.Y, 0, 0, rect.Size, CopyPixelOperation.SourceCopy);
            }
            using (var stream = new FileStream(@"C:\Users\rcg24\Documents\Visual Studio 2015\Projects\GameTest\GameTest\bin\Debug\ScreenCopy.bmp", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
            {
                screenshot.Save(stream, ImageFormat.Bmp);
                stream.Flush(true);
            }
        }
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.Message);
    }

    透過您的建議,我加入這段程式方便日後除錯,非常感謝
    • 已編輯 rcgrcg 2021年4月19日 上午 01:46
    2021年4月19日 上午 01:45