Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) | |
| | |
Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Lun 29 Mar 2010 - 21:54 | |
| Après avoir bien galéré, voici une tentative pour retrouver rapidement, avec les moyens Panoramic (donc en limitant les lectures disque au maximum), les dimensions d'une image au format .jpg. J'ai fait au plus simple possible, et s'il y a quelques contrôles élémentaires, j'ai fait l'impasse sur le codage Motorola dans le cas des Exifs (indiqué par 'MM' dans l'entête, au lieu du 'II' de Intel), qui présente les valeurs dans l'ordre inverse (poids forts/poids faibles), personnellement je n'en ai pas vu de ce format. C'est présenté sous forme de sous-programme, donc facilement intégrable n'importe où. Le format jpg est très compliqué, je ne cite ici que les balises (marqueurs) indispensables au calcul. - Code:
-
DIM f$, w%, h%, o1%, o2%, o3%, o4%, v%(10), j%, offs%, ad, er$ LABEL DimJpg, reter
f$ = "C:\Graph\Jpg\Dali\Dali03.jpg": ' ************** A MODIFIER ************* GOSUB DimJpg PRINT f$: PRINT " " +STR$(w%) + " x " + STR$(h%) END
DimJpg: ' Recherche des dimensions en pixels (largeur et hauteur) d'une image f$ format jpg ' rendues dans w% et h% FILEBIN_OPEN_READ 1, f$ FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: FILEBIN_READ 1, o3% IF o1%<>255 OR o2%<>216 OR o3%<>255 THEN er$ = "en-tête non FFD8FF": GOTO reter FILEBIN_READ 1, o1%: IF o1%<>224 AND o1%<>225 THEN er$ = "pas E0 ou E1": GOTO reter IF o1% = 224 ' ***** C'est un fichier sans Exifs ***** FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: offs% = 256*o1% + o2%: ad = 4 FOR j% = 1 TO 5: FILEBIN_READ 1, v%(j%): NEXT j% IF v%(1)<>74 OR v%(2)<>70 OR v%(3)<>73 OR v%(4)<>70 OR v%(5)<>0 er$ = "pas de JFIF": GOTO reter END_IF ' Recherche du marqueur 'FFC0' (séquence FF C0 00 11 08 xx xx yy yy) REPEAT FILEBIN_POSITION 1, ad + offs% FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: ' marqueur 'FFxx' ad = FILEBIN_POS(1) FILEBIN_READ 1, o3%: FILEBIN_READ 1, o4%: offs% = 256*o3% + o4% UNTIL o2% = 192 FOR j% = 1 TO 5: FILEBIN_READ 1, v%(j%): NEXT j% h% = 256*v%(2) + v%(3): w% = 256*v%(4) + v%(5) ELSE ' ***** C'est un fichier avec Exifs ***** ' recherche dans les marqueurs A0xx des Exifs (le marqueur FFC0 contenant ' les dimensions de la miniature et non celles de l'image elle-même). ' Pour alléger, on ne prend en compte ici que le codage Intel (en-tête = 'ExifooII'). ' Si le codage est Motorola ('ExifooMM') il faut inverser les séquences de recherche ' ci-dessous: 02A0, 03A0, 04A0 au lieu de A002, A003, A004, et aussi ' inverser la prise en compte des résultats. REPEAT REPEAT REPEAT FILEBIN_READ 1, o1% UNTIL o1% = 160: ' recherche 'A002' ou 'A003' ou A004' FILEBIN_READ 1, o1% UNTIL o1% = 2 OR o1% = 3 OR o1% = 4 FILEBIN_POSITION 1, FILEBIN_POS(1) + 5 FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2% w% = o1% + 256*o2% UNTIL w% > 10: ' la 1ère séquence trouvée contient la valeur 1, on reboucle ' la séquence 'A00x' suivante contient la hauteur REPEAT REPEAT FILEBIN_READ 1, o1% UNTIL o1% = 160: ' recherche 'A002' ou 'A003' ou 'A004' FILEBIN_READ 1, o1% UNTIL o1% = 2 OR o1% = 3 OR o1% = 4 FILEBIN_POSITION 1, FILEBIN_POS(1) + 5 FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2% h% = o1% + 256*o2% END_IF reter: FILEBIN_CLOSE 1 RETURN
Dernière édition par JL35 le Mar 30 Mar 2010 - 16:15, édité 1 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Mar 30 Mar 2010 - 13:46 | |
| Je ne l'ai pas encore décortiquée en détail, je l'ai juste essayée pour voir, mais ta formule a l'air encore plus rapide que tu ne le dis, en fait, c'est fabuleusement rapide ! (et ce, malgré que tu ne recherches pas la première marque de dimension) Un beau tour de force ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Mar 30 Mar 2010 - 14:09 | |
| Merci pour le compliment. En fait, pour les images sans exifs, la recherche se fait de marqueur en marqueur, chaque marqueur étant suivi de sa longueur, ce qui fait un minimum de lectures disque. Pour les images avec exifs, au lieu de rechercher les dimensions dans les marqueurs standards (FFC0 successifs), on les recherche dans les Exifs qui sont au début du fichier (marqueurs A002, A003 ...), ce qui fait de l'ordre de 400 lectures, ça va assez vite aussi, mais c'est beaucoup moins rapide que sans exifs. Mais il m'a fallu étudier les dumps des fichiers et les très rares documentations un peu abordables sur le sujet. Et faire pas mal d'essais ! Eh jjn4, qu'est-ce que tu dis de cette version simplifiée qui combine les deux cas et qui va à la vitesse de l'éclair puisqu'elle elle ne fait qu'une dizaine de lectures disque ? Et du coup je rajoute en prime le calcul pour les images BMP, GIF et TGA - Code:
-
DIM f$, w%, h%, o1%, o2%, o3%, o4%, v%(10), j%, offs%, ad, er$, s$ LABEL Dimimage, reter
f$ = "C:\Graph\Jpg\Dali\Dali03.jpg": ' ************** A MODIFIER ************* GOSUB Dimimage PRINT f$ IF er$ <> "" PRINT "ERREUR: " + er$ ELSE PRINT " " +STR$(w%) + " x " + STR$(h%) END_IF END
Dimimage: ' Recherche des dimensions en pixels (largeur et hauteur) d'une image f$ ' aux formats Jpg, Bmp, Gif ou Tga, rendues dans w% et h% er$ = "": s$ = UPPER$(RIGHT$(f$, 4)) FILEBIN_OPEN_READ 1, f$ IF s$ = ".JPG" FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: FILEBIN_READ 1, o3% IF o1%<>255 OR o2%<>216 OR o3%<>255 THEN er$ = "en-tête non FFD8FF": GOTO reter FILEBIN_READ 1, o1%: IF o1%<>224 AND o1%<>225 THEN er$ = "pas E0 ou E1": GOTO reter FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: offs% = 256*o1% + o2%: ad = 4 ' Recherche du marqueur 'FFC0' (séquence FF C0 00 11 08 xx xx yy yy) REPEAT FILEBIN_POSITION 1, ad + offs% FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: ' marqueur 'FFxx' ad = FILEBIN_POS(1) FILEBIN_READ 1, o3%: FILEBIN_READ 1, o4%: offs% = 256*o3% + o4% UNTIL o2% = 192 FOR j% = 1 TO 5: FILEBIN_READ 1, v%(j%): NEXT j% h% = 256*v%(2) + v%(3): w% = 256*v%(4) + v%(5) ELSE IF s$ = ".BMP" FILEBIN_POSITION 1, 18 FOR j% = 1 TO 8: FILEBIN_READ 1, v%(j%): NEXT j% w% = v%(1) + 256*v%(2) + 256*256*v%(3) + 256*256*256*v%(4) h% = v%(5) + 256*v%(6) + 256*256*v%(7) + 256*256*256*v%(8) ELSE IF s$ = ".GIF" FILEBIN_POSITION 1, 6 FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% w% = v%(1) + 256*v%(2): h% = v%(3) + 256*v%(4) ELSE IF s$ = ".TGA" FILEBIN_POSITION 1, 12 FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% w% = v%(1) + 256*v%(2): h% = v%(3) + 256*v%(4) END_IF END_IF END_IF END_IF reter: FILEBIN_CLOSE 1 RETURN (j'ai édité le 1er post juste pour changer le titre)Remarque: pour mesurer le temps, j'ai rebouclé sur la lecture d'environ 200 images différentes. Ce qui est curieux, c'est que ça met 2 ou 3 secondes, mais si on relance le programme tout de suite, c'est instantané ! Mon explication c'est que Windows a gardé en mémoire les accès fichiers précédents, et que les fois suivantes il ne relit pas physiquement sur le disque mais reprend les données restées en mémoire. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Mar 30 Mar 2010 - 22:57 | |
| Ouahhhhh ! Voilà Super-OW35 au mieux de sa forme !!! Là, c'est carrément la vitesse de l'éclair ! Surtout, ne t'arrête pas ! Continue à transformer ta formule ! Prochaine étape : le calcul des résutats du loto ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Mar 30 Mar 2010 - 23:25 | |
| J'avoue que je ne suis pas mécontent du résultat, et qu'à mon humble avis on ne peut pas faire mieux. Donc je m'arrête là. Pour les résultats du loto, si j'y arrive, je t'enverrai la formule depuis les îles Marquises... en sirotant un petit punch, rafraîchi par une belle indigène avec une feuille de palmier... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 2 Avr 2010 - 13:32 | |
| J'ai commencé à décortiquer ta formule, et pour l'essayer, je l'ai mise sur mon album, elle est effectivement plus rapide, mais seulement à la 3° utilisation, comme si l'ordinateur retenait progressivement les données déjà calculées, en effet, par contre, des fois, elle se bloque complètement, comme si à UNTIL o2% elle ne trouvait nulle part 192. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Ven 2 Avr 2010 - 14:24 | |
| Ca c'est moche, il faudrait savoir sur quel fichier ça bloque et l'étudier (et si c'est toujours le même, sinon c'est incompréhensible). Pour le fait que c'est plus rapide les fois suivantes, ça s'explique comme j'ai dit plus haut (Windows garde en mémoire les lectures disques jusqu'à ce qu'il ait besoin de la place, pour les réutiliser éventuellement). | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Sam 3 Avr 2010 - 14:08 | |
| J'ai étudié ce que donne ta formule : En vitesse : - la première fois, la vitesse n'est pas si terrible que ça, - la deuxième fois, ça commence déjà à accélérer, - les fois suivantes (3°, 4°, etc...) la vitesse est à peu près constante et rapide, mais finalement pas autant que la formule que j'avais trouvée. Je ne sais pas pourquoi il faut attendre la 3° fois. (avec ma formule, c'est toujours constant, ça n'accélère pas au fur et à mesure de l'utilisation). En utilité : - Avec les photos capturées (avec divers captureurs d'écran) ou avec les photos scannées, pas de problème. - Avec les photos provenant d'un appareil photo numérique, ça marche, mais curieusement elles apparaissent carrées (donc déformées) (et je m'aperçois que ça fait la même chose avec ma formule, ô surprise, je n'avais pas essayé ce genre de photos), - Avec les photos provenant d'Internet, il y en avec lesquelles ça marche, et d'autres où ça plante (arrêt nécessaire par CTRL-ALT-SUPPR), si bien que ça plante immanquablement pour tous les répertoires contenant un bon pourcentage de photos provenant d'Internet. Ce plantage vient d'où ? - ce n'est pas une longue attente pour laquelle je n'aurais pas eu la patience, c'est bien un plantage, car le REPEAT-UNTIL va au delà de la taille totale de l'image, donc il ne trouve nulle part la séquence cherchée - lorsque cela s'est produit avec une photo, et que cette photo revient, cela se reproduit à nouveau. - Citation :
- J'avoue que je ne suis pas mécontent du résultat, et qu'à mon humble avis on ne peut pas faire mieux.
Euh........ à la réflexion, Note : peut mieux faire... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Sam 3 Avr 2010 - 16:38 | |
| Bizarre ton affaire, j'ai fait des essais avec divers types de photos et je n'ai pas eu de problèmes. En gros il y a deux types de jpg: avec et sans Exifs (Les exifs ce sont les informations de prise de vue, appareil, date etc etc, en principe pour les appar eils photo) Pour les photos déformées c'est peut-être ton système d'affichage qui ne convient pas ? Bon je vais refaire des études plus poussées (pour mettre mon système hors de cause ) | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Sam 3 Avr 2010 - 17:49 | |
| Je retire un point de ce que j'ai dit : pour les déformations, c'était dû au fait que j'avais retiré ton UPPER$ et sur le mien, il n'y en avait pas, donc, plus de déformations, mais pour le reste, pas de changement. Il n'y a donc qu'avec celles provenant d'Internet que des problèmes se posent. Il semblerait que certaines photos n'aient pas la séquence recherchée. De même, avec le mien, j'observe que quelques photos, rares, mais existantes, ne semblent pas avoir de séquence FF-C0... puisque l'ordinateur fait toute la photo et affiche le format de la photo précédente. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Sam 3 Avr 2010 - 21:00 | |
| Effectivement, après analyse de pas mal d'images, j'en ai aussi trouvé sans la séquence FFC0. Au départ il n'y avait que 2 catégories: JFIF et Exif, mais j'en ai trouvé une troisième, celle qui pose un problème: JFIF qui inclut un Exif, je ne sais pas pourquoi, c'est assez rare, peut-être après retouches ? Toujours est-il que j'ai rajouté le test de ce cas, et j'ai également rajouté une sortie en erreur si on ne trouve pas FFC0 dans les autres cas, pour éviter de tourner dans le vide. Je te mets le tout, le sous programme Dimimage corrigé, et le sous-programme de test de durée. Comme d'habitude, les noms de fichiers ou de répertoires sont à ajuster. - Code:
-
' Dimensions d'images JPG, BMP, GIF et TGA DIM f$, w%, h%, o1%, o2%, o3%, o4%, v%(10), j%, offs%, ad, er$, s$, s1$, nes DIM rep$, fm$, lst$(500), ww%(500), hh%(500), nf, i%, t1$, t2$ LABEL Dimimage, reter, Fin LABEL Test
LIST 1: GOSUB Test: GOTO Fin
f$ = "C:\Graph\Jpg\IMG_2022.jpg": ' ************** A MODIFIER ************* fr$ = "Z:\Dimtest.txt" GOSUB Dimimage PRINT f$ IF er$ <> "" PRINT "ERREUR: " + er$ ELSE PRINT " " +STR$(w%) + " x " + STR$(h%) END_IF
Fin: END
Dimimage: ' Recherche des dimensions en pixels (largeur et hauteur) d'une image f$ ' aux formats Jpg, Bmp, Gif ou Tga, rendues dans w% et h% er$ = "": s$ = UPPER$(RIGHT$(f$, 4)) FILEBIN_OPEN_READ 1, f$ IF s$ = ".JPG" FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: FILEBIN_READ 1, o3% IF o1%<>255 OR o2%<>216 OR o3%<>255 THEN er$ = "en-tête non FFD8FF": GOTO reter FILEBIN_READ 1, o1%: IF o1%<>224 AND o1%<>225 THEN er$ = "pas E0 ou E1": GOTO reter FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: offs% = 256*o1% + o2%: ad = 4 FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% s$ = CHR$(v%(1)) + CHR$(v%(2)) + CHR$(v%(3)) + CHR$(v%(4)) FILEBIN_POSITION 1, 24 FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% s1$ = CHR$(v%(1)) + CHR$(v%(2)) + CHR$(v%(3)) + CHR$(v%(4)) IF s1$ = "Exif": ' image jpg EXIF ou JFIF avec Exif REPEAT REPEAT: ' recherche du marqueur exif 'A004' FILEBIN_READ 1, o1% UNTIL o1% = 160 FILEBIN_READ 1, o1% UNTIL o1% = 4 FILEBIN_POSITION 1, FILEBIN_POS(1) + 5 FOR j% = 1 to 2: FILEBIN_READ 1, v%(j%): NEXT j% w% = 256*v%(2) + v%(1) FILEBIN_POSITION 1, FILEBIN_POS(1) + 10 FOR j% = 1 to 2: FILEBIN_READ 1, v%(j%): NEXT j% h% = 256*v%(2) + v%(1) ELSE: ' image jpg JFIF pur nes = 0 REPEAT: ' Recherche marqueur 'FFC0' ou 'FFC2' (séquence FF C0 00 11 08 xx xx yy yy) nes = nes + 1 IF nes > 10000 er$ = f$ + " FFC0 non trouvé.": GOTO reter END_IF FILEBIN_POSITION 1, ad + offs% FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: ' marqueur 'FFxx' ad = FILEBIN_POS(1): ' position qui suit le marqueur (-> sa longueur) FILEBIN_READ 1, o3%: FILEBIN_READ 1, o4%: offs% = 256*o3% + o4% UNTIL o2% = 192 OR o2% = 194: ' ='C0' ou 'C2' FOR j% = 1 TO 5: FILEBIN_READ 1, v%(j%): NEXT j% h% = 256*v%(2) + v%(3): w% = 256*v%(4) + v%(5) END_IF ELSE IF s$ = ".BMP" FILEBIN_POSITION 1, 18 FOR j% = 1 TO 8: FILEBIN_READ 1, v%(j%): NEXT j% w% = v%(1) + 256*v%(2) + 256*256*v%(3) + 256*256*256*v%(4) h% = v%(5) + 256*v%(6) + 256*256*v%(7) + 256*256*256*v%(8) ELSE IF s$ = ".GIF" FILEBIN_POSITION 1, 6 FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% w% = v%(1) + 256*v%(2): h% = v%(3) + 256*v%(4) ELSE IF s$ = ".TGA" FILEBIN_POSITION 1, 12 FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% w% = v%(1) + 256*v%(2): h% = v%(3) + 256*v%(4) END_IF END_IF END_IF END_IF reter: FILEBIN_CLOSE 1 RETURN
Test: rep$ = "C:\Photos\Charny\" rep$ = "L:\SAVE\PHOTOS\ARCHIVES\2008\Canon\" rep$ = "C:\Graph\jpg\dali\" fm$ = "Z:\Dir" EXECUTE_WAIT "Cmd.exe /c DIR " + rep$ + "*.jpg /O:N /B >" + fm$ FILE_OPEN_READ 1, fm$: nf = 0 WHILE FILE_EOF(1) = 0 nf = nf + 1: FILE_READLN 1, lst$(nf) END_WHILE FILE_CLOSE 1 PRINT rep$ + " " + str$(nf) + " images" t1$ = TIME$ FOR i% = 1 TO nf f$ = rep$ + lst$(i%): GOSUB Dimimage IF er$ <> "" THEN PRINT STR$(nf) + " " + er$: STOP ww%(i%) = w%: hh%(i%) = h% NEXT i% t2$ = TIME$: PRINT "Terminé." FILE_OPEN_WRITE 1, fm$ FILE_WRITELN 1, str$(nf) + " images" FILE_WRITELN 1, "Début: " + t1$ + " Fin: " + t2$ FOR i% = 1 TO nf FILE_WRITELN 1, lst$(i%) + " - " + STR$(ww%(i%)) + "x" + STR$(hh%(i%)) NEXT i% FILE_CLOSE 1 LIST 10: WIDTH 10, 200: HEIGHT 10, 400: FILE_LOAD 10, fm$ RETURN Minute ! je crois que j'ai encore un autre cas... C'est corrigé, dans un cas j'ai trouvé la séquence FFC2 au lieu de FFC0... (rien ne dit qu'il n'y a pas le cas FFC1...) Bon, j'ai encore un cas bizarre avec des photos d'internet... à l'étude... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Sam 3 Avr 2010 - 22:31 | |
| Décidément, c'est drôlement tordu, ces jpg ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Sam 3 Avr 2010 - 22:44 | |
| T'as raison !!! bon, j'ai fait le tour de ce que j'avais (la calculette hexadécimal commençait à chauffer), je ne considère plus que deux catégories: JFIF ou Exif. Le cas JFIF est très rapide, on recherche FFC0 ou FFC2 de marqueur en marqueur. Le cas Exif, on recherche A004 octet par octet depuis le début. J'ai optimisé un peu en commençant à 400 (je n'en ai trouvé aucun en dessous de 453), donc c'est plus rapide. Ca serait peut-être à ajuster, mais je ne pense pas. Je redonne le code complet, pour éviter toute confusion, avec le s/p de test (j'ai ajouté l'affichage de la position trouvée pour A004, pour voir), tu me diras ce que tu en penses. - Code:
-
' Dimensions d'images JPG, BMP, GIF et TGA DIM f$, w%, h%, o1%, o2%, o3%, o4%, v%(10), j%, offs%, ad, er$, s$, nes DIM rep$, fm$, lst$(500), ww%(500), hh%(500), po%(500), posit%, nf, i%, t1$, t2$ LABEL Dimimage, reter, Fin LABEL Test
GOSUB Test: GOTO Fin
f$ = "C:\Graph\Jpg\IMG_2022.jpg": ' ************** A MODIFIER ************* fr$ = "Z:\Dimtest.txt" GOSUB Dimimage PRINT f$ IF er$ <> "" PRINT "ERREUR: " + er$ ELSE PRINT " " +STR$(w%) + " x " + STR$(h%) END_IF
Fin: END
Dimimage: ' Recherche des dimensions en pixels (largeur et hauteur) d'une image f$ ' aux formats Jpg, Bmp, Gif ou Tga, rendues dans w% et h% er$ = "": s$ = UPPER$(RIGHT$(f$, 4)) FILEBIN_OPEN_READ 1, f$ IF s$ = ".JPG" FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: FILEBIN_READ 1, o3% IF o1%<>255 OR o2%<>216 OR o3%<>255 THEN er$ = "en-tête non FFD8FF": GOTO reter FILEBIN_READ 1, o1%: IF o1%<>224 AND o1%<>225 THEN er$ = "pas E0 ou E1": GOTO reter FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: offs% = 256*o1% + o2%: ad = 4 FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% s$ = CHR$(v%(1)) + CHR$(v%(2)) + CHR$(v%(3)) + CHR$(v%(4)) IF s$ = "Exif": ' image jpg EXIF FILEBIN_POSITION 1, 400: ' position minimum du marqueur, à ajuster ? REPEAT REPEAT: ' recherche du marqueur exif 'A004' FILEBIN_READ 1, o1% UNTIL o1% = 160 FILEBIN_READ 1, o1% UNTIL o1% = 4 posit% = FILEBIN_POS(1) FILEBIN_POSITION 1, posit% + 5 FOR j% = 1 to 2: FILEBIN_READ 1, v%(j%): NEXT j% w% = 256*v%(2) + v%(1) FILEBIN_POSITION 1, FILEBIN_POS(1) + 10 FOR j% = 1 to 2: FILEBIN_READ 1, v%(j%): NEXT j% h% = 256*v%(2) + v%(1) ELSE: ' image jpg JFIF (ou JFIF avec Exif) nes = 0 REPEAT: ' Recherche marqueur 'FFC0' ou 'FFC2' (séquence FF C0 00 11 08 xx xx yy yy) nes = nes + 1 IF nes > 10000 er$ = f$ + " FFC0 non trouvé.": GOTO reter END_IF FILEBIN_POSITION 1, ad + offs% FILEBIN_READ 1, o1%: FILEBIN_READ 1, o2%: ' marqueur 'FFxx' ad = FILEBIN_POS(1): ' position qui suit le marqueur (-> sa longueur) FILEBIN_READ 1, o3%: FILEBIN_READ 1, o4%: offs% = 256*o3% + o4% UNTIL o2% = 192 OR o2% = 194: ' ='C0' ou 'C2' FOR j% = 1 TO 5: FILEBIN_READ 1, v%(j%): NEXT j% h% = 256*v%(2) + v%(3): w% = 256*v%(4) + v%(5) END_IF ELSE IF s$ = ".BMP" FILEBIN_POSITION 1, 18 FOR j% = 1 TO 8: FILEBIN_READ 1, v%(j%): NEXT j% w% = v%(1) + 256*v%(2) + 256*256*v%(3) + 256*256*256*v%(4) h% = v%(5) + 256*v%(6) + 256*256*v%(7) + 256*256*256*v%(8) ELSE IF s$ = ".GIF" FILEBIN_POSITION 1, 6 FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% w% = v%(1) + 256*v%(2): h% = v%(3) + 256*v%(4) ELSE IF s$ = ".TGA" FILEBIN_POSITION 1, 12 FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% w% = v%(1) + 256*v%(2): h% = v%(3) + 256*v%(4) END_IF END_IF END_IF END_IF reter: FILEBIN_CLOSE 1 RETURN
Test: rep$ = "C:\Photos\Charny\" rep$ = "L:\SAVE\PHOTOS\ARCHIVES\2008\Canon\" ' rep$ = "C:\Graph\jpg\dali\" ' rep$ = "C:\Photos\Venise1\" ' rep$ = "C:\Photos\Philippe\" fm$ = "Z:\Dir" EXECUTE_WAIT "Cmd.exe /c DIR " + rep$ + "*.jpg /O:N /B >" + fm$ FILE_OPEN_READ 1, fm$: nf = 0 WHILE FILE_EOF(1) = 0 nf = nf + 1: FILE_READLN 1, lst$(nf) END_WHILE FILE_CLOSE 1 PRINT rep$ + " " + str$(nf) + " images" t1$ = TIME$ FOR i% = 1 TO nf f$ = rep$ + lst$(i%): GOSUB Dimimage IF er$ <> "" THEN PRINT STR$(nf) + " " + er$: STOP ww%(i%) = w%: hh%(i%) = h%: po%(i%) = posit% NEXT i% t2$ = TIME$: PRINT "Terminé." FILE_OPEN_WRITE 1, fm$ FILE_WRITELN 1, str$(nf) + " images" FILE_WRITELN 1, "Début: " + t1$ + " Fin: " + t2$ FOR i% = 1 TO nf FILE_WRITELN 1, lst$(i%) + " - " + STR$(ww%(i%)) + "x" + STR$(hh%(i%))+" "+str$(po%(i%)) NEXT i% FILE_CLOSE 1 LIST 10: WIDTH 10, 400: HEIGHT 10, 400: FILE_LOAD 10, fm$ RETURN | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Dim 4 Avr 2010 - 16:27 | |
| Mouaih, mouaih, mouaih, mouaih. J'ai essayé ta dernière formule : Ca marche souvent... (quoique ça ne marche pas avec les fichiers comportant des accents) Et puis, le PO%(I%) est toujours égal à zéro (sauf dans 2 fichiers) (et j'en ai essayé plusieurs milliers) (et il n'y avait pas que 2 fichiers qui ne marchaient pas avec l'ancienne formule) ce qui veut dire que ça ne passe presque jamais dans la boucle exif, Mais je voudrais bien savoir ce qu'on fait quand ça s'arrête (STOP) et ça déclare que : - Pas de E0 ou E1 (ou) - FFC0 Non trouvé. Et aussi ce qu'on fait quand ça plante : (affichage du chemin et du nombre d'images - et puis plus rien - ctrl-alt-suppr) Dur-dur, les jpg ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Dim 4 Avr 2010 - 16:41 | |
| Tu dois donc avoir en majorité des images JFIF qui ne positionnent pas le po%(i%), c'est le cas des images internet, ou des images d'appareils photo recopiées ou retouchées. Les images issues d'APN non retouchées sont Exifs (contiennent les paramètres de prise de vue). Quand ça s'arrête sur erreur... eh bien... tu n'as plus qu'à relever les noms de fichiers et étudier leur structure pour savoir pourquoi ça ne marche pas... enfin c'est ce que je ferais moi mais je n'ai pas le cas. Ou tu me les fais parvenir (1) ? Quand ça plante, essayer de reproduire les conditions et mettre des points d'arrêt (STOP ou MESSAGE) pour essayer de localiser l'endroit du plantage... mais je n'ai pas le cas non plus. Je n'ai jamais réussi à trouver une doc cohérente sur la structure des jpg, alors j'ai bricolé, mais il doit y avoir des cas particuliers non traités.. 1) pour communiquer un fichier: le déposer sur http://www.2shared.com/ puis récupérer le lien de téléchargement (download link) qui s'affiche ensuite (copier) et le coller ici. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Dim 4 Avr 2010 - 17:00 | |
| Erreur de ma part, le cas de plantage précisé n'en est pas un, je crois, j'ai rééssayé sur un des cas, en fait, c'est simplement très long (90 sec) il fallait attendre, c'est là qu'il y avait des exif (et en quelle position =297000... !) C'est quand même un peu long. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Dim 4 Avr 2010 - 17:08 | |
| Eh, et puis il y a un truc qui ne va pas : à la position 297285, il en déduit que la photo correspondante fait : 35176 x 1225 (sacrée photo !) en fait, elle fait 1600 x 1200, il y a un problème. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Dim 4 Avr 2010 - 17:14 | |
| C'est manifestement une erreur ! Et il faut sans doute rajouter également un test de vraisemblance dans le cas Exif (dans la boucle repeat) comme dans le cas JFIF (IF nes > 10000...). Je le rajoute chez moi. Mais sans avoir le fichier litigieux en main... - Code:
-
nes = 0 IF s$ = "Exif": ' image jpg EXIF FILEBIN_POSITION 1, 400: ' position minimum du marqueur, à ajuster ? REPEAT REPEAT: ' recherche du marqueur exif 'A004' FILEBIN_READ 1, o1% nes = nes + 1 IF nes > 10000 er$ = f$ + " A004 non trouvé.": GOTO reter END_IF UNTIL o1% = 160 FILEBIN_READ 1, o1%: nes = nes + 1 UNTIL o1% = 4 | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Dim 4 Avr 2010 - 17:25 | |
| on peut passer des jpg par 2shared.com ? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Dim 4 Avr 2010 - 17:26 | |
| oui pourquoi pas ? n'importe quel fichier... en tout cas j'ai téléchargé un jpg sans problème, pour voir
Alors, tu me le passes ce fichier ? enfin, le lien pour le télécharger ! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Dim 4 Avr 2010 - 18:30 | |
|
Dernière édition par jjn4 le Mar 6 Avr 2010 - 23:51, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Dim 4 Avr 2010 - 18:48 | |
| Ok merci je regarde... mais ça peut demander un peu de temps. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Dim 4 Avr 2010 - 18:53 | |
| OUAIS, parce que d'abord tu t'occupes de mon problème | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Dim 4 Avr 2010 - 18:59 | |
| C'est fou, on ne s'appartient plus ! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Dim 4 Avr 2010 - 19:02 | |
| @JL35: Si t'en veux d'autres, j'en ai encore. @Jean-Claude: on le fait bosser, hein ! | |
| | | Contenu sponsorisé
| Sujet: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) | |
| |
| | | | Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |