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 |
|
|
| Calcul du format d'une image | |
| | Auteur | Message |
---|
jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Calcul du format d'une image Ven 8 Jan 2016 - 16:57 | |
| J'ai réutilisé le travail qu'on avait fait, JL35 et moi en 2010, et je l'ai réactualisé avec des sub pour le rendre réutilisable et l'appliquer à plein de programmes : - Code:
-
rem ' Routine de calcul des dimensions d'une image jgg ou bmp - Rout-format-imag dim ha% , la% : rem Hauteur et Largeur de la photo dim np$ : rem Nom de la Photo dim pb : rem Plan B pour les jpg anormaux label choisir : rem Choisir la photo à mesurer
rem form0 width 0,999 caption 0,"Calcul des dimensions d'une image"
alpha 10 : rem Affichage des dimensions de la photo left 10,5 top 10,5
button 20 : rem Bouton de choix de la photo à mesurer left 20,10 top 20,40 caption 20,"Choisir" on_click 20,choisir
end
choisir: : rem Choisir la photo à mesurer open_dialog 100 np$=file_name$(100) delete 100 la%=0 ha%=0 if right$(np$,4)=".bmp" format_bmp(np$) end_if pb=0 if right$(np$,4)=".jpg" format_jpg(np$) end_if if pb=1 format_pb(np$) end_if caption 0,np$ caption 10,"L="+str$(la%)+" x "+"H="+str$(ha%)+" - Plan "+chr$(65+pb) return
sub format_bmp(np$) : rem Calcul des dimensions d`une photo bmp dim_local a , b , c , d : rem Variables à utilisation multiple np$=lower$(np$) if right$(np$,4)=".bmp" filebin_open_read 1,np$ filebin_position 1,18 filebin_read 1,a filebin_read 1,b filebin_position 1,22 filebin_read 1,c filebin_read 1,d filebin_close 1 la%=256*b+a ha%=256*d+c end_if end_sub
sub format_jpg(np$) : rem Calcul des dimensions d`une photo jpg normale dim_local h , i , j : rem Variables à utilisation multiple dim_local a% : rem Variables à utilisation multiple dim_local ta% : rem Taille du fichier dim_local oc%(10) : rem Les 10 premiers octets du fichier np$=lower$(np$) if right$(np$,4)=".jpg" filebin_open_read 1,np$ ta%=filebin_size(1) filebin_read 1,oc%(1) filebin_read 1,oc%(2) if oc%(1)=255 and oc%(2)=216 repeat repeat h=i+2+j if h>=ta% pb=1 filebin_close 1 exit_sub end_if filebin_position 1,h for a%=1 to 4 filebin_read 1,oc%(a%) next a% if oc%(1)<>255 pb=1 filebin_close 1 exit_sub end_if j=256*oc%(3)+oc%(4) i=filebin_pos(1)-4 until oc%(2)=192 or oc%(2)=194 for a%=1 to 5 filebin_read 1,oc%(a%) next a% until oc%(1)=8 ha%=256*oc%(2)+oc%(3) la%=256*oc%(4)+oc%(5) else pb=1 end_if filebin_close 1 end_if end_sub sub format_pb(np$) : rem Plan B : Calcul des dimensions d`une photo jpg anormale dim_local a , b , c , d : rem Variables à utilisation multiple picture 199 : rem Affichage provisoire de la photo hide 199 file_load 199,np$ file_save 199,"C:\Provy.bmp" delete 199 filebin_open_read 1,"C:\Provy.bmp" filebin_position 1,18 filebin_read 1,a filebin_read 1,b filebin_position 1,22 filebin_read 1,c filebin_read 1,d filebin_close 1 file_delete "C:\Provy.bmp" la%=256*b+a ha%=256*d+c end_sub Je ne sais pas si d'autres méthodes ont été trouvées, depuis 2010, et si il est possible de faire mieux. Enfin, comme ça, c'est déjà utilisable.
Dernière édition par jjn4 le Sam 9 Jan 2016 - 15:51, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Calcul du format d'une image Ven 8 Jan 2016 - 18:29 | |
| Salut jjn ! ça fait plaisir de te revoir au boulot ! et au passage, Bonne Année ! J'ai fait entretemps quelque chose d'un peu plus compact, mais je ne me souviens plus si ça marche pour les jpg 'anormaux' comme tu les appelles, il me semble... (j'ai regroupé jpg et bmp): - Code:
-
SUB DimJpgBmp(f$) ' Dimensions de l'image Jpg ou Bmp f$ -> wi% et hi% DIM_LOCAL a$,i% IF VARIABLE("wi%")=0 THEN DIM wi% IF VARIABLE("hi%")=0 THEN DIM hi% FILEBIN_OPEN_READ 9,f$: FILEBIN_HEXA_READ 9,2000,a$: FILEBIN_CLOSE 9 IF UPPER$(FILE_EXTRACT_EXTENSION$(f$)) = ".JPG" i% = INSTR(a$, "02A004") IF i% > 0: ' infos Exif wi% = HEX(MID$(a$,i%+16,2))+256*HEX(MID$(a$,i%+18,2)) i% = INSTR(a$, "03A004") IF i% > 0 THEN hi% = HEX(MID$(a$,i%+16,2))+256*HEX(MID$(a$,i%+18,2)) ELSE ' si pas d'exifs i% = INSTR(a$,"FFC00011"): IF i% = 0 THEN i% = INSTR(a$, "FFC20011") IF i%>0 THEN hi%=HEX(MID$(a$,i%+10,4)): wi%=HEX(MID$(a$,i%+14,4)) END_IF ELSE IF UPPER$(FILE_EXTRACT_EXTENSION$(f$)) = ".BMP" wi% = HEX(MID$(a$,37,2))+256*HEX(MID$(a$,39,2)) hi% = HEX(MID$(a$,45,2))+256*HEX(MID$(a$,47,2)) END_IF END_IF END_SUB 19h50 une petite correction d'étourderie...
Dernière édition par JL35 le Ven 8 Jan 2016 - 19:50, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Calcul du format d'une image Ven 8 Jan 2016 - 18:34 | |
| Intéressant. Tu peux aussi charger l'image dans le presse-papier, et de là dans un picture de grande dimension (il peut être invisible). Et on analyse le picture, séparément en largeur et hauteur, par la méthode de dichotomie. C'est 100 % Panoramic (il y a bien sûr une fonction KGF.dll qui fait ça, mais ce n'est pas le but de l'exercice). Pour tester le programme suivant, charge une image quelconque dans le presse-papier, puis lance le programme: - Code:
-
' dimensions_image_dans_presse-papier.bas dim R%, G%, B%, w%, h%, delta%
picture 2 : left 2,200 : width 2,8096 : height 2,8096 stretch_off 2 2d_target_is 2 display clipboard_paste 2 display
w% = width(2) h% = height(2) display R% = color_pixel_red(2,w%-1,0) G% = color_pixel_green(2,w%-1,0) B% = color_pixel_blue(2,w%-1,0) print str$(R%)+","+str$(G%)+","+str$(B%) delta% = w% while delta%<>0 if (R%+G%+B%)=0 delta% = abs(delta%)/2 w% = w% - delta% else delta% = 0 - abs(delta%)/2 w% = w% - delta% end_if R% = color_pixel_red(2,w%-1,0) G% = color_pixel_green(2,w%-1,0) B% = color_pixel_blue(2,w%-1,0) end_while
R% = color_pixel_red(2,0,h%-1) G% = color_pixel_green(2,0,h%-1) B% = color_pixel_blue(2,0,h%-1) delta% = h% while delta%<>0 if (R%+G%+B%)=0 delta% = abs(delta%)/2 h% = h% - delta% else delta% = 0 - abs(delta%)/2 h% = h% - delta% end_if R% = color_pixel_red(2,0,h%-1) G% = color_pixel_green(2,0,h%-1) B% = color_pixel_blue(2,0,h%-1) end_while
R% = color_pixel_red(2,w%-1,h%/2) G% = color_pixel_green(2,w%-1,h%/2) B% = color_pixel_blue(2,w%-1,h%/2) if (R%+G%+B%)=0 then w% = w%-1 R% = color_pixel_red(2,w%/2,h%-1) G% = color_pixel_green(2,w%/2,h%-1) B% = color_pixel_blue(2,w%/2,h%-1) if (R%+G%+B%)=0 then h% = h%-1
print str$(w%)+","+str$(h%)
end
| |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 8 Jan 2016 - 19:38 | |
| Oui, bonne année et la santé surtout ! Hou, dites donc, ça carbure ferme, tous les deux ! Ca rend dur de s'absenter longtemps ! Il faudra que je retrouve les jpg anormaux... Bon, je verrai cela plus en détail demain. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Calcul du format d'une image Ven 8 Jan 2016 - 19:50 | |
| Je mien devrait fonctionner avec toutes les images, JPG ou pas... Pourvu qu'on puisse la mettre dans le presse-papier. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Calcul du format d'une image Ven 8 Jan 2016 - 20:09 | |
| Klaus, ton système est efficace et rapide, et ne tient pas compte des données inscrites dans le fichier, donc ça marche dans tous les cas (pour la discrétion j'ai fait un Hide 2 et j'ai supprimé les display et affichages, sauf le résultat final). En Panoramic on ne peut mettre que Bmp ou Jpg dans le presse-papier, mais c'est bien de ceux-là qu'on parle ici. Jjn4, est-ce que les jpg dits anormaux sont ceux qui n'ont pas de données Exifs, je ne m'en souviens plus...? Tu as fait deux subs, une pour jpg normaux, une pour jpg anormaux, comment savoir à l'avance dans quel cas on est pour appeler la bonne sub ?Pardon j'avais pas bien lu l'appel, tu essayes d'abord la méthode 'normale', et puis l'autre si ça ne va pas... @Klaus, Finalement la méthode jjn4 (pour jpg anormaux) marche dans tous les cas: chargement de l'image dans un Picture caché (aux dimensions implicites), sauvegarde dans un Bmp temporaire, et lecture directe des dimensions dans l'en-tête, pas besoin de ton grand picture de 8096x8096 ni du presse-papier ! En simplifiant: - Code:
-
SUB Dimima(f$) ' Image JPG ou BMP exclusivement, dimensions rendues dans wi% et hi% DIM_LOCAL fm$: fm$ = "C:\TEMP\Provy.bmp" PICTURE 199: HIDE 199: FILE_LOAD 199,f$: FILE_SAVE 199,fm$: DELETE 199 FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: wi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: hi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1 FILE_DELETE fm$ END_SUB | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Sam 9 Jan 2016 - 16:04 | |
| Finalement, j'ai retrouvé la dernière image jpg particulièrement anormale que j'avais trouvée en 2010. J'en ai d'ailleurs modifié mon programme situé plus haut, car le plan B, je ne l'avais pas essayé et il y avait un bug... Maintenant, mon programme marche dans tous les cas. Celui de JL35 aussi lorsqu'on y adjoint le supplément qu'il a rajouté dernièrement. Quand au programme de Klaus, il marche dans tous les cas possibles, j'ai même essayé avec une gif, une tiff et une png. Finalement, ça fait trois programmes qui marchent. C'est super ! | |
| | | Contenu sponsorisé
| Sujet: Re: Calcul du format d'une image | |
| |
| | | | Calcul du format d'une image | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |