FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Simuler l’appui de n’importe quelle touche.
par papydall Hier à 23:54

» Le Forum est en vacances.
par JL35 Hier à 21:20

» Une autre façon de terminer une application.
par JL35 Mar 22 Aoû 2017 - 14:27

» Compilateur FBPano
par Mike Lun 21 Aoû 2017 - 23:17

» Pb 20 (en analyse): plantage à l'appel d'un SUB
par Jack Lun 21 Aoû 2017 - 21:58

» Pb 19 (en analyse): libellé d'erreur dans des IF imbriqués
par Jack Lun 21 Aoû 2017 - 21:55

» Copier / coller du texte à partir de la fenêtre de commandes
par jean_debord Lun 21 Aoû 2017 - 9:46

» COMPILATEUR V 0.9 beta 8 du 18 aout 2017
par papydall Lun 21 Aoû 2017 - 5:01

» Mettre en windows en veille
par papydall Lun 21 Aoû 2017 - 4:15

» Stretch_on ne stretch plus...
par papydall Dim 20 Aoû 2017 - 15:22

» Pb 18 (en analyse): RESTORE_LABEL avec DATA à la fin
par Jack Dim 20 Aoû 2017 - 13:21

» Problème de traitement des opérateurs avec le compilateur.
par Pedro Alvarez Sam 19 Aoû 2017 - 20:01

» Pb 17 (résolu): ITEM_SELECT ne fonctionne pas
par Jack Jeu 17 Aoû 2017 - 19:26

» un nouveau editeur panobasic
par Jean Claude Jeu 17 Aoû 2017 - 10:18

» Le compilateur.
par Pedro Alvarez Jeu 17 Aoû 2017 - 8:36

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Août 2017
LunMarMerJeuVenSamDim
 123456
78910111213
14151617181920
21222324252627
28293031   
CalendrierCalendrier

Partagez | 
 

 Calcul du format d'une image

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
jjn4

avatar

Nombre de messages : 1594
Date d'inscription : 13/09/2009

MessageSujet: Calcul du format d'une image   Ven 8 Jan 2016 - 18: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.
scratch alien Smile


Dernière édition par jjn4 le Sam 9 Jan 2016 - 17:51, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://jjn4.e-monsite.com
JL35



Nombre de messages : 5928
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Calcul du format d'une image   Ven 8 Jan 2016 - 20: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 - 21:50, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Calcul du format d'une image   Ven 8 Jan 2016 - 20: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
jjn4

avatar

Nombre de messages : 1594
Date d'inscription : 13/09/2009

MessageSujet: +++   Ven 8 Jan 2016 - 21: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.
No alien Sleep
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://jjn4.e-monsite.com
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Calcul du format d'une image   Ven 8 Jan 2016 - 21:50

Je mien devrait fonctionner avec toutes les images, JPG ou pas... Pourvu qu'on puisse la mettre dans le presse-papier.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5928
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Calcul du format d'une image   Ven 8 Jan 2016 - 22: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
jjn4

avatar

Nombre de messages : 1594
Date d'inscription : 13/09/2009

MessageSujet: +++   Sam 9 Jan 2016 - 18: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 !
Smile cheers alien cheers Very Happy
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://jjn4.e-monsite.com
Contenu sponsorisé




MessageSujet: Re: Calcul du format d'une image   

Revenir en haut Aller en bas
 
Calcul du format d'une image
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Format d'image
» [tout logiciel] Enregistrer une image/ format jpg et gif
» Format de l'affichage image TV
» [Résolu] Photoshop problème format images
» format des BMP sur Garmin 3490 : pas d'affichage

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC 32 bits :: Vos sources, vos utilitaires à partager-
Sauter vers: