“A generic error occurred in GDI+” after loading a PictureBox with an animated GIF

余生长醉 提交于 2019-12-13 15:26:24

问题


I have a Windows Forms application in .NET 2.0 with a PictureBox on a form and I load it with an animated GIF by setting the PictureBox's ImageLocation property. When it is time for the animation to render the next frame, I get the following exception and stack trace:

A generic error occurred in GDI+.
   at System.Drawing.Image.SelectActiveFrame(FrameDimension dimension, Int32 frameIndex)
   at System.Drawing.ImageAnimator.ImageInfo.UpdateFrame()
   at System.Drawing.ImageAnimator.UpdateFrames()
   at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.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(Int32 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 AIRNow.IMS.Mapper.MapWizard.Main() in C:\Projects\AIRNowI\IMS\UserInterface\MapWizard\MapWizard.cs:line 14
   at System.AppDomain._nExecuteAssembly(Assembly 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)
   at System.Threading.ThreadHelper.ThreadStart()

回答1:


mcdon's answer is close, actually even right. The thing is that if you let the PictureBox load the picture from the file named in the ImageLocation property, then the stream probably closes after the execution of Load(), but before all the frames were loaded (probably only the first frame loads). Thus you can avoid this if you load your picture manually to an Image object with Image.FromFile(), and give this object to the PictureBox through its Image property.




回答2:


I'm not entirely sure why this happens, but I found a workaround. I had the PictureBox's WaitOnLoad property set to True. If I change it to False (the default) it resolves the issue.




回答3:


I found a related problem dealing with multipage tiffs. I use "pictureBox1.Load(fileName)", and then pictureBox1.Image.SelectActiveFrame(FrameDimension.Page, index). The call to pictureBox1.Image.SelectActiveFrame throws an exception "A generic error occured in GDI+".

The problem comes down to how the image is loaded.

When I load the image using:

Image _myImage = Image.FromFile(fileName);

and then assign it to pictureBox1:

pictureBox1.Image = _myImage;

The following call works properly:

pictureBox1.Image.SelectActiveFrame(FrameDimension.Page, index);


来源:https://stackoverflow.com/questions/1983223/a-generic-error-occurred-in-gdi-after-loading-a-picturebox-with-an-animated-g

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!