IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

image.fromfile Out Of Memory Exception


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut image.fromfile Out Of Memory Exception
    Bonjour,

    je sèche sur une erreur qui n'a pas l'air simple à comprendre.

    je suis en train de créer un programme dans lequel je pourrais renommer mes images selon leur date de prise de vue.
    pour ce faire, je sélectionne le dossier et parcours les fichiers de ce dossier.
    si c'est du ".jpg" j'utilise image.fromfile("blabla.jpg") pour récupérer cette info.
    Cela fonctionne sur des petits dossiers, mais j'en ai un pour lequel ça plante, vers la 40é image parcourue. Le message d'erreur indique : OutOfMemoryException

    Or, cette image n'est pas plus grosse que les autres ( elles font dans ce dossier environ 2,9Mo chaque). Quand je renomme l'image qui a "planté" le programme pour la faire passer avant dans la boucle, ça fonctionne puis c'est une nouvelle image, tjrs vers la 40e position qui plante. ??

    C'est vraiment un pbm de mémoire ?

    Help. Jeremy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            ListV1_initialize()
     
            Dim folderbrowser As New FolderBrowserDialog
            If folderbrowser.ShowDialog = Windows.Forms.DialogResult.OK Then
     
                Dim folder = New System.IO.DirectoryInfo(folderbrowser.SelectedPath)
                Dim folderFi As IO.FileInfo() = folder.GetFiles("*.*")
                Dim Fi As IO.FileInfo
     
                Dim arr(5) As String
                Dim itm As ListViewItem
     
                Dim img As Image
                Dim prop As PropertyItem
                Dim sDate As String
                Dim dateTimeOriginal As DateTime
     
     
     
                For Each Fi In folderFi
     
                    arr(0) = Fi.Name
                    arr(1) = Math.Round((Fi.Length) / 1024, 0)
                    arr(1) = Format(Int(arr(1)), "# ### ###") & " Ko"
                    arr(2) = Fi.Extension
                    arr(3) = Fi.CreationTime
     
                    'si le fichier est une image, je lis son EXIF, sinon je sors.
                    If arr(2) = "JPG" Then
                        'utilisation de system.drawing.imaging 
                        'img = Image.FromFile(Fi.FullName) 'recupere le chemin complet de l'image pour la date_prise_de_vue 
                        prop = img.GetPropertyItem(&H9003)
                        sDate = Encoding.ASCII.GetString(prop.Value, 0, prop.Len).TrimEnd(Chr(0))
                        dateTimeOriginal = DateTime.ParseExact(sDate, "yyyy:MM:dd HH:mm:ss", Nothing)
                        arr(4) = dateTimeOriginal
     
     
                    Else
     
                        arr(4) = " not a pic"
     
                    End If
     
                    itm = New ListViewItem(arr)
                    ListV1.Items.Add(itm)
                    ' msg pour visualiser où ca plante     MsgBox(arr(0))
     
                Next
     
     
     
            End If
     
     
        End Sub
    Jérémy

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir jerem7w,



    Donc pour résoudre tout ca :

    1- Lorsqu'on travaille avec des images il devient primordial de vérifier le mimeType du fichier et NON simplement son extension ainsi tu sera certains de travailler avec une image du type souhaité (Jpg, png, gif,...etc...) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
        Public Function isJpgMimeType(Filepath$) As Boolean
                Try
                    Dim id As Guid = GetGuidID(filepath)
                    If id = ImageFormat.Jpeg.Guid Then
                        Return True
                    End If
                Catch
                    Return False
                End Try
                Return False
            End Function
     
      Private Function GetGuidID(Filepath$) As Guid
                Dim imagedata As Byte() = File.ReadAllBytes(filepath)
                Dim id As Guid
                Using ms As New MemoryStream(imagedata)
                    Using img As Image = Image.FromStream(ms)
                        id = img.RawFormat.Guid
                    End Using
                End Using
                Return id
            End Function
    2- Quand on utilise la méthode "FromFile" de la classe Bitmap ou image il ne faut pas oublier de disposer l'objet ! Mais je te recommande l'utilisation de cette méthode pour charger ton image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Public Function returnImage(FilePath$) As Image
            Using fs As New FileStream(FilePath, FileMode.Open, FileAccess.Read)
                Return Image.FromStream(fs)
            End Using
        End Function

    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut
    bonjour,

    je me penche sur votre réponse, je suis pour l'instant loin de comprendre pourquoi et comment me servir de la méthode FileStream.

    je vous tiens au courant.

    Merci

    jeremy
    Jérémy

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut
    Bonjour,

    c'est parfait, avec FileStream l'erreur a bien disparu.

    Merci
    Jérémy

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonsoir Messieurs,

    J'ai besoin de votre aide pour le même problème de mémoire que vous évoquez suite à l'utilisation du "Image.fromfile"
    Je cherche un lister dans un listview à 3 colonnes, tous les fichiers *.jpg présent dans un répertoire avec la particularité suivante :

    1ère colonne : Chemin du fichier / 2ème colonne : Largeur de l'image / 3ème colonne : Hauteur de l'image

    Mon code fonctionne sur un PC mais pas sur un autre. Le second PC m'évoque l'erreur de mémoire. Mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Dim Repertoire As New System.IO.DirectoryInfo("D:\Photos\")
    Repertoire_images = "D:\Photos\"
     
    Dim ListeFichier() As System.IO.FileInfo = Repertoire.GetFiles
    'Ajout d'un filtre afin d'ouvrir que les fichiers *.jpg
    ListeFichier = Repertoire.GetFiles("*.jpg")
     
    ListView1.Clear()
    Me.ListView1.View = View.Details
                With Me.ListView1
                    .Columns.Add("Fichier", 100, HorizontalAlignment.Left)
                    .Columns.Add("Largeur", 60, HorizontalAlignment.Left)
                    .Columns.Add("Hauteur", 60, HorizontalAlignment.Left)
                End With
     
    Dim cmpt As Int32
                For cmpt = 0 To ListeFichier.GetUpperBound(0)
                    With Me.ListView1.Items.Add(Repertoire_images & ListeFichier(cmpt).Name, imageIndex:=1)
                        'On récupère les dimensions est on les met dans les colonnes suivantes
                        Dim sz As Size = Image.FromFile(Repertoire_images & ListeFichier(cmpt).Name).Size
                        .SubItems.Add(sz.Width.ToString) 'Largeur
                        .SubItems.Add(sz.Height.ToString) 'Hauteur
                    End With
                Next
    Pourrais-je vous demander de corriger mon code pour retirer ce problème de mémoire ?

    En vous remerciant par avance.
    Eric

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim img = Image.FromFile(Repertoire_images & ListeFichier(cmpt).Name)
    Dim sz As Size = img.Size
    img.Dispose() ' libère la mémoire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Avec un peu de retard, merci pour la solution. C'est exactement ce que je cherchais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PictureBox/Image -> Out of Memory
    Par Neiflheim dans le forum VB.NET
    Réponses: 4
    Dernier message: 20/05/2011, 11h54
  2. Memoire JVM et out of memory exception
    Par aelmalki dans le forum Général Java
    Réponses: 5
    Dernier message: 20/03/2010, 22h58
  3. Out of memory exception
    Par gabdeschenes dans le forum ASP.NET
    Réponses: 7
    Dernier message: 14/05/2009, 17h26
  4. Tableau d'images et ACP out of memory
    Par soeursourire dans le forum Images
    Réponses: 6
    Dernier message: 08/02/2008, 12h03
  5. "out of memory exception" sur un picturebox[VB 2005.net]
    Par philippe carel dans le forum Windows Forms
    Réponses: 6
    Dernier message: 23/07/2006, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo