Une erreur générique s'est produite dans GDI+. [Résolu]

alex1496 10 Messages postés lundi 9 février 2004Date d'inscription 1 mars 2007 Dernière intervention - 27 févr. 2007 à 23:43 - Dernière réponse : Lucyberad 420 Messages postés mercredi 16 juin 2004Date d'inscription 26 juillet 2007 Dernière intervention
- 1 mars 2007 à 23:31
Mon programme calcule le ferraillage d'un poteau béton. L'utilisateur
entre les données, et lance le calcul qui aboutit sur le dessin du
poteau et une note de calcul que je genère en HTML.

L'image est enregistrée sur mon disque et est affichée dans une picturebox et dans la note de calcul en HTML.

Tout cela marche mais si je relance le calcul ça plante avec mon erreur de GDI+.

Je n'arrive pas à comprendre si c'est parce que l'image est utilisé que je n'arrive pas à l'afficcher de nouveau.

MON CODE

Private
Sub menu_Calculer(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles barre_calculer.Click, mnu_calculer.Click

        ...blablablabla....

        
        '--- Affichage dessin ---
        'Image de support
        'pic.Dispose()
        Dim img As Bitmap = New Bitmap(pic.Width, pic.Height)
        'Dim img As New Bitmap(file_img_p)
        'frm_note.Close()
        'pic.Image = Nothing
        'Paramètres de transformation
        Dim ajust As ajustage = Ajuste_section(section, pic)
        'Trace
        Call Trace_section(section, img, ajust)
        Call Trace_section(section_Br, img, ajust)
        'Affichage sur la picturebox

        Try
            Image.FromFile(file_img_p).Dispose()
            img.Save(file_img_p, ImageFormat.Gif)
            pic.Image = Image.FromFile(file_img_p)
        Catch ex As Exception
            Console.WriteLine(">>>" & ex.Message)
        End Try
        

        '--- Note de calculs ---
        'Call ndc_poteau(p, geom_p, soll_p, meca_p, arm_p)
        'Call menu_ndc(sender, e)

        'img.Dispose()

    End Sub
MODULE DESSIN

Public Sub Trace_section(ByRef tableau() As PointF, ByVal img As Bitmap, ByVal ajust As ajustage)
        'Trace une image à partir d'un tableau

        Dim tableau_trace() As PointF
        tableau_trace = tableau.Clone

        'Tableau affichage
        For i As Integer = 0 To tableau_trace.GetUpperBound(0)
            tableau_trace(i).X = tableau(i).X * ajust.echelle.dx + ajust.vecteur.dx
            tableau_trace(i).Y = tableau(i).Y * ajust.echelle.dy + ajust.vecteur.dy
        Next i

        'Créer une image en fonction de la picturebox
        Dim graph As Graphics = Graphics.FromImage(img)
        'graph.FromImage(img)
        'Dessin
        graph.FillRectangle(Brushes.White, New Rectangle(0, 0, img.Width, img.Height))
        graph.DrawPolygon(Pens.Red, tableau_trace)

        'Dim img1 As Image = New Bitmap(img.Width, img.Height, graph)
        'img1.Save("c:\essai.bmp") ', ImageFormat.Bmp)

        graph.Dispose()

    End Sub
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
alex1496 10 Messages postés lundi 9 février 2004Date d'inscription 1 mars 2007 Dernière intervention - 1 mars 2007 à 00:43
3
Merci
J'ai trouvé la solution mais pas la réponse.

Code :
Sub principal ()_click

blabla...

        '--- Affichage dessin ---
     
        Dim img As Bitmap = New Bitmap(pic.Width, pic.Height)
        Dim graph As Graphics = Graphics.FromImage(img)

        'Paramètres de transformation
        Dim ajust As ajustage = Ajuste_section(section, pic)

        'Trace
        graph.FillRectangle(Brushes.White, New Rectangle(0, 0, img.Width, img.Height))
        Call Trace_section(section, img, graph, ajust)
        Call Trace_section(section_Br, img, graph, ajust)

        'Affichage sur la picturebox
        img.Save(file_img_p, ImageFormat.Bmp)
        pic.Image = img

        graph.Dispose()

end sub
   Public Sub Trace_section(ByRef tableau() As PointF, ByVal img As Bitmap, ByVal graph As Graphics, ByVal ajust As ajustage)
        'Trace une image à partir d'un tableau

        Dim tableau_trace() As PointF
        tableau_trace = tableau.Clone

        'Tableau affichage
        For i As Integer = 0 To tableau_trace.GetUpperBound(0)
            tableau_trace(i).X = tableau(i).X * ajust.echelle.dx + ajust.vecteur.dx
            tableau_trace(i).Y = tableau(i).Y * ajust.echelle.dy + ajust.vecteur.dy
        Next i

        graph.DrawPolygon(Pens.Red, tableau_trace)

    End Sub

Merci alex1496 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de alex1496
alex1496 10 Messages postés lundi 9 février 2004Date d'inscription 1 mars 2007 Dernière intervention - 27 févr. 2007 à 23:45
0
Merci
C'est ce que j'ai reussi à recupérer de l'erreur :
L'exception System.Runtime.InteropServices.ExternalException n'a pas été gérée
  ErrorCode=-2147467259
  Message="Une erreur générique s'est produite dans GDI+."
  Source="System.Drawing"
  StackTrace:
       à System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
       à System.Drawing.Image.Save(String filename, ImageFormat format)
       à WindowsApplication1.frm_poteau.menu_Calculer(Object sender, EventArgs e) dans N:\PROG_VB2005\CABA\frm_poteau.vb:ligne 235
       à System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
       à System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
       à System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
       à System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
       à System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
       à System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
       à System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
       à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       à System.Windows.Forms.Control.WndProc(Message& m)
       à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       à System.Windows.Forms.ToolStrip.WndProc(Message& m)
       à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       à System.Windows.Forms.Application.Run(ApplicationContext context)
       à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       à WindowsApplication1.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
       à System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       à System.Threading.ThreadHelper.ThreadStart()
Moi j'y comprends rien

Si vous avez besoin de plus d'info, pas de souci

Dur d'etre pour moi d'être novice !
Commenter la réponse de alex1496
ShareVB 2717 Messages postés vendredi 28 juin 2002Date d'inscription 13 janvier 2016 Dernière intervention - 28 févr. 2007 à 22:14
0
Merci
salut,

apparemment MS a encore sorti quelquechose avant de l'avoir finalisé :
http://www.gotdotnet.com/Community/MessageBoard/Thread.aspx?id=385983

sinon essaie en JPEG...visiblement les implémentation de l'enregistrement sont un peu buggées...

ShareVB
Commenter la réponse de ShareVB
ShareVB 2717 Messages postés vendredi 28 juin 2002Date d'inscription 13 janvier 2016 Dernière intervention - 1 mars 2007 à 09:27
0
Merci
salut,

j'ai l'impression que le Gif de .Net a une taille limite...par contre en JPEG, ca doit aussi marcher...

ShareVB
Commenter la réponse de ShareVB
alex1496 10 Messages postés lundi 9 février 2004Date d'inscription 1 mars 2007 Dernière intervention - 1 mars 2007 à 20:59
0
Merci
J'en sais trop rien. J'en ai perdu mon latin.
Mais la ca marche.
Si quelqu'un a l'explication, qu'il se manifeste.
Commenter la réponse de alex1496
Lucyberad 420 Messages postés mercredi 16 juin 2004Date d'inscription 26 juillet 2007 Dernière intervention - 1 mars 2007 à 23:31
0
Merci
la tu utilise le BMP, c'est vachement lourd comme fichier.

si la taille ne t'importe pas et que tu a plutot besoin de vitesse de traitement, ok pour le BMP, sinon pour alleger les images: utilise le Jpeg.

comme je te l'ai repondu a ton MP, la premiere ligne:
            Image.FromFile(file_img_p).Dispose()
ne sert a rien.

ensuite je crois savoir pourquoi: probablement que la methode Save fait un travail asynchrone, et que la deuxieme essaye de charger un fichier en cours d'edition... peut-être, en tout cas à essayer !
            img.Save(file_img_p, ImageFormat.Bmp)
            pic.Image = Image.FromFile(file_img_p)


L U C Y I3 E R @ D
Commenter la réponse de Lucyberad

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.