Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LIRE LA TAILLE D'UNE IMAGE D'UN FICHIER JPEG (TRÈS RAPIDE)


Information sur la source

Catégorie :API Niveau : Débutant Date de création : 19/09/2003 Date de mise à jour : 19/09/2003 21:01:07 Vu / téléchargé: 6 650 / 519

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

Description

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

  • 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
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


Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de z980x le 19/09/2003 21:23:36

J'ai pas tres bien compris, tu veux connaitre la taille du fichier jpeg? (en octets?)

Si c'est ca, rien de plus simple :

MsgBox Len(File1.Path & "" & File1.FileName)

signaler à un administrateur
Commentaire de pascal16m le 19/09/2003 22:04:55

c'est marqué dans le titre, c'est la taille d'une image d'un fichier JPEG, les dimensions hauteur et largeur de l'image qu'il renferme quoi.

signaler à un administrateur
Commentaire de Snoow le 04/11/2003 15:01:44

Sympa ce bout de code !

Petite question : l'image qui est contenue dans #5 , est-ce qu'il est possible de l'afficher directement dans un PictureBox ou dans un objet Image ?

(par ce que mon image provient d'un flux, et je ne souhaite pas l'écrire sur le disque : trop lent)

signaler à un administrateur
Commentaire de pascal16m le 04/11/2003 22:05:54

là, je sais pas.
mais en lui indiquent que c'est un pointeur sur une image jpeg, ça doit marcher.
Le jpeg est compressé, c'est pas un simple tableau RGB  comme le BMP.

signaler à un administrateur
Commentaire de Sator2 le 04/04/2006 06:29:04

Salut tout le monde ... petite question...
si on fait: (demande 2 labels et une image....)
Label1.Caption = "Hauteur : " & LoadPicture(chemin).Height
Label2.Caption = "Largeur : " & LoadPicture(chemin).Width
N'arrivons-nous pas à la même chose???
@+ Sator

signaler à un administrateur
Commentaire de pascal16m le 04/04/2006 14:36:42

Ca c'est du deterrage
quand une photo est redimentionnée lors de son ouverture pour loger dans un controle picture ou image, il me semble qu'il te donne la taille de l'image redimentionnée.

Je pense qu'il existe une fonction toute faite qui donne toujours la bonne taille, mais je la connais pas.

J'ai quelques images où il y a un décalage d'1 ou 2 octets à l'intérieur du fichier, je sais pas pourquoi, et la fonction se trompe

sinon, lequel des deux se trompe ?

signaler à un administrateur
Commentaire de TFlorian le 25/11/2007 01:12:08 10/10

GÉNIAL !
J'ai réussi à récupérer des images suite à un formatage d'un disque...
Après la récupération des fichiers les photos mes images ne faisaient plus que 160 x 120 au lieu de 1600 x 1200 ..
Grâce a ton code j'ai compris la structure du JPEG et j'ai réussi à le décortiquer pour récupérer mes images HD ..
(Lorsque le fichier n'avait pas été trop détruit dut à une fragmentation trop importante du disque.. )

D'un point de vue perf, je préfère ta méthode que les méthodes toutes faire car on ne lit qu'une seule foi le fichier (sur le disque) alors que les APIs des Windows comme on les appels plusieurs fois, font plusieurs accès disque

Encore merci, et bonne prog a tous ;-)


TFlorian

signaler à un administrateur
Commentaire de pascal16m le 25/11/2007 11:56:21

Merci Florian,
le but de ce code était de voir un peu comment était fait le Jpeg.
en rechercanht sur internet, j'avais trouvé pas mal de dossiers assez épais sur la structure jpeg.
J'avais mi ce bout de code pour en faire un résumé.
La boucle 1 à 10 est pas terrible, mais ça évite d'avoir plus de ligne de code pour gérer les images HS (et c'est pas rare sur les images téléchargées) que pour afficher 2 chiffres.


pour les fonctions :
Label1.Caption = "Hauteur : " & LoadPicture(chemin).Height
Label2.Caption = "Largeur : " & LoadPicture(chemin).Width
J'ai pas trop pigé pourquoi je ne retombais pas sur la taille en twips, mais c'est bien ça en théorie. Sauf que pour afficher deux nombre, il charge deux fois l'image en mémoire. C'est tres long, surtout sur de grandes images.
Vu que windows affiche les excifs, il doit y avoir des fonctions API rapides pour le faire rapidement.
L'avantage avec ce bout de code, c'est de ne lire que le début de l'image et une seule fois et c'est rapide.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.