2009-12-31 7 views
2

J'ai une application Windows Forms dans .NET 2.0 avec un PictureBox sur un formulaire et je le charge avec un GIF animé en définissant la propriété ImageLocation de PictureBox. Quand il est temps pour l'animation pour rendre l'image suivante, je reçois l'exception suivante et trace de pile:"Une erreur générique s'est produite dans GDI +" après avoir chargé un PictureBox avec un GIF animé

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() 

Répondre

0

Je ne suis pas tout à fait sûr pourquoi cela se produit, mais j'ai trouvé une solution de contournement. La propriété WaitOnLoad de PictureBox est définie sur True. Si je le change en faux (par défaut), il résout le problème.

0

J'ai trouvé un problème lié aux tiffs multipages. J'utilise "pictureBox1.Load (fileName)", puis pictureBox1.Image.SelectActiveFrame (FrameDimension.Page, index). L'appel à pictureBox1.Image.SelectActiveFrame lève une exception "Une erreur générique s'est produite dans GDI +".

Le problème se résume à la façon dont l'image est chargée.

Quand je charge l'image en utilisant:

Image _myImage = Image.FromFile(fileName); 

puis attribuez-lui à pictureBox1:

pictureBox1.Image = _myImage; 

L'appel suivant fonctionne correctement:

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

La réponse de McDon est proche, en fait même juste. La chose est que si vous laissez le PictureBox charger l'image du fichier nommé dans la propriété ImageLocation, alors le flux se ferme probablement après l'exécution de Load(), mais avant toutes les images ont été chargées (probablement seulement la première image charge). Ainsi vous pouvez éviter ceci si vous chargez votre image manuellement à un objet Image avec Image.FromFile(), et donnez cet objet au PictureBox par l'intermédiaire de sa propriété Image.