簡體   English   中英

Bitmap.Save“Generic Error”

[英]Bitmap.Save “Generic Error”

當我運行我的應用程序時,以下錯誤被拋到我臉上“GDI +中發生了一般錯誤。” 我環顧四周,看到人們有類似的錯誤,但沒有找到真正的解決方案,或者實施屁股真的很痛苦。 那些沒有得到解決方案的人還沒有發布他們的代碼。

所以我想我不妨給它一個鏡頭並拋出另一個關於如何修復此錯誤的線程。 這是我的代碼和錯誤

            Random r = new Random();
            DirectoryInfo di = new DirectoryInfo(folderbrowser.SelectedPath);
            FileInfo[] fi = di.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray();
            for (int i = 0; i < imageCount; i++)
            {
                int img1 = r.Next(imageCount);
                int img2 = r.Next(imageCount);
                while (img2 == img1)
                    img2 = r.Next(imageCount);
                pic1.Image = Image.FromFile(fi[img1].FullName);
                pic2.Image = Image.FromFile(fi[img2].FullName);
                Image i1 = pic1.Image;
                Image i2 = pic2.Image;
                Bitmap bitmap = new Bitmap(i1.Width + i2.Width, 1080);
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.DrawImage(i1, 0, 0);
                    g.DrawImage(i2, i2.Width, 0);
                }
                bitmap.Save(@"C:\TEST\Image_"+i.ToString());                   
            }

這是錯誤代碼

System.Runtime.InteropServices.ExternalException was unhandled
  Message=A generic error occurred in GDI+.
  Source=System.Drawing
  ErrorCode=-2147467259
  StackTrace:
       at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
       at System.Drawing.Image.Save(String filename, ImageFormat format)
       at System.Drawing.Image.Save(String filename)
       at WallpaperMerger.Form1.btn_merge_Click(Object sender, EventArgs e) in C:\Users\PeppeJ\documents\visual studio 2010\Projects\WallpaperMerger\WallpaperMerger\Form1.cs:line 113
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at WallpaperMerger.Program.Main() in C:\Users\PeppeJ\documents\visual studio 2010\Projects\WallpaperMerger\WallpaperMerger\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

那么StackOverflow的你們在想什么? 我是和其他人一樣的船,必須鍵入一個可笑的復雜代碼來解決這個問題,或者我犯了一個簡單的錯誤並且很容易糾正?

如果您想自己測試一下,如果這可能有所幫助,這里是一個指向Debug Build的鏈接

只需勾選“使用多個文件”,選擇包含圖像文件的文件夾(例如C:\\ Users \\ Public \\ Pictures \\ Sample Pictures)。 點擊合並。

我想補充一點,我在這個函數中使用Bitmap.Save,它完美無缺。

        Bitmap bitmap = new Bitmap(pic1.Image.Width + pic2.Image.Width, 1080);
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            g.DrawImage(pic1.Image, 0, 0);
            g.DrawImage(pic2.Image, pic1.Image.Width, 0);
        }
        if (savepicfile.ShowDialog() == DialogResult.OK)
            bitmap.Save(savepicfile.FileName);

在上面的函數文件加載如下:

    DialogResult result = pic1file.ShowDialog();
    if (result == DialogResult.OK)
        pic1.Image = Image.FromFile(pic1file.FileName);

值得一提的是“picX”是一個“System.Windows.Forms.PictureBox”對象。

根據我的經驗,99%的時間此錯誤是由以下問題引起的:

  1. 您無權編寫該文件。
  2. 您嘗試寫入的文件被另一個進程鎖定。

偶爾我會碰到它:

  • 我正在繪制帶有零點的GraphicPaths。
  • 我不是處置我的GDI +對象的財產。 (可能與上面的選項2有關)

我先檢查前兩件事。 如果可以排除這一點,我可以看到你沒有在你提供的代碼中正確處理一些對象。 我會清理它。 如果你沒有調用Dispose(),GDI +與.NET的GC並不是特別合作。

        var r = new Random();
        var di = new DirectoryInfo(folderbrowser.SelectedPath);
        var fi = di.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray();
        for (var i = 0; i < imageCount; i++)
        {
            var img1 = r.Next(imageCount);
            var img2 = r.Next(imageCount);
            while (img2 == img1) 
            {
                img2 = r.Next(imageCount);
            }
            pic1.Image = Image.FromFile(fi[img1].FullName);
            pic2.Image = Image.FromFile(fi[img2].FullName);
            var i1 = pic1.Image;
            var i2 = pic2.Image;
            using (var bitmap = new Bitmap(i1.Width + i2.Width, 1080))
            using (var g = Graphics.FromImage(bitmap))
            {
                g.DrawImage(i1, 0, 0);
                g.DrawImage(i2, i2.Width, 0);
                bitmap.Save(@"C:\TEST\Image_"+i.ToString());
            }                   
        }

編輯:更多的想法(嗯,真的澄清上面的數字2)...

  • 如果您的應用程序中有PictureBox或其他控件引用您嘗試編寫的C:\\TEST目錄中的圖像,則可以看到此錯誤。
  • 如果您有其他代碼正在讀取您嘗試寫入的圖像,則可以看到此錯誤。
  • 如果外部進程(例如IDE,圖像查看器/編輯器等)打開了文件,則可以看到此錯誤。

調試思路:

  • 嘗試在保存呼叫上設置斷點。 當你到達它時,使用這里找到的提示來確定可能正在訪問該文件的進程: 如何找出使用.NET鎖定文件的進程?
  • 嘗試首先刪除文件,看看它是否允許你保存,如果他們不是他們的。
  • 嘗試在您要寫入的目錄上為“Everyone”設置完全權限(盡管如此,請不要這樣做)
  • 確保您嘗試保存的圖像的寬度是大於零的數字。 我注意到你是以編程方式設置的。
  • 確保你想要保存的圖像的寬度不是很大(可能你遇到了內存問題?)

我找到了答案,目錄“\\ TEST \\”不存在。 當我創建它時,它完美無缺。

我有這個確切的問題,修復它是在using子句中包裝Bitmap; 還需要處理位圖

using (Bitmap bmp = new Bitmap()) 
{
    // Bitmap operation
}

在處理Graphics對象之前嘗試執行bitmap.Save:

Bitmap bitmap = new Bitmap(i1.Width + i2.Width, 1080);
using (Graphics g = Graphics.FromImage(bitmap))
{
    g.DrawImage(i1, 0, 0);
    g.DrawImage(i2, i2.Width, 0);
    bitmap.Save(@"C:\TEST\Image_"+i.ToString()); 
}

暫無
暫無

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

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