Forum Programmation.autre Automatisation de réduction d'image

Posté par (page perso) .
Tags : aucun
1
10
fév.
2009
Bonjour,

Je me creuse la tête depuis deux jours sur google pour trouver une solution à mon problème.

J'ai un serveur qui doit réceptionner tout les jours une dixaine d'images. Toutes les nuits, il doit réduire les images qui sont plus haute que 450 pixels, les renommer et pour finir les envoyer sur un ftp distant.

Renommer et envoyer les images ne me pose pas de problème mais je n'arrive pas a trouver comment faire en sorte que toute les images qui sont plus haute que 450 pixels soit réduite à cette dernière.

Histoire de rigoler encore plus : le serveur tourne aujourd'hui sur l'OS du mal (Windows) et va heureusement migrer dans l'année sur du GNU&Linux. Mais comme ce script doit tourner maintenant et que je ne veux pas tout refaire dans 6 mois, il faut absolument que j'utilise des logiciels libre disponible sur les deux plateformes (et qui soit stable sur les deux aussi). Bref aujourd'hui j'ai ImageMagick et Perl à ma disposition mais je ne trouve rien qui puisse m'aider.

Merci d'avance.
  • # Avec ce que tu as

    Posté par (page perso) . Évalué à 5.

    Voilà en gros une piste pour commencer:

    [binarym@rei]:~/public_html/vrac% identify DSCN4426.jpg
    DSCN4426.jpg JPEG 1704x2272 DirectClass 1000kb 0.000u 0:01
    [binarym@rei]:~/public_html/vrac% identify DSCN4426.jpg | perl -ne 'if(/(\d+)x(\d+)/) { if ($1 > 450) { `convert -resize 450x DSCN4426.jpg DSCN4426-resized.jpg` } }' && identify DSCN4426-resized.jpg
    DSCN4426-resized.jpg JPEG 450x600 DirectClass 123kb 0.000u 0:01
    • [^] # Re: Avec ce que tu as

      Posté par (page perso) . Évalué à 1.

      Une très belle illustration de ce quoi ressemble un script perl! Ca marche mais c'est illisible...
      • [^] # Re: Avec ce que tu as

        Posté par (page perso) . Évalué à 1.

        Bein, le concept du oneline, c'est de tenir sur une ligne.
        Après, il suffit de mettre des retours chariots bien placés et tout va mieux:

        identify DSCN4426.jpg | perl -ne '
        if(/(\d+)x(\d+)/) {
        if ($1 > 450) {
        `convert -resize 450x DSCN4426.jpg DSCN4426-resized.jpg`
        }
        }
        ' && identify

        (désolé, mais linusquèfèr mange l'indentation ...)
        Mais bon, pour une personne qui connait un minimum Perl (ce qui est à priori le cas de Philou) ça se lit plutôt bien...
  • # Avec ImageMagick et un peu de bash (et consors)

    Posté par (page perso) . Évalué à 4.

    Il me semble que ImageMagick sait faire ca tout seul comme un grand, mais comme je connais pas bien ses options on peut scripter, ca donnerait un truc du genre:

    height=$(identify $file | awk '{print $3}'|awk -F 'x' '{print $2}')

    if [ height -geq 450 ];then
    convert -scale x450 $file $out_file
    fi

    Ce qui doit pouvoir se traduire tres facilement en perl (quand on connait un minimum le perl ce qui est pas mon cas).
    Les commandes identify & convert font partie de ImageMagick donc ne devraient pas poser de probleme.
  • # ImageMagick

    Posté par (page perso) . Évalué à 5.

    http://www.imagemagick.org/www/command-line-processing.html#(...)
    widthxheight : Maximum values of height and width given, aspect ratio preserved.

    convert -resize 1024x450 avec 1024 comme longueur max (à remplacer par un autre nombre cohérent avec les images à traiter) et 450 comme hauteur max.

    Plutôt que de chercher avec google, tu aurais mieux fait de chercher directement sur le site d'imagemagick, d'autant que tu connaissais l'outil...
    • [^] # Re: ImageMagick

      Posté par (page perso) . Évalué à 2.

      Ah, bien sûr il faut rajouter le nom de l'image à traiter, hein :-)
      • [^] # Re: ImageMagick

        Posté par (page perso) . Évalué à 1.

        Pour avoir essayé en vrai cette option que j'ai évidemment trouvé sur le man de la commande : le résultat est que toute les images se trouve unifié avec une hauteur de 450 pixels et ce même si elle sont plus petite à la base.

        Donc sauf erreur de ma part : le manuel ne m'est pas utile pour mon cas plutôt particulier visiblement.
        • [^] # Re: ImageMagick

          Posté par (page perso) . Évalué à 3.

          Regarde les operateurs < et > sur la page citée ci-dessus...
        • [^] # Re: ImageMagick

          Posté par (page perso) . Évalué à 4.

          Donc sauf erreur de ma part : le manuel ne m'est pas utile pour mon cas plutôt particulier visiblement.

          Ben si ! Mais faut pas s'attendre à ce que le manuel liste toutes les combinaisons d'options !

          Voir les paragraphes « Only Shrink Larger Images ('>' flag) », « Only Enlarge Smaller Images ('<' flag) », le lien « -resize » puis le lien « Image Geometry » :


          indy@hal:~$ identify 001.jpeg
          001.jpeg JPEG 640x480 640x480+0+0 DirectClass 8-bit 46.4746kb
          indy@hal:~$ convert 001.jpeg -resize x400\> out.jpeg
          indy@hal:~$ identify out.jpeg
          out.jpeg JPEG 533x400 533x400+0+0 DirectClass 8-bit 33.6484kb
          indy@hal:~$ convert 001.jpeg -resize x800\> out.jpeg
          indy@hal:~$ identify out.jpeg
          out.jpeg JPEG 640x480 640x480+0+0 DirectClass 8-bit 45.5918kb

          « J'ai pas Word, j'ai pas Windows, et j'ai pas la télé ! »

          • [^] # Re: ImageMagick

            Posté par (page perso) . Évalué à 4.

            Effectivement je mérite une centaine de coup de fouet : La solution ultime à mon problème est :

            mogrify -resize "x450>" *

            Pardon aux familles et tout et tout et merci pour l'aide !
          • [^] # Re: ImageMagick

            Posté par (page perso) . Évalué à 0.

            Le problème, c'est quand on filtre tous les contenus qui "Enlarge" your ...

            :)))
  • # GMIC

    Posté par . Évalué à 2.

    Salut,
    Il me semble que tu peux faire ça avec GMIC sur lequel tu trouvera des information a l'adresse suivante:
    http://gmic.sourceforge.net/documentation.shtml
    J'ai vérifié et il est disponible pour W$ et certaines distributions GNU/Linux. Il permet entre autre de traiter des images ou des série d'images.
    Tu dois pouvoir inclure ça dans un script tout simple.

    Olivier

    - Dans la vie, il faut toujours se fier aux apparences. Quand un homme a un bec de canard, des ailes de canard et des pattes de canards, c’est un canard. C’est vrai aussi pour les petits merdeux.

    • [^] # Re: GMIC

      Posté par (page perso) . Évalué à 3.

      Effectivement, je confirme tu peux faire :

      gmic image.jpg --dimensions --[1] 450 -if @\{1,1\} -+[1] 450 -/[1] @\{1,1\} -*[1] 450 -r[0] @\{1,0,1\},1,100%,2 -endif -k[0] -o output.jpg

      David.
  • # en python

    Posté par (page perso) . Évalué à 3.

    Le code qui suit me sert à limiter la taille des images que je pose sur blogiwi à une largeur de 475, par exemple python x.py monimage.jpg
    j'ai mis des commentaires pour rappeler l'indentation disparue à l'affichage


    import Image,sys
    from decimal import Decimal
    img = Image.open('%s/%s' % ('/home/gg', sys.argv[1]))
    (width, height) = img.size
    print img.size
    (max_width, max_height) = (475, 1000)
    ratio = Decimal(width)/Decimal(height)
    target_ration = Decimal(max_width)/Decimal(max_height)
    if width > max_width:
    width = max_width; #tabulation disparue à l'affichage
    height = Decimal(width)/ratio# là aussi
    #if height is still bigger than target ie
    #above condition wasnt met then check height
    if height > max_height:
    height = max_height # tabulation
    width = Decimal(height)*ratio #tabulation
    img_resize = img.resize((width, height), Image.ANTIALIAS)
    img_resize.save('%s/%s' % ('/home/gg', sys.argv[1]), quality=85)

    If you choose open source because you don't have to pay, but depend on it anyway, you're part of the problem.evloper) February 17, 2014

    • [^] # Re: en python

      Posté par (page perso) . Évalué à 3.

      Juste comme ça, pour l'indentation, il suffit de remplacer tous les espaces par &nbsp; avec un éditeur de texte. Pour les tabulations il suffit de mettre le bon nombre de &nbsp;.
      Parce que du perl sans tabulation ça passe mais pour du python c'est limite :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.