petit didacticiel sur le entpete et maker des fichier jpeg.
y a plus q"à copier-coller pour améliore grandement la vitesse d'affichage des fichier jpeg.
D'habitude il faut 'peindre' 2 images (une pour interroger la taille, l'autre pour l'affichage). Là, y en a s'une est c'est 2 fois plus rapide
Source / Exemple :
Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub
Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive
End Sub
Private Sub File1_Click()
Dim hauteur As Variant
Dim largeur As Variant
Dim image As String
Dim a0 As Byte
Dim a1 As Byte
Dim a10 As Long
If File1.ListCount > 0 Then
For i = 0 To File1.ListCount - 1
If File1.Selected(i) Then
If Right(File1.Path, 1) <> "\" Then
image = File1.Path & "\" & File1.List(i)
Else
image = File1.Path & File1.List(i)
End If
End If
Next i
End If
' ouverture du fichier
' c'est 5 car dans mon autre source 1 et 2 était pris
Open image For Binary As #5 Len = 1024
' les markers sont de type FFXX suivi de 2 octets, sa taille
' on trouve normalement
' en 1 : FFD0 le SOI marker, sa taille est donc en octet 3
' en 2 FFE0 (jfif marker)
' ensuite FFDB(quantizise)/FFEC(?)/FFEE(commentaire)
' enfin le FFCx (avec x=0,1,2,3,5,6,7,9,a,b,d,e,f) les autes sont pas bons
' c'est le début de l'image, ke x, c'est le début de codage
' puis FFC4 (table de huffman) et le FFDA (start odf scan)
' et à la fin FFD9 : fin d'image
' le nombre de marker est variable, donc fo chercher
Get #5, 1, a0
Get #5, 2, a1
' vérification de l'entête, le jpg c'est FFD8
If (a0 = 255 And a1 = 216) Then
a10 = 3
For i = 1 To 10
' a10 pointe sur l'entête du marker
' la boucle limitée à 10 recherches permet que ça plante pas sur 'EOF' dès qu'un fichier est pas bon
Get #5, a10, a0
Get #5, a10 + 1, a1
If (a1 = 192 Or a1 = 193 Or a1 = 194 Or a1 = 195 Or a1 = 197 Or a1 = 198 Or a1 = 199 Or a1 = 201 Or a1 = 202 Or a1 = 203 Or a1 = 205 Or a1 = 206 Or a1 = 207) Then
' par exemple FF C0 00 11 08 05 E0 03 E8
' FF C0 : début de frame
' 00 11 : la taille de ce marker (17 octets), a10 pointe sur 00
' 08 : P (sample precision = 8 quasi toujours)
' 05 E0 : Y (hauteur)
' 03 E8 : X (laurgeur)
Get #5, a10 + 5, a0
Get #5, a10 + 6, a1
' a10 et hauteur sont de long, a1 et a2 des bytes
' le & permet de pas générer d'erreur en dessus de 32736
' le calcul se fait en long comme ça au lieu de interger par défaut
hauteur = 256& * a0 + a1
Get #5, a10 + 7, a0
Get #5, a10 + 8, a1
largeur = 256& * a0 + a1
i = 20
'MsgBox ("H=" + Str(hauteur) + "- L=" + Str(largeur))
End If
Get #5, a10 + 2, a0
Get #5, a10 + 3, a1
' a10 : ancien offset
' a0*256+a1 : offset du à la taille du marker
' et le 2, c'est l'offset pour la taille de l'entête du marker FFXX
a10 = 2& + a10 + a0 * 256& + a1
Next i
Label1 = "H=" + Str(hauteur) + " - L=" + Str(largeur)
Else
Label1 = "En tête non standard" + Str(a0) + Str(a1)
End If
Close #5
' si i= 11, pas de frame valide trouvée
' si i=21, frame valide touvée
If (i = 11) Then
Label1 = "pas de frame valable trouvée ou plus de 10 marker"
End If
End Sub
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.