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 |
|
|
| Largeur et hauteur d'une image JPG ou BMP | |
| | |
Auteur | Message |
---|
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Largeur et hauteur d'une image JPG ou BMP Lun 17 Juil 2023 - 18:23 | |
| Bonjour à tous ! Voici une nouvelle version à tester ! Lors de la progression de marqueur en marqueur, si la longueur d’un des segments est mal renseignée, le programme avance pas à pas jusqu’à trouver le prochain marqueur. - Code:
-
' Dimensions d'une image JPG ou BMP ' JL35 et Marc - Juillet 2023 ' Ecrit en langage PANORAMIC 0.9.29.i.9
dim nomFichier$, largeurImage%, hauteurImage%
label ouvrirFichier
' créer une boite de dialoque pour ouvrir un fichier image open_dialog_pic 1
' Mettre un filtre à la boite de dialogue pour ne sélectionner que les fichiers avec l'extension JPG ou BMP filter 1,"Fichier image *.JPG ou *.BMP|*.jpg;*.bmp"
button 2 top 2,25 left 2,480 caption 2,"Fichier image" on_click 2,ouvrirFichier
end ' ------------------------------------------------------------------------------ ouvrirFichier: ' Afficher la boite de dialogue pour sélectionner un fichier image nomFichier$ = file_name$(1)
' si l'utilisateur annule sa recherche => fin du programme if nomFichier$ = "_" return end_if
largeurHauteurImage(nomFichier$)
' affichage des dimensions print "Nom du fichier : " + file_extract_name$(nomFichier$) print "Largeur de l'image :" + str$(largeurImage%) + " pixels" print "Hauteur de l'image :" + str$(hauteurImage%) + " pixels" print return ' ------------------------------------------------------------------------------ sub largeurHauteurImage(fichier$) dim_local buffer%(25), marqueur%, index%, tailleFichier%, longueurSegment%
' remise à "0" des variables hauteur et largeur de l'image hauteurImage% = 0 largeurImage% = 0 ' ouvrir en lecture le fichier de la photo sélectionné dans la boite de dialogue filebin_open_read 1,fichier$
' lire la taille du fichier en octets tailleFichier% = filebin_size(1) ' lecture entête fichier sur une longueur de 25 octets filebin_block_read 1,25,buffer%(0)
' Identifier le type de fichier image : BMP ou JPG ? if buffer%(0) = hex("FF") and buffer%(1) = hex("D8") :' cas d'un fichier JPG
index% = 2
' Recherche du marqueur 0xFFCx et lecture des dimensions du JPG ' Principe de recherche des maqueurs fourni par JL35 while index% < tailleFichier% filebin_position 1,index% filebin_block_read 1,9,buffer%(0) marqueur% = (buffer%(0)*256) + buffer%(1) longueurSegment% = (buffer%(2)*256) + buffer%(3)
' avance pas à pas jusqu'au prochain marqueur 0xFF en cas de longueur erronée du précédent segment while buffer%(0) <> 255 index% = index% + 1 longueurSegment% = longueurSegment% + 1 filebin_position 1,index% filebin_block_read 1,9,buffer%(0) end_while
marqueur% = (buffer%(0)*256) + buffer%(1) longueurSegment% = (buffer%(2)*256) + buffer%(3)
' décodage marqueurs de base 0xFFCx (SOF : Start Of File x) if marqueur% > 65471 and marqueur% < 65476 :' 0xFFC0, 0xFFC1, 0xFFC2 et 0xFFC3 ' hauteur de l'image en pixels hauteurImage% = buffer%(5) * 256 + buffer%(6) ' largeur de l'image en pixels largeurImage% = buffer%(7) * 256 + buffer%(8)
' sortie de boucle lorsque le marqueur recherché a été trouvé exit_while end_if
' saut vers le prochain marqueur index% = index% + longueurSegment% + 2 end_while else ' fichier BMP largeurImage% = buffer%(18) + (buffer%(19)*256) + (buffer%(20)*power(256,2)) + (buffer%(21)*power(256,3)) hauteurImage% = buffer%(22) + (buffer%(23)*256) + (buffer%(24)*power(256,2)) + (buffer%(25)*power(256,3)) end_if
' Fermer fichier binaire filebin_close 1 end_sub
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Largeur et hauteur d'une image JPG ou BMP Lun 17 Juil 2023 - 20:18 | |
| Alors là bravo Marc !
ça marche même avec le dernier fichier de jjn4 un peu bizarre que j'avais du mal à analyser, j'adopte ! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Largeur et hauteur d'une image JPG ou BMP Mar 18 Juil 2023 - 16:16 | |
| Super ! Ca marche avec l'image que j'ai évoquée et d'autres que j'avais trouvées du même genre ! Et du coup, j'ai épuisé la liste des photos avec qui la routine ne marchait pas ! Bon, ceci dit, ça ne prouve pas qu'il n'y en ait pas d'autres. (après tout, ne dit-on pas que la perfection n'existe pas). Alors, disons que la routine obtenue soit à la limite du parfait Bravo Marc !!! Très fort !!! Nota: j'ai actualisé la modification de ta routine nommée : Exploration des images par liste: que j'ai publiée plus haut. Comme ça, cela permettra à d'autres qui ont des listes de photos pouvant être suspectes (généralement, elles viennent d'Internet) de voir, par répertoires entiers, s'ils en trouvent d'autres encore récalcitrantes. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Largeur et hauteur d'une image JPG ou BMP Mar 22 Aoû 2023 - 19:08 | |
| J'apporte ma contribution également, mais avec l'utilisation des dlls windows kernel32 et gdiplus! (gdiplus retrouve les tailles d'images de type JPG , PNG , GIF , BMP , TIFF) - Code:
-
dim Width_Image% , Height_Image% dim sFile$
sFile$ ="C:\Documents and Settings\Utilisateur\Bureau\etoiles-2016-11-a-full_jpg.jpg"
GetImageSize(sFile$) print "Fichier : " , sFile$ print "Largeur en pixel(s) = " , Width_Image% print "Hauteur en pixel(s) = " , Height_Image%
END ' sub GetImageSize(ImageFile$) if file_exists(ImageFile$) = 0 message "Fichier '" + ImageFile$ + "' non trouvé!" exit_sub end_if dim_local ret% , Wstr_ImageFile$ , Len_Wstr_ImageFile% , si$ , ptoken% , hImage%
peek_reverse ' Convertir une chaine de caractère au format de caractère large 'ANSI Latin 1 ; Europe occidentale (Windows)' (requis pour 'GdipLoadImageFromFile') dll_on "kernel32" ' Len_Wstr_ImageFile% = (len(ImageFile$) + 1)*2 :' calcul de la taille de la structure tampon qui va contenir la chaine de caractère à convertir Wstr_ImageFile$ = string$(Len_Wstr_ImageFile% , chr$(0)) :' création de la structure tampon ret% = dll_call6("MultiByteToWideChar" , 1252 , 0 , peek32(adr(ImageFile$)) , 0-1 , peek32(adr(Wstr_ImageFile$)) , Len_Wstr_ImageFile%) :' conversion et stockage de la chaine de caractère dans 'Wstr_ImageFile$' ' dll_off ' Retouver les dimensions de l'image (formats supportés par GDIPlus: JPG , PNG , GIF , BMP , TIFF) dll_on "gdiplus" ' si$ = chr$(1) + string$(15 , chr$(0)) :' structure contenant des données pour intialiser GDIPlus ret% = dll_call3("GdiplusStartup" , adr(ptoken%) , peek32(adr(si$)) , 0) :' initialisation de la bibliothèque GDIPlus; stocke l'ID d'initialisation dans 'ptoken%' ret% = dll_call2("GdipLoadImageFromFile" , peek32(adr(Wstr_ImageFile$)) , adr(hImage%)) :' charger le fichier image en mémoire et écrire son pointeur dans 'hImage%' ret% = dll_call2("GdipGetImageWidth" , hImage% , adr(Width_Image%)) :' obtenir la dimension horizontale de l'image dans Width_Image% ret% = dll_call2("GdipGetImageHeight" , hImage% , adr(Height_Image%)) :' obtenir la dimension verticale de l'image dans Height_Image% ret% = dll_call1("GdipDisposeImage" , hImage%) :' libérer les ressources occupées par 'hImage%' ret% = dll_call1("GdiplusShutdown" , ptoken%) :' libérer les ressources occupées par 'ptoken%' (GDIPlus!) ' dll_off end_sub
EDIT: corrigé le pb d'accent
Dernière édition par silverman le Dim 27 Aoû 2023 - 9:35, édité 2 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Largeur et hauteur d'une image JPG ou BMP Ven 25 Aoû 2023 - 19:00 | |
| Eh, c'est carrément génial, cette dernière méthode !!! C'est relativement court et ça marche pour tous les cas de figure. J'ai essayé avec toutes les images récalcitrantes que j'avais trouvées, eh bien ça marche impeccable. Bravo, Silverman ! Ca, c'est une superbe routine à garder en réserve !!! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Largeur et hauteur d'une image JPG ou BMP Sam 26 Aoû 2023 - 14:13 | |
| Euh, à la réflexion, j'ai trouvé des cas où ça ne marche pas C'est quand le titre de l'image comporte des accents comme : Réceptacle... C'est dommage parce que ça partait bien !!! | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Largeur et hauteur d'une image JPG ou BMP Dim 27 Aoû 2023 - 8:18 | |
| A zut, je l'avais pas vu celui là! j'essaye de trouver une solution EDIT: c'est corrigé (code maj dans mon post précédent)! Merci d'avoir testé et détecté ce bug qui m'aurait posé pb dans d'autre code | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Largeur et hauteur d'une image JPG ou BMP Dim 27 Aoû 2023 - 16:36 | |
| Impecc ! Là, ça marche ! Je l'ai même transformé, comme le pg de Marc, pour en faire un explorateur de listes : - Code:
-
' Dimensions d'une image selon Silverman dim sFile$ , Width_Image% , Height_Image% , a$ , i% , b$ label ouvrirFichier width 0,1000
open_dialog_pic 1 filter 1,"Fichier image *.JPG ou *.BMP|*.jpg;*.bmp"
button 2 top 2,25 left 2,880 caption 2,"Fichier image" on_click 2,ouvrirFichier
dlist 4
memo 8 width 8,800 height 8,400 bar_vertical 8
end : ' ============================================
ouvrirFichier: sFile$ = file_name$(1) if sFile$ = "_" return end_if clear 4 a$=file_find_first$ while a$<>"_" if lower$(right$(a$,4))=".jpg" or lower$(right$(a$,4))=".bmp" item_add 4,a$ end_if a$=file_find_next$ end_while file_find_close item_add 8,file_extract_path$(sFile$) item_add 8,"-----------------------------" for i% = 1 to count(4) Width_Image% = 0 Height_Image% = 0 b$=item_read$(4,i%) GetImageSize(b$) if Width_Image%=0 or Height_Image%=0 item_add 8,"Nom du fichier : " + file_extract_name$(b$) item_add 8,"Largeur de l'image :" + str$(Width_Image%) + " pixels" item_add 8,"Hauteur de l'image :" + str$(Height_Image%) + " pixels" item_add 8,"" end_if caption 0,str$(i%)+"/"+str$(count(4)) next i% beep return
sub GetImageSize(ImageFile$) if file_exists(ImageFile$) = 0 message "Fichier '" + ImageFile$ + "' non trouvé!" exit_sub end_if dim_local ret% , Wstr_ImageFile$ , Len_Wstr_ImageFile% , si$ , ptoken% , hImage% peek_reverse dll_on "kernel32" Len_Wstr_ImageFile% = (len(ImageFile$) + 1)*2 Wstr_ImageFile$ = string$(Len_Wstr_ImageFile% , chr$(0)) ret% = dll_call6("MultiByteToWideChar" , 1252 , 0 , peek32(adr(ImageFile$)) , 0-1 , peek32(adr(Wstr_ImageFile$)) , Len_Wstr_ImageFile%) dll_off dll_on "gdiplus" si$ = chr$(1) + string$(15 , chr$(0)) ret% = dll_call3("GdiplusStartup" , adr(ptoken%) , peek32(adr(si$)) , 0) ret% = dll_call2("GdipLoadImageFromFile" , peek32(adr(Wstr_ImageFile$)) , adr(hImage%)) ret% = dll_call2("GdipGetImageWidth" , hImage% , adr(Width_Image%)) ret% = dll_call2("GdipGetImageHeight" , hImage% , adr(Height_Image%)) ret% = dll_call1("GdipDisposeImage" , hImage%) ret% = dll_call1("GdiplusShutdown" , ptoken%) dll_off end_sub Ce qui m'a permis de l'essayer sur des milliers d'images. Ca marche impecc ! Ca permet même de détecter les fichiers : - WEBP déguisés en JPG - les noms d'images comportant des caractères non ASCII. Ca fonctionne à peu près à la vitesse de : 100 détections par secondes, ce qui est raisonnable. Bravo, Silverman ! C'est une astuce à mettre de côté ! | |
| | | Contenu sponsorisé
| Sujet: Re: Largeur et hauteur d'une image JPG ou BMP | |
| |
| | | | Largeur et hauteur d'une image JPG ou BMP | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |