Données EXIF, arrondir à la valeur standard

niquedouille -  
 fiu -
Titre complet : Données EXIF, arrondir à la valeur standard la plus proche

Bonjour,
Sur ma page, j'ai un formulaire d'envoit de fichiers. Je m'en sers pour uploader des images, et je stock les informations EXIF dans ma base de données mysql.

Tout fonctionne bien, ou presque.

Pour l'ouverture, il m'enregistre par exemple : 10/1 (ou 63/10)
J'aimerai qu'il m'enregistre 10 (ou 6,3)

J'ai configuré ma table sql avec FLOAT 2,1
Cela fonctionne bien pour la décimal, il m'affiche alors 9,9 (pour le résultat : 10/1)

Cette valeur est exacte, mais j'aimerai qu'il m'affiche un nombre "standard" :
f/1,4
f/1,8
f/2,0
f/2,2
f/2,5
f/2,8
...
f/10
f/11
etc... correspondant aux valeurs que l'on trouve sur un appareil photo.

Je ne sais pas trop comment m'y prendre pour coder cela. Sans me donner le code, pourriez-vous m'en donner les grandes lignes (en francais) ?

merci :)
Configuration: Windows XP
Firefox 3.5.5

7 réponses

  1. le père
     
    Bonjour

    Si j'ai compris ton problème, en fait, tout ce dont tu as besoin, c'est de définir ton champ en texte plutôt qu'en numérique.
    0
  2. niquedouille
     
    heu.. non pas vraiment.

    re-explication :

    si je récupère par exemple "9,43434" je voudrai qu'il soit affiché : "9"
    si je récupère par exemple "6,4114" je voudrai qu'il soit affiché : "6,3"
    si je récupère par exemple "5,84343" je voudrai qu'il soit affiché : "5,6"
    etc..

    la valeur recupéré étant une valeur exacte
    la valeur affiché étant la valeur la plus proche parmis les valeurs standard, qui sont :

    f/1.2, f/1.4, f/2, f/2.8, f/4, f/5.6, f/8, f/11, f/16, et f/22 (en gros)

    le "f/" je m'en tape, je peux l'afficher après ça.
    0
  3. le père
     
    Je n'avais peut-être pas compris ton problème...
    Tu mets les valeurs standard dans un tableau.
    Tu calcules la valeur absolue de la différence entre la valeur fournie et chacune des valeurs du tableau. Tu gardes la ligne du tableau pour laquelle cette différence est la plus petite

    Ceci peut être fait automatiquement par mysql si tu as rempli une table tblouv avec les valeurs standard dans le champ ouv :
    SELECT ouv, abs( ouv - nouvellevaleur ) AS ecart FROM `tblouv` ORDER BY ecart LIMIT 1
    0
    1. niquedouille
       
      Cette fois t'es en plein dedans ;)
      j'ai compris le principe, mais maintenant j'essaye de mettre en place directement avec mysql.. mais je ne maitrise pas les parametres que tu me donnes :

      $f_recup = valeur récuperée (ex: 9.9)
      fnumbers = nom de la table
      f_sdt = valeur de la table fnumbers


      <?php
      mysql_query("SELECT f_std, abs(f_std - $f_recup) AS ecart FROM fnumbers ORDER BY ecart LIMIT 1");
      ?>

      je ne vois pas bien quel résultat cette expression renvoit.
      0
  4. fiu
     
    salut

    pour ma part, j'aurais bien vu une table (j'ai pas creusé une solution basée sur des formules)
    genre Ouvertures(oStd numeric, oMin numeric, oMax numeric)
    ensuite on remplit la table avec oStd <= 2^(n/2), oMin <= 2^((2n-1)/4) et oMax <= 2^((2n+1)/4)
    ensuite, d'un coup de patte, on update les extremes (n=1 et n=10) pour y mettre 0 et gogol

    ensuite tu n'as plus qu'à requeter oStd where ta_donnée_EXIF between oMin and oMax

    Ca te va ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. le père
     
    Il faut d'abord t'être connecté au serveur, et ensuite avoir sélectionné la base avant de pouvoir t'en servir.
    mysql_connect($hote,$user,$password) or die(mysql_error());
    mysql_selectdb($nomdetabase) or die(mysql_error());

    Ensuite, mysql_query te rend un résultat (si tout va bien !) que tu peux exploiter avec mysql_fetch_array()
    $resultat=mysql_query("SELECT f_std, abs(f_std - $f_recup) AS ecart FROM fnumbers ORDER BY ecart LIMIT 1") or die (mysql_error());
    if ($ligne=mysql_fetch_array($resultat)) {
    $valeurcherchee=$ligne['f_std'];
    }
    0
  7. fiu
     
    Hello

    donc, j'ai une jolie table Ouvertures avec des float
    remplie avec des pow(2, ...) au lieu de 2^... :D
    +--------+--------+--------+
    ! oStd   ! oMin   ! oMax   !
    +--------+--------+--------+
    ! 1.41421! 0      ! 1.68179!
    ! 2      ! 1.68179! 2.37841!
    ! 2.82843! 2.37841! 3.36359!
    ! 4      ! 3.36359! 4.75683!
    ! 5.65685! 4.75683! 6.72717!
    ! 8      ! 6.72717! 9.51366!
    !11.3137 ! 9.51366!13.4543 !
    !16      !13.4543 !19.0273 !
    !22.6274 !19.0273 !26.9087 !
    !32      !26.9087 !1e+010  !
    +--------+--------+--------+
    et maintenant, il n' y a plus qu'à s'en servir :
    select nom, lieu, etc, oStd
    from photos, lieux, etc, Ouvertures
    where ...
    and photos.ouverture between oMin and oMax

    => dans un cliché, ouverture vaut 1.9 => oStd contiendra 2
    => dans un autre cliché, ouverture vaut 6.1 => oStd contiendra 5.6
    etc

    Ça devrait être simple et rapide à intégrer car il n'y a pas de tri ni de LIMIT
    0
    1. niquedouille
       
      Salut
      désolé, j'ai oublié de répondre !!!! Quel ingrat :)

      Merci beaucoup, "lepere". Je connais les requetes mysql, mais je ne connaissait pas le "AS ECART"
      J'avais essayé tel que tu l'as écrit, mais j'avais fait une petite erreur de code un peu au dessus, rien de grave. C'est donc corrigé, et cela fonctionne parfaitement ! Encore merci de ton aide !

      flu> j'avoue ne pas comprendre parfaitement ta méthode !!!
      0
  8. fiu
     
    C'est pas grave
    Tu comprends ta méthode avec des calculs, utilise-la
    Je pensais que la mienne était plus simple, plus rudimentaire. Si tu la comprends pas, c'est que je me suis trompé :-)
    0