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: Re: Extraire les dimensions d'une image JPG (+ BMP, GIF et TGA) Dim 4 Avr 2010 - 19:30 | |
| C'est bon, ça va pour le moment. J'ai vu pour une des images, l'autre il faut que j'approfondisse ! il a raison Jean-Claude, on verra demain. On ne va pas bosser un jour férié non ? | |
| | | 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 - 22:50 | |
| Bon allez, mais c'est bien parce que c'est toi, tu n'as plus qu'à essayer ça, ça mouline un peu la première fois mais bon, la lecture fichier octet par octet ce n'est pas très performant: EDIT du 5/4: je suis en train d'étudier un système de recherche d'une séquence donnée dans un fichier binaire un peu plus performant et élégant, avec les moyens Panoramic, patience... - 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 AND o1%<>235 THEN er$ = "pas E0 ou E1 ou EB": 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)) nes = 0 IF s$ = "Exif": ' image jpg EXIF ' Recherche de la séquence 30 31 30 30 01 dans les Exifs FILEBIN_POSITION 1, 350: ' position minimum du marqueur, à ajuster ? REPEAT REPEAT REPEAT REPEAT REPEAT FILEBIN_READ 1, o1% UNTIL o1% = 48: ' &30 FILEBIN_READ 1, o1% UNTIL o1% = 49: ' &31 FILEBIN_READ 1, o1% UNTIL o1% = 48: ' &30 FILEBIN_READ 1, o1% UNTIL o1% = 48: ' &30 FILEBIN_READ 1, o1% UNTIL o1% = 1: ' &01 posit% = FILEBIN_POS(1) FILEBIN_POSITION 1, posit% + 19 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) 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\" ' rep$ = "C:\Graph\jpg\" 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: +++ Lun 5 Avr 2010 - 19:27 | |
| Bon, j'ai testé cette nouvelle formule. Elle marche avec les images que je t'ai envoyées, mais pas avec les autres que je ne t'ai pas envoyées. Bref, c'est chaque image (rare mais existante) qui est différente, si bien que cette méthode d'ajustement "pifométrique" risque de durer longtemps, et dans l'avenir, il risque de sortir d'autres nouvelles exeptions, et je risque de devoir envoyer des images à JL35 jusqu'à la fin des temps, et lui de changer de méthode à chaque fois. Ca ne va pas. (et puis faire bosser un tri-centenaire, quand même (né en 1635)) Non, on ne peut pas continuer comme ça. Les logiciels professionnels ne mettent pas autant de temps (même en langage machine) pour trouver tous ces renseignements. Ils ne doivent pas chercher comme ça. Au fond, il doit y avoir un repère constant qui contient l'adresse où se trouvent tous les renseignements. Mais comme on ne le connaît pas, je vais procéder statistiquement et employer la technique du plan B (on connaît mon goût pour les plans B !). J'ai étudié plein d'images : - environ 99% sont sous la forme FF-C0... - (et) environ 1% seulement sont des exceptions (JL35 les appelle Exif) - environ 1 (ou 2%) ont leur FF-C0 situé au delà de l'adresse 1000 (ou 5000) - donc environ 98% ont leur adresse FF-C0 située assez près du début. Alors, voici mes plans A et B (ça devient sérieux) : - Plan A : les fichiers jpg sont d'abord traités comme FF-C0 et ce juqu'à l'adresse 1000 (j'ai calculé, c'est le temps optimal) si pas de FF-C0 de 1 à 1000, alors l'ordinateur passe au plan B - Plan B : j'emploie la toute première méthode (plus fiable) (transformation en bmp par picture et là, fiabilité totale) Le plan B est plus long que le plan A, mais comme il n'est employé que dans 2% des cas j'arrive à charger les 200 photos en 6 à 12 secondes selon les cas, ce qui est un temps d'attente raisonnable. Et voilà ! Je publierai bientôt une nouvelle version de l'Album-Photo avec cette méthode. | |
| | | 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) Lun 5 Avr 2010 - 21:51 | |
| Evidemment tu as raison si tu as encore des images qui ne rentrent pas dans le cadre, ce n'est plus gérable. Les images qui sortent d'APN sont toutes avec des Exifs, elles sont transformées en JFIF dès qu'on les retouche ou les redimensionne, c'est pour ça que pratiquement toutes les images internet sont JFIF. Disons que le problème reste entier, mais pas enterré, pour moi je n'ai plus d'exemples d'images où ça ne marche pas (sur plusieurs centaines d'origines diverses), mais bon il reste des cas particuliers... | |
| | | 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 6 Avr 2010 - 22:23 | |
| Bon, à l'attention spéciale de jjn4, une ultime version, rapide puisqu'elle ne fait pas une recherche aveugle mais descend les chaînages de marqueurs jpg, donc que des lectures utiles. Pour moi, avec quelques centaines d'images d'origines diverses, je n'ai pas trouvé de cas particuliers, mais c'est à tester (la routine de test d'un répertoire est incluse): - Code:
-
' Dimensions d'images JPG, BMP, GIF et TGA - 6 avril 2010 DIM f$, w%, h%, v%(10), j%, offs%, ad, er$, s$ DIM rep$, fm$, lst$(500), ww%(500), hh%(500), po%(500), posit%, pm%, nf%, i%, t1$, t2$ DIM p, p1, p2, lbuf, buf$, seq$, d, vh$, lh%, k%, va%, h0 LABEL Dimimage, reter, Fin, DecHex LABEL Test
GOSUB Test: GOTO Fin
Fin: END ' ------------------------- sous-programmes -------------------------- 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" FOR j% = 1 TO 2: FILEBIN_READ 1, v%(j%): NEXT j% IF v%(1) <> 255 OR v%(2) <> 216 THEN er$ = "en-tête non FFD8": GOTO reter ad = 0: offs% = 0 REPEAT REPEAT posit% = ad + 2 + offs%: FILEBIN_POSITION 1, posit% FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% offs% = 256*v%(3) + v%(4) ad = FILEBIN_POS(1) - 4 IF ad>65535 THEN er$ = f$ + " FFCx non trouvé.": GOTO reter UNTIL v%(2) = 192 OR v%(2) = 194: ' # FFC0 et FFC2 FOR j% = 1 TO 5: FILEBIN_READ 1, v%(j%): NEXT j% UNTIL v%(1) = 8 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
DecHex: ' conversion décimal/hexa de d, résultat vh$ (complété si utile à lh% caractères) vh$="" REPEAT vh$ = MID$("0123456789ABCDEF", 16*(d/16-INT(d/16))+1, 1) + vh$: d = INT(d/16) UNTIL d <= 0 IF LEN(vh$) < lh% THEN vh$ = STRING$(lh% - LEN(vh$), "0") + vh$ RETURN
Test: h0 = SCREEN_Y - 50: Height 0, h0: width 0, 450 rep$ = "C:\Photos\Charny\" rep$ = "L:\SAVE\PHOTOS\ARCHIVES\2008\Canon\" ' rep$ = "C:\Graph\jpg\dali\" ' rep$ = "C:\Photos\Venise1\" ' rep$ = "C:\Photos\Philippe\" ' rep$ = "C:\Graph\jpg\" 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é." pm% = 0 FOR i% = 1 TO nf% IF po%(i%) > pm% THEN pm% = po%(i%) NEXT i% FILE_OPEN_WRITE 1, fm$ FILE_WRITELN 1, rep$ + " - " + str$(nf%) + " images" FILE_WRITELN 1, "Début: " + t1$ + " --> Fin: " + t2$ d = pm%: GOSUB DecHex FILE_WRITELN 1, "********** Position maxi (hexa) de FFC0= " + vh$ FOR i% = 1 TO nf% d = po%(i%): GOSUB DecHex FILE_WRITELN 1, lst$(i%) + " - " + STR$(ww%(i%)) + "x" + STR$(hh%(i%))+" Posit= "+vh$ NEXT i% FILE_CLOSE 1 LIST 10: WIDTH 10, 420: HEIGHT 10, h0-50: FILE_LOAD 10, fm$ RETURN | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Mar 6 Avr 2010 - 23:25 | |
| 5 minutes, tu exagères ! Bon, j'ai pris quelques minutes pour faire une recherche rapide uniquement sur les cas qui avaient coincés avec la version précédente. (heureusement que je garde mes notes) Alors, ça marche mieux que la version précédente, les cas où ça coinçaient ne coincent plus, sauf 1 cas étrange : ça a fait : FFCx non trouvé, puis quand j'ai essayé une deuxième fois, c'est passé, mais le maximum était à cet endroit et indiquait plus de 16000 (en hexa) de plus, j'ai observé que le calcul de la dimension était faux ainsi que pour la photo suivante. J'ai rapidement vérifié pour d'autres dimensions qui avaient l'air exactes, mais il faudrait une recherche systématique (qui prendrait nettement plus de 5 minutes !!!) il y aurait bien un moyen qui ne prendrait pas trop trop de temps, ce serait de faire un programme de test double qui calculerait en parallèle à la fois cette méthode et celle de la transformation en bmp et qui ferait la différence, afficherait 0, (ou plus si ce serait faux) et récapitulerait, en haut, le nombre de totaux différents de 0. Là, ça permettrait de faire rapidement une vérification approfondie de la justesse des résultats, et donc du calcul. Si tu fais ça, alors ok, je ferai la vérification. | |
| | | 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) Mer 7 Avr 2010 - 14:25 | |
| Bon, qu'à cela ne tienne ! le temps d'expédier les affaires courantes. EDIT: voilà le programme de test, il suffit de mettre ton répertoire dans rep$ (et changer fm$). Mais il faut de la patience, la méthode Picture est quand même très longue. Le résultat, affichage des dimensions trouvées par les deux méthodes, et de "ERREUR" s'il y a une différence. Personnellement je n'en ai pas trouvé avec mes images. - Code:
-
' Dimensions d'images JPG, BMP, GIF et TGA - 6 avril 2010 DIM f$, w%, h%, v%(10), j%, offs%, ad, er$, s$ DIM rep$, fm$, lst$(500), ww%(500), hh%(500), po%(500), posit%, pm%, nf%, i%, t1$, t2$ DIM p, p1, p2, lbuf, buf$, seq$, d, vh$, lh%, k%, va%, h0 DIM w2%(4500), h2%(500), a$, t3$, t4$ LABEL Dimimage, reter, Fin, DecHex LABEL Test, Methode2 rep$ = "C:\Photos\Charny\" rep$ = "L:\SAVE\PHOTOS\ARCHIVES\2008\Canon\" rep$ = "C:\Graph\jpg\dali\" rep$ = "C:\Photos\Venise1\" ' rep$ = "C:\Photos\Philippe\" ' rep$ = "C:\Graph\jpg\" fm$ = "Z:\Dir" GOSUB Test: GOTO Fin
Fin: END ' ------------------------- sous-programmes -------------------------- 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" FOR j% = 1 TO 2: FILEBIN_READ 1, v%(j%): NEXT j% IF v%(1) <> 255 OR v%(2) <> 216 THEN er$ = "en-tête non FFD8": GOTO reter ad = 0: offs% = 0 REPEAT REPEAT posit% = ad + 2 + offs%: FILEBIN_POSITION 1, posit% FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% offs% = 256*v%(3) + v%(4) ad = FILEBIN_POS(1) - 4 IF ad>65535 THEN er$ = f$ + " FFCx non trouvé.": GOTO reter UNTIL v%(2) = 192 OR v%(2) = 194: ' # FFC0 et FFC2 FOR j% = 1 TO 5: FILEBIN_READ 1, v%(j%): NEXT j% UNTIL v%(1) = 8 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
DecHex: ' conversion décimal/hexa de d, résultat vh$ (complété si utile à lh% caractères) vh$="" REPEAT vh$ = MID$("0123456789ABCDEF", 16*(d/16-INT(d/16))+1, 1) + vh$: d = INT(d/16) UNTIL d <= 0 IF LEN(vh$) < lh% THEN vh$ = STRING$(lh% - LEN(vh$), "0") + vh$ RETURN
Test: h0 = SCREEN_Y - 50: Height 0, h0: width 0, 550 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" ' ************************** 1ère méthode (FF C0 ou C2) *********************** 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é." pm% = 0 FOR i% = 1 TO nf% IF po%(i%) > pm% THEN pm% = po%(i%) NEXT i% ' ***************************** 2ème méthode (Picture) *********************** t3$ = TIME$: PRINT " Début méthode Picture " + t3$ FOR i% = 1 TO nf% f$ = rep$ + lst$(i%): GOSUB Methode2 w2%(i%) = w%: h2%(i%) = h% NEXT i% t4$ = TIME$: PRINT "Fin méthode 2 " + t4$ ' **************************** Affichage du résultat ************************** FILE_OPEN_WRITE 1, fm$ FILE_WRITELN 1, rep$ + " - " + str$(nf%) + " images" FILE_WRITELN 1, "Début: " + t1$ + " --> Fin: " + t2$ FILE_WRITELN 1, "Début: " + t3$ + " --> Fin: " + t4$ d = pm%: GOSUB DecHex FILE_WRITELN 1, "********** Position maxi (hexa) de FFC0= " + vh$ FOR i% = 1 TO nf% d = po%(i%): GOSUB DecHex a$ = lst$(i%) + " - " + STR$(ww%(i%)) + "x" + STR$(hh%(i%))+" Posit= "+vh$ a$ = a$ + " ***** Picture: " + STR$(w2%(i%)) + "x" + STR$(h2%(i%)) IF w2%(i%)<>ww%(i%) OR h2%(i%)<>hh%(i%) THEN a$ = a$ + " *** ERREUR !***" FILE_WRITELN 1, a$ NEXT i% FILE_CLOSE 1 LIST 10: WIDTH 10, 520: HEIGHT 10, h0-50: FILE_LOAD 10, fm$ RETURN
Methode2: ' Dimensions d'une image jpg, méthode Jpg->Bmp (Picture) PICTURE 20: HIDE 20: FILE_LOAD 20, f$: FILE_SAVE 20, fm$: DELETE 20 FILEBIN_OPEN_READ 1, fm$: FILEBIN_POSITION 1, 18: ' en 18, 4 + 4 octets FOR j% = 1 TO 8: FILEBIN_READ 1, v%(j%): NEXT j% FILEBIN_CLOSE 1: FILE_DELETE fm$ w% = v%(1) + 256*v%(2): h% = v%(5) + 256*v%(6): ' 2 octets (<65536 pixels) RETURN | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 8 Avr 2010 - 0:52 | |
| Ouah !!! Bon, je n'ai plus qu'à faire ce que j'ai dit, moi, maintenant... Mais on verra ça demain... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Jeu 8 Avr 2010 - 23:15 | |
| Et voilà, c'est fait. J'ai vérifié avec un grand nombre d'images jpg, et il n'y a que les deux que j'avais déjà détectés qui ne passent pas : FFCx non trouvé (et cette fois, cela donne toujours ça). Ceci dit, je me pose quand même des questions ? Que peut valoir cette méthode obtenue par tâtonnements ? Je ne possède pas toutes les images du monde, loin s'en faut. Il doit bien en exister d'autres que je ne possède pas et qui ne marchent pas. Et puis, chaque jour, il sort de nouveaux APN, éventuellement avec de nouvelles façons d'utiliser les jpg, donc il peut y avoir de nouvelles exceptions dans l'avenir. Alors... Bon, j'arrête de réfléchir, il y a déjà de la fumée qui me sort par les oreilles. | |
| | | 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 9 Avr 2010 - 1:14 | |
| Je ne pense pas que ce soient des images sorties directement d'Apn qui posent des problèmes, mais des images retravaillées, et c'est en les étudiant qu'on pourrait résoudre les problèmes... Et ce n'est pas une méthode par tâtonnement mais tout de même assez rigoureuse, l'emplacement est obtenu par calcul. J'étais parti de la recherche de FFC0, puis j'ai ajouté FFC2 au vu d'un cas que tu m'as montré, maintenant il faut peut-être ajouter FFC1 ? 2 cas seulement sur des centaines (milliers ?), ça vaut le coup de les étudier. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 9 Avr 2010 - 12:26 | |
| Je peux te les envoyer, ceci dit, je trouve que les passer toujours par un site (2shared) farcit le toile Internet de trucs qui ne serviront qu'une fois, cela n'est pas très écologique, d'ailleurs y a-t-il un moyen de supprimer les photos envoyées l'autre fois sur 2shared ? Le plus simple, ce serait que je te les envoie en e-mail, si tu n'as pas envie de donner ton e-mail à tout le monde, tu peux me l'envoyer perso, ou alors faire comme j'ai fait pour mon site, fabriquer un e-mail uniquement JL35 (j'ai affiché un e-mail jjn4a qui n'est pourtant pas mon e-mail habituel) | |
| | | 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 9 Avr 2010 - 14:32 | |
| Ca m'intéresse, et comme effectivement ça n'intéresse que nous deux, inutile d'en faire profiter le monde entier. Je t'envoie un mp avec mon email, tu pourras me les mettre en pièces jointes (éventuellement en zip mais s'il n'y en a que deux envoie les telles quelles. D'autant plus que la compression sur des images, on ne gagne rien). Merci jj, à bientôt | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 9 Avr 2010 - 19:18 | |
| Et alors, peut-on supprimer une image de 2shared ? Tu ne m'as pas dit. | |
| | | 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 9 Avr 2010 - 21:08 | |
| Ca par contre je n'en sais rien du tout ! il faudra que je regarde sur le site, mais il n'est pas très détaillé... EDIT: Apparemment il y a un moyen de supprimer tes fichiers sur 2shared, regarde ici: http://www.2shared.com/tutorial.jspRubrique Step 2 Manage your files 'Also you can delete the file if you wish (5)'
Dernière édition par JL35 le Ven 9 Avr 2010 - 22:09, é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) Ven 9 Avr 2010 - 21:43 | |
| @jjn4 Ouf ! ça y est, j'ai examiné tes deux images, calculette hexadécimale en main. Finalement, ce qui posait un problème c'était mon test de vraisemblance, limitation des recherches à 65535 (décimal). En fait j'ai trouvé le FFC0 dans une image en 344500 et dans l'autre en 226928. Il y a simplement un peu plus de chaînages (marqueurs FFxx) à descendre, mais ça ne prend pas plus de temps, puisqu'on ne lit que quelques octets par chaînage. Je rappelle le principe des marqueurs: FF xx aa aa, aaaa représentant le déplacement vers le marqueur suivant. En conclusion, il suffit de faire sauter le test, et ça marche: IF ad>65535 THEN er$ = f$ + " FFCx non trouvé." GOTO reterBon je vais quand même rajouter un test de sécurité, à tout hasard, pour ne pas tourner en rond sur un fichier qui serait altéré. Et je maintiens qu'on ne peut sans doute pas faire plus rapide, du moins avec Panoramic. EDIT: voilà la dernière version de test. J'ai supprimé le test à 65535, et j'ai ajouté un test de fin de fichier, et un test de chaînage correct (FF). Je le redonne entièrement pour éviter toute confusion: - Code:
-
' Dimensions d'images JPG, BMP, GIF et TGA - 9 avril 2010 DIM f$, w%, h%, v%(10), j%, offs%, ad, er$, s$, sz DIM rep$, fm$, lst$(500), ww%(500), hh%(500), po%(500), posit%, pm%, nf%, i%, t1$, t2$ DIM p, p1, p2, lbuf, buf$, seq$, d, vh$, lh%, k%, va%, h0 LABEL Dimimage, reter, Fin, DecHex LABEL Test
GOSUB Test: GOTO Fin
Fin: END ' ------------------------- sous-programmes -------------------------- 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$: sz = FILEBIN_SIZE(1) IF s$ = ".JPG" FOR j% = 1 TO 2: FILEBIN_READ 1, v%(j%): NEXT j% IF v%(1) <> 255 OR v%(2) <> 216 THEN er$ = "en-tête non FFD8": GOTO reter ad = 0: offs% = 0 REPEAT REPEAT posit% = ad + 2 + offs% IF posit%>=sz THEN er$ = f$ + " FFCx non trouvé.": GOTO reter FILEBIN_POSITION 1, posit% FOR j% = 1 TO 4: FILEBIN_READ 1, v%(j%): NEXT j% IF v%(1) <> 255 THEN er$ = f$ + " FFCx non trouvé.": GOTO reter offs% = 256*v%(3) + v%(4) ad = FILEBIN_POS(1) - 4 UNTIL v%(2) = 192 OR v%(2) = 194: ' # FFC0 et FFC2 FOR j% = 1 TO 5: FILEBIN_READ 1, v%(j%): NEXT j% UNTIL v%(1) = 8 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
DecHex: ' conversion décimal/hexa de d, résultat vh$ (complété si utile à lh% caractères) vh$="" REPEAT vh$ = MID$("0123456789ABCDEF", 16*(d/16-INT(d/16))+1, 1) + vh$: d = INT(d/16) UNTIL d <= 0 IF LEN(vh$) < lh% THEN vh$ = STRING$(lh% - LEN(vh$), "0") + vh$ RETURN
Test: h0 = SCREEN_Y - 50: Height 0, h0: width 0, 450 rep$ = "C:\Photos\Charny\" rep$ = "L:\SAVE\PHOTOS\ARCHIVES\2008\Canon\" ' rep$ = "C:\Graph\jpg\dali\" ' rep$ = "C:\Photos\Venise1\" ' rep$ = "C:\Photos\Philippe\" rep$ = "C:\Graph\jpg\" ' rep$ = "C:\Temp\" 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é." pm% = 0 FOR i% = 1 TO nf% IF po%(i%) > pm% THEN pm% = po%(i%) NEXT i% FILE_OPEN_WRITE 1, fm$ FILE_WRITELN 1, rep$ + " - " + str$(nf%) + " images" FILE_WRITELN 1, "Début: " + t1$ + " --> Fin: " + t2$ d = pm%: GOSUB DecHex FILE_WRITELN 1, "********** Position maxi (hexa) de FFC0= " + vh$ FOR i% = 1 TO nf% d = po%(i%): GOSUB DecHex FILE_WRITELN 1, lst$(i%) + " - " + STR$(ww%(i%)) + "x" + STR$(hh%(i%))+" Posit= "+vh$ NEXT i% FILE_CLOSE 1 LIST 10: WIDTH 10, 420: HEIGHT 10, h0-50: FILE_LOAD 10, fm$ RETURN | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 9 Avr 2010 - 23:40 | |
| Finalement, ta formule m'intéresse, car figure-toi que j'ai trouvé 2 images qui étaient déformées avec la mienne (en plans A+B) je les ai disséquées et j'ai découvert que le rapport h/w de l'imagette était archi-faux, un comble ! Mais je reste persuadé que pour ta formule, une nouvelle recherche avec d'autres images permettraient de découvrir d'autres exceptions. Mais je me suis dit qu'on pouvait toujours y appliquer mon idée de plan B. | |
| | | 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 9 Avr 2010 - 23:52 | |
| Tu peux toujours laisser les tests d'erreur et comme tu dis dans ce cas appliquer ton plan B. Mais à mon avis il y a peu de chances de trouver d'autres anomalies, depuis ma dernière formule, la plus rapide, les deux seules erreurs étaient dues à un test incongru dans le programme. Et en plus, moi ce sont les dimensions réelles, pas les imagettes. Allez, bonne nuit et à demain soir peut-être ! (et encore merci pour les images). | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 9 Avr 2010 - 23:54 | |
| - Citation :
- à mon avis il y a peu de chances
Ca, ça n'est pas la définition d'une procédure rigoureuse. Mais tu as raison, bonne nuit. | |
| | | 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 11 Avr 2010 - 0:03 | |
| Tu remarqueras que je n'ai pas eu l'outrecuidance de dire qu'il n'y avait aucune chance ! Je suis prudent. Et puis chat échaudé craint l'eau froide. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Dim 11 Avr 2010 - 15:16 | |
| Mission accomplie ! Ca y est, c'est réussi ! Vous vous demandez bien quelle mission... ? Eh bien voilà, j'ai écumé Internet à partir de mots-bateaux, comme "cinéma" ou "feuilleton" ou "TV"... en téléchargeant à tout va, tout ce qui se présentait comme images, même les trucs les plus débiles ou abracadabrans, (bon, après il y aura besoin d'un bon coup de balai). Le but avoué, c'était d'accumuler un maximum d'images jpg nouvelles pour les passer ensuite dans le test de JL35 et lui démontrer qu'on pouvait encore trouver des images que sa formule n'arriverait pas à traiter. Et j'en ai trouvé une ! La, la, la, la, lèreeeeeeee ! Heureusement que JL35 n'a pas dit qu'il n'y avait aucune chance ! Elle fait STOP avec --> FFCx non trouvé. Je l'ai étudiée : elle a 3 séquences de FF C0 00 11 08, la première pour une imagette de 128x160{=0.8} en 23329 (position du FF) la deuxième pour une autre imagette de 128x160{=0.8} en 34208 la troisième pour l'image finale de 700x875{=0.8} en 63648 (ce qui correspond bien aux dimentions réelles de la photo) @JL35: Ca te suffit comme données pour comprendre ce qui ne va pas ou je t'envoie la photo ? | |
| | | 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 11 Avr 2010 - 16:47 | |
| Ah non, ça ne me suffit pas, je veux voir la photo ! envoie ! Rassure-toi, une image sur les centaines de milliers (les milliasses comme disait Raimu) que tu as testées, ça ne me traumatise pas ! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| | | | 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 11 Avr 2010 - 21:30 | |
| @jjn4 ton image me laisse perplexe... d'entrée le chaînage renvoie n'importe où. Et si pas de chaînage, recherche sauvage de FFC0 mais c'est bien trop long, inacceptable. Donc effectivement ma méthode ne convient pas dans ce cas. Seules remarques, c'est une assez vieille image (2006) qui a été travaillée sous Photoshop, et le codage est Motorola et non Intel (ce que je n'avais jamais vu), mais ça n'aide pas pour autant. A priori je déclare forfait pour celle-ci, sauf illumination soudaine, et je préconise le plan B (Picture, IrfanView...). | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Lun 12 Avr 2010 - 17:28 | |
| Qui c'est qui avait raison ? Ceci dit, tu me diras si tu en restes définitivement là, ou si, après avoir bien entamé l'os que je t'ai donné à ronger, tu trouves finalement une illumination soudaine.
Dernière édition par jjn4 le Sam 8 Mai 2010 - 18:12, é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) Lun 12 Avr 2010 - 18:40 | |
| Evidemment que je te dirai si j'ai une illumination . Mais tu dois bien savoir qu'une illumination ça ne se commande pas. Ca peut être cette nuit pendant ma méditation Ou dans 20 ans Ou plus. (j'ai fait un programme de quelques lignes en VB.net qui trouve à tous les coups. En fait c'est un module du programme qui trouve, pas moi, et je ne sais pas comment il fait. Tous les exemples que j'ai vu sur le net dans diverses langues se basent sur la recherche du FFC0 par chaînage, qui ne marche pas dans TON cas particulier). | |
| | | 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
| |
| |
| |