Classes pour recuperer des infos sur les fichiers bmp,gif,png,jpg,avi,mp3

Soyez le premier à donner votre avis sur cette source.

Vue 9 151 fois - Téléchargée 1 047 fois

Description

Voilà des classes pour récupérer des infos sur des images (jpeg, png, gif et bmp), des musiques (mp3, tag v1 uniquement) et des vidéos (fichiers avi). Code ultra-commenté.

Méthodes de récupération des infos :
-mp3 ==> lecture dans le fichier
-images ==> lecture dans le fichier
-videos ==> APIs windows

Infos récupérables :

Video :
-Fichier
-Largeur
-Hauteur
-Frames
-Rate
-Scale
-Stream
-Débit max
-Type
-Durée
-Streams modifiés
-Images par secondes
-Heures
-Minutes
-Secondes

Images :
-type
-hauteur
-largeur

mp3 :
-Album
-Artiste
-Commentaire
-Genre
-Titre
-Numéro de piste
-Année

Pas grand grand chose à apprendre dans ces lignes de code, ci se n'est l'utilisation des APIs citées dessous, la lecture dans un fichier et l'utilisation des classes.

Source / Exemple :


Un exemple très clair dans le *.zip pour utiliser toutes les classes.

APIS utilisées :

'-----------------------------------------------
Private Declare Function AVIFileOpen Lib "avifil32" Alias "AVIFileOpenA" (ppfile As Long, ByVal szFile As String, ByVal mode As Long, pclsidHandler As Any) As Long
Private Declare Function AVIFileRelease Lib "avifil32" (ByVal pfile As Long) As Long
Private Declare Function AVIFileInfo Lib "avifil32" Alias "AVIFileInfoA" (ByVal pfile As Long, pfi As AVIFileInfo, ByVal lSize As Long) As Long
Private Declare Sub AVIFileInit Lib "avifil32" ()
Private Declare Sub AVIFileExit Lib "avifil32" ()

Conclusion :


NOTE 0 : j'ai récupéré sur le net les adresses des octets pour la lecture des infos (pour les images). Par conséquent, j'ai gardé la procédure allant avec ainsi que deux sous fonctions de conversion ; ces lignes de code NE SONT PAS DE MOI (mais je sais pas de qui...)
Voir les commentaires dans ma source.

NOTE 1 : récupération des tags des mp3 V1 ==> récupère en FIN DE FICHIER ==> l'année est parfois tronquée d'un carcactère pour certains fichiers

NOTE 2 : Commentez et notez svp ;)

NOTE 3 : On peut récupérer beaucoup plus d'infos sur ces fichiers par d'autres méthodes, voir les sources de ShareVB pour çà. Mais là, l'avantage est que c'est léger et rapide.

NOTE 4 : Fichiers sources qui apparaitront bientot dans un programme de renommage de fichiers de manière massive, qui lui même apparaitra plus tard comme outils dans un éditeur hexa. Je subdivise mes sources pour faciliter le partage et la recherche d'informations.

Merci, @+

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012

Dommage qu'il n'y ait pas plus de commentaires sur cette source pourtant utile, même si l'on est pas obligé de tout prendre.

Toujours concernant la dimension d'un JPEG, j'ai été confronté à une autre erreur, encore due à une image 'incorrecte'.
Dans la procédure GetImageInfos(), il y a la ligne suivante:
If lPos >= lngSize - 10 Then Exit Sub
Le 'exit sub' est mal employé car le fichier image a déjà été ouvert (Open sFile...) et n'est pas refermé.
Il faut remplacer cette ligne par:
If lPos >= lngSize - 10 Then GoTo ErrGestion 'Faut refermer ce fichier déjà ouvert
car l'étiquette ErrGestion referme ce fichier image (Close #lFile).

Mais pour les curieux, faut préciser que la procédure fonctionne trés bien pour des images 'correctes'.
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012

Merci à toi. En ce qui me concerne, c'est la dimension d'un JPEG qui m'intéresse... Même si j'ai du mal à comprendre le code.
Par contre, j'ai une image JPG qui a fait planter ton code au niveau de GetImageInfos() lié à BEWord(position). J'ai donc très légèrement modifié le code comme suit:
(le résultat donne simplement une dimension nulle et évite le plantage dans ce cas particulier)

'---------------------------------------------
GetImageInfos():
'---------------------------------------------
Public Sub GetImageInfos()
Dim i As Long
Dim lFile As Long
Dim lngWidth As Long
Dim lngHeight As Long
Dim tType As IMAGE_EXTENSION_TYPE
Dim lngSize As Long
Dim bDimNotFound As Boolean 'titicar

On Local Error GoTo ErrGestion

'par défaut
lngWidth = 0
lngHeight = 0
tType = lUNKNOWN

'ouverture du fichier en lecture binaire
lFile = FreeFile
Open sFile For Binary Access Read As #lFile

lngSize = LOF(lFile)
ReDim bytBuffer(lngSize) 'dimensionne à la taille du fichier

'récupère le buffer
Get #lFile, 1, bytBuffer()

'vérifie le header ==> PNG
If bytBuffer(0) 137 And bytBuffer(1) 80 And bytBuffer(2) = 78 Then
tType = lPNG
lngWidth = BEWord(18)
lngHeight = BEWord(22)
End If
'vérifie le header ==> GIF
If bytBuffer(0) 71 And bytBuffer(1) 73 And bytBuffer(2) = 70 Then
tType = lGIF
lngWidth = LEWord(6)
lngHeight = LEWord(8)
End If
'vérifie le header ==> BMP
If bytBuffer(0) 66 And bytBuffer(1) 77 Then
tType = lBMP
lngWidth = LEWord(18)
lngHeight = LEWord(22)
End If
'vérifie le header ==> JPG
If tType = lUNKNOWN Then
'rien de particulier à dire, on tritouille les bytes à la recherche des infos
'bloc de fonctions trouvé sur le net, mais je ne sais plus où -__-'
Dim lPos As Long
Do
If (bytBuffer(lPos) &HFF And bytBuffer(lPos + 1) &HD8 And bytBuffer(lPos + 2) = &HFF) _
Or (lPos >= lngSize - 10) Then Exit Do
lPos = lPos + 1
Loop
lPos = lPos + 2
If lPos >= lngSize - 10 Then Exit Sub
Do
Do
If bytBuffer(lPos) = &HFF And bytBuffer(lPos + 1) <> &HFF Then Exit Do
lPos = lPos + 1
If lPos >= lngSize - 10 Then Exit Sub
Loop
lPos = lPos + 1
If (bytBuffer(lPos) >= &HC0) And (bytBuffer(lPos) <= &HC3) Then Exit Do
lPos = lPos + BEWord(lPos + 1)
If lPos >= lngSize - 10 Then Exit Sub
If lPos < 0 Then 'titicar
bDimNotFound = True 'titicar
Exit Do 'titicar
End If 'titicar
Loop
tType = lJPG
If bDimNotFound = False Then 'titicar
lngHeight = BEWord(lPos + 4)
lngWidth = BEWord(lPos + 6)
End If 'titicar
End If

'affectation des valeurs aux variables publiques de la classe
Me.lHeight = lngHeight
Me.lWidth = lngWidth
Me.sType = ImageType2String(tType)

ErrGestion:

'vide le tableau (buffer)
ReDim bytBuffer(0)
'referme le fichier
Close #lFile
End Sub

'---------------------------------------------
BEWord(position):
'---------------------------------------------
Private Function BEWord(position As Long) As Long
Dim x1 As WordBytes
Dim x2 As WordWrapper
x1.byte1 = bytBuffer(position + 1)
x1.byte2 = bytBuffer(position)
LSet x2 = x1
BEWord = x2.Value
'titicar: _
S'il y a un défaut dans le fichier image, il peut arriver que x2.value soit INFERIEUR à Zéro, _
ce qui est théoriquement impossible (j'ai un JPG avec ce problème). _
On fait donc ce test, sinon le programme passe dans une boucle sans fin, et donc plantage. _
Après quoi, dans la procédure appelante, il faut tester si la valeur final BEWord (dans notre cas, _
associé à position) est <0, et réagir en conséquence, ce qui est fait dans GetImageInfos(). _
Libre à chacun d'ajouter une nouvelle propriété du genre ImageNonValide dans cette classe.
If BEWord < 0 Then BEWord = -position - 1 'Pour être sûr que le résultat soit négatif dans GetImageInfos()'titicar
End Function
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Salut, merci pour le commentaire.

Moi personnellement je n'ai rien codé pour changer les tags, mais je te conseille cette source :
http://www.vbfrance.com/codes/YOMMMP3TAG-V2-EDITEUR-TAGV1-V2-V2-POUR-MP3_24252.aspx

@+
Messages postés
29
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
4 décembre 2007

bonjour

bravo pour cette source.
- est-ce-que tu n'a pas un code pour retager les mp3
a+
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
Oh yeah, merci bcp pour l'info, je vais aller voir de ce pas ;)
@+
Afficher les 9 commentaires

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.