A generic error occured in GDI+ [Résolu]

Signaler
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010
-
cs_saxor
Messages postés
13
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
5 août 2009
-
Bonjour,

je fais des captures d'images grace au controle AxltmmCaptureCtrl1. J'ai un bouton qui enregistre les captures dans un repertoire, puis les images presentes dans ce repertoire s'affichent sous forme d'icones dans une listview. Le probleme est que lorsque je lance mon programme, pour la premiere capturem tout se passe bien, en revanche il m'est impossible de proceder a une seconde capture sans fermer et relancer le programme.

J'ai fait pas mal de recherches sur cette erreur ("A generic error occured in GDI+") apparement il peut y avoir beaucoup de causes a cette erreur, je n'ai pas trouver la mienne.

l'erreur arrive a cette ligne la du code :

Dim DateHeure As String = Date.Now.Day & "-" & Month(Now) & "-" & Year(Now) & " " & Hour(Now) & "h" & Minute(Now) & "m" & Second(Now) & "s"

AxltmmCaptureCtrl1.CapturePicture.Save("D:\Images" & DateHeure & format)

Avez vous une idee?

Je suis la si vous avez besoin de plus d'informations

Merci

Chiche69

24 réponses

Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

bon ca marche si je declare la variable dans l'evenement btnCapture_Click

On en a fini avec ca!

tout va bien... On peut passer a autre chose ;)

@+

chiche69
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
24
Salut,

Pourquoi ne pas utiliser des sources en c# ou vb.net qui sont dispo sur ce site.
Au lieu d'utiliser un ACTIVEX.
Messages postés
13
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
5 août 2009

Bonjour,

A quoi correspond ton format?
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

salut,

nhervagault Merci pour ta reponse/question. Ecoute je sais pas trop j'ai pris la premier piste que j'ai trouvee. A quelle source tu penses? Toutes les proposions me vont. L'avantage avec la librairie que j'utilise, c'est que je peut faire des captures d'images, des enregistrements videos et les lire...

Pour ce qui est du format saxor, c'est le format de l'image qui varie en fonction du choix de l'utilisateur, C'est a dire jpg, bmp, ou gif.

Je veux bien voir les codes sources disponnibles sur ce site mais pourriez vous me dire lequel et pourquoi stp?

Ou alors m'expliquer comment resoufre l'erreur de GDI+

Merci
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
24
Je pensais à des sources de type

lien 1

Lien 2
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

ok...
En fait ce n'est pas pour des captures d'ecran. Ce sont des images qui viennes d'un peripherique extern comme une webcam un camescope...
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
24
ah ok.

Capture d'image (j'ai pris pour capture d'ecran) Désolé.

http://www.csharpfr.com/codes/CAPTURER-IMAGE-DEPUIS-WEBCAM_43236.aspx
Messages postés
13
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
5 août 2009

Ça peut paraitre idiot mais ne faut-il pas que tu "vides" le contenu de ton contrôle AxltmmCaptureCtrl1 avant de t'en resservir?
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

No Problem!

En fait je l'avais deja vu cette source. J'avais commence en m'inspirant de ce code mais finalement j'ai change parce que les commandes semblaient plus simples avec LTMMLIB.

Je vais essayer de faire quelques modifications mais j'aimerais quand meme comprendre comment corriger le probleme GDI+ parce que ca me serait plus pratique!!


toujours pas d'idee?
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

"Ça peut paraitre idiot mais ne faut-il pas que tu "vides" le contenu de ton contrôle AxltmmCaptureCtrl1 avant de t'en resservir?"

Je pense aussi que c'est quelque chose comme ca qu'il faille faire mais alors je ne sais pas quoi exactement.

j'ai essaye :

AxltmmCaptureCtrl1.Controls.Clear()
AxltmmCaptureCtrl1.Dispose()

je vais essayer d'autres commande au hazard pour voir mais sans grande conviction...
Messages postés
13
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
5 août 2009

Essayes ca

private void button1_Click(object sender, System.EventArgs e)
{
axltmmCaptureCtrl1.VideoDevices.Selection=0;
axltmmCaptureCtrl1.TargetFile =@"c:\ali.avi";
MessageBox.Show(axltmmCaptureCtrl1.VideoDevices.Selection.ToString());
axltmmCaptureCtrl1.TargetFormat=
(int)LTMMLib.ltmmCapture_TargetFormat.ltmmCapture_TargetFormat_Avi;
axltmmCaptureCtrl1.StartCapture((int)LTMMLib.ltmmCapture_Mode.ltmmCapture_Mode_Video);
}

private void button2_Click(object sender, System.EventArgs e)
{
axltmmCaptureCtrl1.StopCapture ();
}


source : http://support.leadtools.com/SupportPortal/CS/forums/2518/ShowPost.aspx
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

Le code que tu m'as donne c'est pour les videos. moi mon probleme est au niveau des captures d'images je pense.

Je l'ai quand meme teste il marche mais celui que j'utilise pour l'enregistrement video marche aussi...
Messages postés
13
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
5 août 2009

Et en changeant cette ligne la

private void button1_Click(object sender, System.EventArgs e)
{
axltmmCaptureCtrl1.VideoDevices.Selection=0;
axltmmCaptureCtrl1.TargetFile =@"c:\ali.avi";
MessageBox.Show(axltmmCaptureCtrl1.VideoDevices.Selection.ToString());
axltmmCaptureCtrl1.TargetFormat=
(int)LTMMLib.ltmmCapture_TargetFormat.ltmmCapture_TargetFormat_Avi;
axltmmCaptureCtrl1.StartCapture((int)LTMMLib.ltmmCapture_Mode.ltmmCapture_Mode_Video);
}

private void button2_Click(object sender, System.EventArgs e)
{
axltmmCaptureCtrl1.StopCapture ();
}


Pour la mettre dans un autre format que l'AVI?
Si tu trouves une solution fais en moi part.
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

Alors je l'ai change par ca :

AxltmmCaptureCtrl1.TargetFormat = LTMMLib.ltmmCapture_TargetFormat.ltmmCapture_TargetFormat_Still_Image

lorsque je clic sur button1 ca me fait plein de captures d'images a la suite et ca ne s'arrete pas tant que je ne clic pas sur button2. Donc en quelque sorte ca marche... mais pas exactement comme je le souhaiterais.
L'ideal serait que lorsque je clic sur button1 ca me fasse UNE capture et pi c'est tout ;)

du coup j'essaye de changer de mode a partir de cette ligne :
AxltmmCaptureCtrl1.StartCapture(LTMMLib.ltmmCapture_Mode.ltmmCapture_Mode_Video) '(int)

mais je ne trouve pas

desole de "refouller" tout se que tu me donnes mais en tout cas c'est cool d'essayer de m'aider la dessus
Messages postés
13
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
5 août 2009

Et si tu mets tout le code dans le même bouton?
Ça débute le screenshot, ça capture et ça s'arrête.
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

j'ai essaye mais ca ne prend pas de capture... ca fait rien
Messages postés
13
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
5 août 2009

Si tu sais le temps qu'il faut à l'appareil, tu peux peut-être mettre un timer ou un thread qui va bouclé sur rien le temps de la capture
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

J'ai tente avec un timer, differentes valeures mais les temps qu'il faut pour l'appareil n'est pas constant apparement... Quant a un thread je sais pas trop comment ca marche.
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

Salut saxor,

j'ai essayer d'en apprendre un peu plus sur le control mais alors sans grand succes. j'ai ete sur sur site :

http://www.leadtools.com/Help/LEADTOOLS/v16/multimedia/com/Ocx_top/QuickReference.htm

Je te ne t'ai as donne mon code en entier peut etre que ca peut aider...

*********************************************************

Imports DirectX.Capture
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports System.Windows.Forms.Form
Imports System.Data.SqlClient


Public Class MainForm
Inherits System.Windows.Forms.Form
Public Dispositivos As New Filters() 'le filtre en cours
Dim format As String
Dim l As Integer = 1 ' LoadImage()
Dim m As Integer ' LoadVideo()
Dim ValidateOK As Boolean = False
Dim ListBoxVirtuelle As New ListBox
Dim CurrentImageList As ImageList
Dim DateHeure As String = Date.Now.Day & "-" & Month(Now) & "-" & Year(Now) & " " & Hour(Now) & "h" & Minute(Now) & "m" & Second(Now) & "s"



Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Initialisation des peripheriques installes sur la machine
Dim j As Short
Dim f As Filter

'listage des peripheriques video installés sur la machine
ComboBox1.Items.Clear()
For j = 0 To Dispositivos.VideoInputDevices.Count - 1
f = Dispositivos.VideoInputDevices(j)
ComboBox1.Items.Add(f.Name)
Next
If j > 0 Then ComboBox1.SelectedIndex = 0

'listage des peripheriques audio installés sur la machine
ComboBox2.Items.Clear()
For j = 0 To Dispositivos.AudioInputDevices.Count - 1
f = Dispositivos.AudioInputDevices(j)
ComboBox2.Items.Add(f.Name)
Next
If j > 0 Then ComboBox2.SelectedIndex = 0

' Initialiser le comboBox avec son premier choix
ComboBox3.Text = ComboBox3.Items(0)

ListView1.LargeImageList = CurrentImageList
ListView1.StateImageList = CurrentImageList

End Sub

Public Sub LoadImage()
l = 1
ListView1.Items.Clear()
CurrentImageList.Images.Clear()
ListBoxVirtuelle.Items.Clear()

For Each foundImage As String In _
My.Computer.FileSystem.GetFiles( _
"D:\images", _
FileIO.SearchOption.SearchTopLevelOnly, "*.gif*", "*.jpg*", "*.bmp*")

CurrentImageList.Images.Add(Image.FromFile(foundImage))
ListView1.Items.Add(New ListViewItem(New String() {""}, l - 1))
ListView1.View = View.LargeIcon
ListBoxVirtuelle.Items.Add(foundImage)
l = l + 1
Next

End Sub

Public Sub LoadVideo()

m = 1
ListView1.Items.Clear()
CurrentImageList.Images.Clear()
ListBoxVirtuelle.Items.Clear()

For Each FoundVideo As String In _
My.Computer.FileSystem.GetFiles( _
"D:\videos", _
FileIO.SearchOption.SearchTopLevelOnly, "*.gif*")

CurrentImageList.Images.Add(Image.FromFile(FoundVideo))
ListView1.Items.Add(New ListViewItem(New String() {""}, m - 1))
ListView1.View = View.LargeIcon
'ListBoxVirtuelle.Items.Add(FoundVideo)
m = m + 1
Next

For Each foundvideo As String In _
My.Computer.FileSystem.GetFiles( _
"D:\videos", _
FileIO.SearchOption.SearchTopLevelOnly, "*.gif*", "*.avi*")
ListBoxVirtuelle.Items.Add(foundvideo)
Next

End Sub

Private Sub btnValidateSettings_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValidateSettings.Click

If radiobtnBitmap.Checked Then
format = ".bmp"
ElseIf radiobtnGif.Checked Then
format = ".gif"
ElseIf radiobtnJPEG.Checked Then
format = ".jpg"
End If

'select first video device
Me.AxltmmCaptureCtrl1.VideoDevices.Selection = 0

'use(preview)
Me.AxltmmCaptureCtrl1.Preview = True
ValidateOK = True

End Sub

Private Sub btnCapture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCapture.Click

If ValidateOK = True Then

On Error GoTo ErrorHandle
AxltmmCaptureCtrl1.CapturePicture.Save("D:\Images" & DateHeure & format) 'L'erreur se produit ICI a partir de la seconde capture

LoadImage()

ErrorHandle:
MsgBox(Err.Description)

Err.Clear()

Else
MsgBox("Erreur, Vous n'avez pas valide de configuration")
End If
End Sub

Private Sub btnRecord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRecord.Click


If ValidateOK = True Then

On Error GoTo ErrorHandle
AxltmmCaptureCtrl1.StartCapture(1)


Else
MsgBox("Erreur, Vous n'avez pas valide de configuration")
End If

ErrorHandle:
MsgBox(Err.Description)
AxltmmCaptureCtrl1.StopCapture()
Err.Clear()


End Sub

Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click


AxltmmCaptureCtrl1.StopCapture()
On Error GoTo ErrorHandle
AxltmmCaptureCtrl1.CapturePicture.Save("D:\videos" & DateHeure & ".gif")


AxltmmCaptureCtrl1.CopyTarget("D:\videos" & DateHeure & ".avi", False)
My.Computer.FileSystem.DeleteFile("c:\capture.avi") ' supprime la sauvegarde automatique
ComboBox3.Text = ComboBox3.Items.Item(1)
LoadVideo()

ErrorHandle:
MsgBox(Err.Description)
AxltmmCaptureCtrl1.StopCapture()
Err.Clear()

End Sub


Private Sub btnRefreshPictures_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefreshPictures.Click

StopDeviceFunction()
RefreshFunction()

End Sub

Private Sub ListView1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseClick


If ComboBox3.Text = ComboBox3.Items.Item(0) Then


PictureBox1.Visible = True
AxltmmCaptureCtrl1.Visible = False

Dim SelectedImageIndex As Integer = ListView1.FocusedItem.ImageIndex
Me.PictureBox1.ImageLocation = ListBoxVirtuelle.Items(SelectedImageIndex)

ElseIf ComboBox3.Text = ComboBox3.Items.Item(1) Then

AxltmmPlayCtrl1.Visible = True
AxltmmCaptureCtrl1.Visible = False
Dim q As Integer = 1

Dim SelectedImageIndex As Integer = ListView1.FocusedItem.ImageIndex
Dim video As String = ListBoxVirtuelle.Items.Item(SelectedImageIndex) 'Donne le chemin du fichier selectionne

Dim Fichier As String
Fichier = System.IO.Path.GetFileName(video).Split(".")(0) 'Donne le nom du fichier sans l'extension

AxltmmPlayCtrl1.sourcefile = "D:\videos" & Fichier & ".avi"

AxltmmPlayCtrl1.Run()

End If

End Sub

Private Sub btnGoToLiveMode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGoToLiveMode.Click
PictureBox1.Visible = False
AxltmmCaptureCtrl1.Visible = True
AxltmmPlayCtrl1.Visible = False
End Sub


Private Sub btnLeaveTheLiveMode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLeaveTheLiveMode.Click
PictureBox1.Visible = True
AxltmmCaptureCtrl1.Visible = False
AxltmmPlayCtrl1.Visible = False
End Sub

Private Sub ComboBox3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox3.SelectedIndexChanged
If ComboBox3.Text = ComboBox3.Items.Item(0) Then
CurrentImageList = ImageList1
ListView1.StateImageList = CurrentImageList
ListView1.LargeImageList = CurrentImageList
ElseIf ComboBox3.Text = ComboBox3.Items.Item(1) Then
CurrentImageList = ImageList2
ListView1.StateImageList = CurrentImageList
ListView1.LargeImageList = CurrentImageList
End If
End Sub

Private Sub RefreshFunction()

If ComboBox3.Text = ComboBox3.Items.Item(0) Then
AxltmmPlayCtrl1.Visible = False
AxltmmCaptureCtrl1.Visible = False
PictureBox1.Visible = True
LoadImage()
ElseIf ComboBox3.Text = ComboBox3.Items.Item(1) Then
AxltmmCaptureCtrl1.Visible = False
PictureBox1.Visible = False
AxltmmPlayCtrl1.Visible = True
LoadVideo()
End If

End Sub

Private Sub btnStopDevice_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStopDevice.Click
StopDeviceFunction()
End Sub

Private Sub StopDeviceFunction()
Me.AxltmmCaptureCtrl1.Preview = False
End Sub

End Class

*****************************************************

La commande que j'utilise (AxltmmCaptureCtrl1.CapturePicture.Save), parait bien. Ca a marche mais je crois que le bug est la depuis que j'utilise la variable "now" dans le nom de l'image que je veux enregistrer. Est-ce possible?

Je sais plus trop quoi faire la...
Messages postés
13
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
5 août 2009

Essayes avec ca : syntaxe un peu différente du fait de forcer le tout en String par sécurité mais résultat de chaine identique.

Dim oDateHeure As String = Date.Now.Day.ToString & "-" & Date.Now.Month.ToString & "-" & Date.Now.Year.ToString & " " & Date.Now.Hour.ToString & "h" & Date.Now.Minute.ToString & "m" & Date.Now.Second.ToString & "s"
1 2