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

Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 30 juil. 2009 à 11:47 - Dernière réponse : cs_saxor 13 Messages postés samedi 4 avril 2009Date d'inscription 5 août 2009 Dernière intervention
- 31 juil. 2009 à 14:34
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
Afficher la suite 

Votre réponse

24 réponses

Meilleure réponse
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 31 juil. 2009 à 13:54
3
Merci
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

Merci Chiche69 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Chiche69
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 30 juil. 2009 à 12:09
0
Merci
Salut,

Pourquoi ne pas utiliser des sources en c# ou vb.net qui sont dispo sur ce site.
Au lieu d'utiliser un ACTIVEX.
Commenter la réponse de nhervagault
cs_saxor 13 Messages postés samedi 4 avril 2009Date d'inscription 5 août 2009 Dernière intervention - 30 juil. 2009 à 12:19
0
Merci
Bonjour,

A quoi correspond ton format?
Commenter la réponse de cs_saxor
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 30 juil. 2009 à 13:26
0
Merci
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
Commenter la réponse de Chiche69
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 30 juil. 2009 à 13:38
0
Merci
Je pensais à des sources de type

lien 1

Lien 2
Commenter la réponse de nhervagault
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 30 juil. 2009 à 13:50
0
Merci
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...
Commenter la réponse de Chiche69
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 30 juil. 2009 à 14:05
0
Merci
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
Commenter la réponse de nhervagault
cs_saxor 13 Messages postés samedi 4 avril 2009Date d'inscription 5 août 2009 Dernière intervention - 30 juil. 2009 à 14:17
0
Merci
Ça peut paraitre idiot mais ne faut-il pas que tu "vides" le contenu de ton contrôle AxltmmCaptureCtrl1 avant de t'en resservir?
Commenter la réponse de cs_saxor
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 30 juil. 2009 à 14:20
0
Merci
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?
Commenter la réponse de Chiche69
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 30 juil. 2009 à 14:28
0
Merci
"Ç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...
Commenter la réponse de Chiche69
cs_saxor 13 Messages postés samedi 4 avril 2009Date d'inscription 5 août 2009 Dernière intervention - 30 juil. 2009 à 14:36
0
Merci
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
Commenter la réponse de cs_saxor
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 30 juil. 2009 à 14:56
0
Merci
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...
Commenter la réponse de Chiche69
cs_saxor 13 Messages postés samedi 4 avril 2009Date d'inscription 5 août 2009 Dernière intervention - 30 juil. 2009 à 15:13
0
Merci
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.
Commenter la réponse de cs_saxor
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 30 juil. 2009 à 15:51
0
Merci
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
Commenter la réponse de Chiche69
cs_saxor 13 Messages postés samedi 4 avril 2009Date d'inscription 5 août 2009 Dernière intervention - 30 juil. 2009 à 16:10
0
Merci
Et si tu mets tout le code dans le même bouton?
Ça débute le screenshot, ça capture et ça s'arrête.
Commenter la réponse de cs_saxor
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 30 juil. 2009 à 16:14
0
Merci
j'ai essaye mais ca ne prend pas de capture... ca fait rien
Commenter la réponse de Chiche69
cs_saxor 13 Messages postés samedi 4 avril 2009Date d'inscription 5 août 2009 Dernière intervention - 30 juil. 2009 à 16:32
0
Merci
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
Commenter la réponse de cs_saxor
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 30 juil. 2009 à 16:57
0
Merci
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.
Commenter la réponse de Chiche69
Chiche69 34 Messages postés mercredi 24 juin 2009Date d'inscription 25 septembre 2010 Dernière intervention - 31 juil. 2009 à 11:01
0
Merci
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...
Commenter la réponse de Chiche69
cs_saxor 13 Messages postés samedi 4 avril 2009Date d'inscription 5 août 2009 Dernière intervention - 31 juil. 2009 à 11:41
0
Merci
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"
Commenter la réponse de cs_saxor

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.