JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Fichiers images (BMP et JPG) Lun 22 Mar 2010 - 16:24 | |
| Suite au topic de jjn4 (Album photos), je me suis repenché sur les fichiers images. et leur utilisation sous Panoramic. Autant le format bmp est bien connu, autant le format jpg est compliqué. On ne s'intéresse ici qu'aux images bmp les plus courantes, en 16 millions de couleurs (3 ou 4 octets par pixel). Rappel de la structure d'un fichier bmp: - Code:
-
*** images BMP en 16 M de couleurs (3 ou 4 octets par pixel = couleur du pixel, + 0 éventuel) *** ============================================================================ - Structure de l'en-tête BMP (54 octets) - Dec Hex Lg --- ----- -- 0 00-01 2 "BM" 2 02-05 4 Taille totale fichier 6 06-09 4 Réservé (=0000) 10 0A-0D 4 Offset des datas image 14 0E-11 4 Taille du header (?) 18 12-15 4 Largeur image (pixels) -> w (poids faibles d'abord) 22 16-19 4 Hauteur image (pixels) -> h (... id...) 26 1A-1B 2 Nombre de plans 28 1C-1D 2 Nb de bits par pixel -> bpp 30 1E-21 4 Type de compression 34 22-25 4 Taille de l'image 38 26-29 4 Largeur (pixels/mètre) -> dw 42 2A-2D 4 Hauteur (pixels/mètre) -> dh 46 2E-31 4 Nombre de couleurs 50 32-35 4 Couleurs importantes 54 36 .. .... Datas image ....
============================================================================ ****** valeur Dec = adresse dans le fichier pour FILEBIN_POSITION ****** Données image: en commençant par le bas de limage, de gauche à droite. 3 (24 bits/pixel) ou 4 (32 bits/pixel) octets par pixels (bleu, vert, rouge + 0 éventuel). Chaque ligne est complétée par 0 à 3 octets à 0 (nombre = reste de la division par 4 du nombre de pixels par ligne). Taille de l'en-tête (&0E) = 54 octets (= offset datas, en &0A) Taille d'une ligne = (3 ou 4)* w + (w MOD 4) octets. Taille de l'image (&22) = Taille ligne * h Taille totale (&02) = Taille image + Taille en-tête ============================================================================
Octets par pixel: opp = bpp\8
Définition de l'image en pixels par pouce (dpi): dpw = CINT(.0254 * dw) dph = CINT(.0254 * dh)
Dimensions de l'image, en centimètres: largeur = dw * w / 100 hauteur = dh * h / 100 SOUS-PROGRAMMES:Dimensions en pixels d'une image JPG: Astuce: on convertit momentanément l'image au format bmp, le temps de lire les dimensions. On considère ici que l'image ne dépasse pas 65535 pixels de côté, ce qui est largement suffisant. - Code:
-
' Dimensions d'une image jpg DIM f$, fm$, i, w%, h%, v%(8) f$ = "C:\TEMP\P1010932.jpg": ' image dont on cherche les dimensions fm$ = "Z:\Pict.bmp": ' fichier de manoeuvre
PICTURE 1: HIDE 1: FILE_LOAD 1, f$: FILE_SAVE 1, fm$: DELETE 1 FILEBIN_OPEN_READ 1, fm$: FILEBIN_POSITION 1, 18: ' en 18, 4 + 4 octets FOR i = 1 TO 8: FILEBIN_READ 1, v%(i): NEXT i FILEBIN_CLOSE 1: FILE_DELETE fm$ w% = v%(1) + 256*v%(2): h% = v%(5) + 256*v%(6): ' 2 octets (<65536 pixels) Print w%: print h%: ' pour voir END Caractéristiques d'un fichier image bmp: - Code:
-
FILEBIN_OPEN_READ 1, fb$: ' ouverture du fichier bmp pos = 2: GOSUB Val4: tf = v: ' taille totale du fichier pos = 10: GOSUB Val4: lh% = v: ' taille du header (début des datas image) pos = 18: GOSUB Val4: w% = v: ' largeur image, en pixels pos = 22: GOSUB Val4: h% = v: ' hauteur image, en pixels pos = 28: GOSUB Val2: bpp% = v: ' nb de bits par pixel image opp% = INT(bpp%/8): ' nb d'octets par pixel image ll% = opp% * w%: ' longueur d'une ligne image, en octets FILEBIN_CLOSE 1
Val4: ' -> v% = valeur des 4 octets à la position pos FILEBIN_POSITION 1, pos FOR i = 1 TO 4: FILEBIN_READ 1, d%(i): NEXT i v = d%(1) + 256*d%(2) + 256*256*d%(3) + 256*256*256*d%(4) RETURN
Val2: ' -> v% = valeur des 4 octets à la position pos FILEBIN_POSITION 1, pos FOR i = 1 TO 2: FILEBIN_READ 1, d%(i): NEXT i v = d%(1) + 256*d%(2) RETURN Adresse dans le fichier bmp et couleur d'un pixel donné par ses coordonnées x et yRappel: - les lignes d'image sont en ordre inverse dans le fichier (ligne y=0 de l'image en bas du fichier) - les couleurs sont rangées sous la forme b, g, r (et non rgb comme habituellement) (on considère que le fichier est déjà ouvert: FILEBIN_OPEN_READ 1, et qu'on connaît tf, ll%, opp%: voir ci-dessus) - Code:
-
Posxy: ' Position dans le fichier image et couleur du pixel de coordonnées x% et y% pos = tf - (y%+1) * ll% + x% * opp% FILEBIN_POSITION 1, pos FILEBIN_READ 1, b: FILEBIN_READ 1, g: FILEBIN_READ 1, r RETURN Malheureusement, je n'ai pas trouvé le moyen d'écrire dans un fichier binaire, pour pouvoir non seulement lire, mais modifier la couleur d'un pixel ou d'une série de pixels dans le fichier image (voir dans la rubrique bugs: écrire dans un fichier binaire). | |
|
Invité Invité
| Sujet: Re: Fichiers images (BMP et JPG) Lun 22 Mar 2010 - 18:47 | |
| Salut JL35 Une chose que je comprend pas.Toi qui utilise d'autre basic, tu ne peux pas faire une routine dans le langage que tu connais, et te servir d'execute_wait pour transposer. Il me semble qu'il y a un compilateur pour je" crois Qbasic (si c'est celui-là que tu utilise je crois). Je ne sais pas si dans ce langage, il il y des possibilités de copier/coller. |
|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Fichiers images (BMP et JPG) Lun 22 Mar 2010 - 19:00 | |
| Bonsoir cosmos, Bien sûr je peux faire tout ça en QBasic ou QuickBasic (=QBasic compilable), et je ne m'en suis pas privé dans le passé, les fonctions d'accès aux fichiers sont bien plus faciles à utiliser et plus complètes. Et je pourrais facilement faire un module externe pour les accès disque.
Mais justement je voudrais pouvoir tout faire en Panoramic et éviter d'avoir à appeler un autre module, pour que tout soit intégré dans le source, c'était justement le but de mon intervention ici. | |
|
Invité Invité
| Sujet: Re: Fichiers images (BMP et JPG) Lun 22 Mar 2010 - 19:36 | |
| Ok d'accord. Mais Jack n'est pas Superman. La majorité d'entre vous définissez la priorité sur les jeux, et je pense que Jack aussi, donc pour ce qui serait normalement du basic (dans le sens habituel), cela passe au second plan. |
|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Fichiers images (BMP et JPG) Lun 22 Mar 2010 - 20:59 | |
| Je ne dis pas que c'est une priorité. Mais ça me paraît quand même des fonctions élémentaires, pouvoir lire et écrire dans un fichier, texte ou binaire. Et en ce qui me concerne ce n'est pas du tout pour des jeux, mais pour de la gestion d'images (par exemple issues d'apn, ou pour des graphismes). Ou bien pour pouvoir accéder à n'importe quel fichier, quel qu'il soit. En QBasic il y avait une seule fonction OPEN, il suffisait de préciser dans les paramètres si c'était texte ou binaire, pour lecture ou écriture, de un seul ou plusieurs octets. Et une seule fonction CLOSE. Et je regrette ces facilités. C'est peut-être plus sécurisant en Panoramic, mais si je conçois qu'on doive prendre des précautions vis-à-vis de l'utilisateur du programme, j'estime que le programmeur lui doit pouvoir tout faire, à ses risques et périls. Je renvoie à mon post de novembre (2009 ?): https://panoramic.1fr1.net/vos-souhaits-d-amelioration-de-panoramic-f8/gestion-de-fichiers-panoramic-versus-qbasic-t404.htm?highlight=fichiers | |
|
Contenu sponsorisé
| Sujet: Re: Fichiers images (BMP et JPG) | |
| |
|