•  » Utilisation
  •  » Problème de création de vignettes

#1 2005-03-30 16:52:47

torode
honoris causa
Paris
2003-07-31
86

Problème de création de vignettes

Bonjour,
Je cherche un moyen pour créer les images "plein écran" 600x400 et les thumbnails d'après des photos en haute def envoyées dans un dossier. J'ai installé GD, sans résultat, puis suite à la lecture d'un post de Rych sur le forum Anglais j'ai installé ImageMagick sur mon serveur et écrit le script shell suivant qui fonctionne parfaitement quand il est exécuté en root en ligne de commande sur le serveur avec cd folder ; maj .

Code:

#!/bin/bash
if [ ! -e $1/thumbnail ]
then mkdir $1/thumbnail
  chmod -R 777 $1/thumbnail
  chown -R moncompte:root $1/thumbnail
fi
if [ ! -e $1/pwg_high ]
then mkdir $1/pwg_high
  chmod -R 777 $1/pwg_high
  chown -R moncompte:root $1/pwg_high
fi
cd $1
for file in $(ls)
do
  if [ -f $file ]
  then
    chmod -R 777 $file
    small=`echo $file | tr '[A-Z]' '[a-z]'`
    if [ ! -e pwg_high/$small ]
    then
      mv $file pwg_high/$small
      convert -resize 600x600 pwg_high/$small $small
      convert -resize 128x128 $small thumbnail/$small
      chmod -R 777 $1
      chown -R moncompte:root $1
    fi
  fi
done
exit

Ce script crée les dossiers pwg_high et thumbnail s'ils n'existent pas, change les droits et propriétaire, déplace les nouvelles photos dans le dossier pwg_high, crée un 600x400 dans le dossier parent et un 128x128 dans le dossier thumbnail.

J'a placé le code ci-dessous à la ligne 336 de la page  admin/update.php :

Code:

  $pathphoto = str_replace( './', '/var/www/html/photos/', $dirname );
  exec('maj $pathphoto');

Mais rien ne se produit quand je lance la "synchronisation" dans l'administration du site.
Est-de un problème de droits, de php.ini, d'emplacement du script dans la page php?
Existe t'il un moyen plus élégant d'obtenir ce que je souhaite?
D'avance merci pour toute aide.

Hors ligne

#2 2005-03-31 02:21:41

Grand-Pa
Membre
Grenoble - France
2005-01-15
17

Re: Problème de création de vignettes

Dans ton exec(), as-tu essayé d'indiquer le chemin complet de ton script ?
Question idiote : le script est bien en chmod 775 (exécutable par others) ?
Le script est-il situé dans le répertoire de PWG ?
Dans php.ini, quelle sont les valeurs associées à safe_mode et safe_mode_exec_dir ?

Sinon, juste pour info, voici le script que j'ai écrit et que j'utilise pour mes galeries (fonctionnement récursif pour les galeries à plusieurs niveaux) :

Code:

#!/bin/bash

# Répertoire de base de la galerie
BASE_REP="/home/e-smith/files/ibays/galerie/galerie"
# Nom des répertoires contenant les images grand format
HIGH_REP="pwg_high"
# Nom des répertoires contenant les vignettes
TN_REP="thumbnail"
# Préfixe des fichiers vignettes
TN_PRE="tn-"
# Dimension des vignettes
TN_SZ=150
# Dimension des images à afficher
IMG_SZ=800
# Qualité des images
QUAL=80

mk_thumb()
{
  for i in `ls -Aw1 $1`
  do
# Ignorer les répertoires des images grand format et des vignettes
    if [ -d $1/$i -a "$i" != "$HIGH_REP" -a "$i" != "$TN_REP" ]
    then
# Recherche des fichiers JPEG
      find $1/$i -type f -maxdepth 1 \( -iname *.jpg -o -iname *.jpeg \) -printf "%f\n" | while read IMG_FILE
      do
        echo -n "Traitement de $i/$IMG_FILE..."
# Renommage du fichier en minuscules et modification des caractères spéciaux
        IMG_FILE_LOWER=$(echo $IMG_FILE | tr '[:upper:] àçéèêëîïôöùüÂÇÉÈÊËÎ??ÔÖÙÜ' '[:lower:]_aceeeeiioouuACEEEEIIOOUU')
        if [ $IMG_FILE != $IMG_FILE_LOWER ]
        then
          mv $1/$i/$IMG_FILE $1/$i/$IMG_FILE_LOWER && echo -n " LOWER..."
          IMG_FILE=$IMG_FILE_LOWER
        fi
# Suppression de l'EXIF thumbnail pour gain de place et temps de téléchargement
        jhead -dt $1/$i/$IMG_FILE > /dev/null && echo -n " EXIF..."
# Correction de la date dans l'EXIF pour les images post-traitées par des logiciels gorets
        IMG_DATE=$(jhead -v $1/$i/$IMG_FILE | grep "DateTime " | cut -b 17-35 | tr "\- T" ":-")
        IMG_ORIG=$(jhead -v $1/$i/$IMG_FILE | grep "DateTimeOriginal " | cut -b 29-47 | tr "\- T" ":-")
        if [ "$IMG_ORIG" != "" -a "$IMG_DATE" != "$IMG_ORIG" ]
        then
          jhead -ts$IMG_ORIG $1/$i/$IMG_FILE > /dev/null && echo -n " DATE..."
        fi
# Vérification de la taille de l'image (suppérieur au format affiché ?)
        if [ $(identify -format "%w" $1/$i/$IMG_FILE) -gt $IMG_SZ -o $(identify -format "%h" $1/$i/$IMG_FILE) -gt $IMG_SZ ]
  then
# Création du répertoire des images grand format
          [ ! -e $1/$i/$HIGH_REP ] && mkdir $1/$i/$HIGH_REP
# Déplacement du fichier dans le répertoire des images grand format
          if [ ! -e $1/$i/$HIGH_REP/$IMG_FILE ]
          then
            mv $1/$i/$IMG_FILE $1/$i/$HIGH_REP && echo -n " HIGH..."
          fi
# Redimensionnement de l'image à afficher
          convert -antialias -geometry $IMG_SZ\x$IMG_SZ\> -quality $QUAL $1/$i/$HIGH_REP/$IMG_FILE $1/$i/$IMG_FILE && echo -n " SIZE..."
        fi
# Création du répertoire des vignettes
        [ ! -e $1/$i/$TN_REP ] && mkdir $1/$i/$TN_REP
# Création de la vignette
        TN_FILE=$1/$i/$TN_REP/$TN_PRE$IMG_FILE
        if [ ! -e $TN_FILE ]
        then
          convert -antialias -thumbnail $TN_SZ\x$TN_SZ\> -quality $QUAL $1/$i/$IMG_FILE $TN_FILE && echo -n " THUMB..."
        fi
      echo
      done
# On recommence avec le répertoire suivant
      mk_thumb "$1/$i"
    fi
  done
}

echo ""
echo "********************************************************"
echo "* Traitement des images                                *"
echo "********************************************************"
IFS=$'\t\n'
mk_thumb $BASE_REP

echo ""
echo "********************************************************"
echo "* Mise à jour des photos sur le site distant           *"
echo "********************************************************"
/usr/bin/lftp -c "open -u FAI_USERNAME,FAI_PASSWORD ftp://ftpperso.free.fr ; mirror -R -e -vvv $BASE_REP /galerie/"

Attention : ligne 30, après le caractère Î, il y a un I tréma (??) qui n'apparait pas sous IE et qui apparaît bizarement sous Firefox. Pensez à faire la correction vous-même.

Ce script nécéssite les programmes suivants :
*) ImageMagick (traitement des images)
*) XFree86-libs (pour satisfaire les dépendances d'ImageMagick)
*) libtiff (pour satisfaire les dépendances d'ImageMagick)
*) jhead (pour le traitement des EXIF)
*) lftp (pour la mise à jour du site distant)

J'utilise un autre script (également récursif) pour mettre à jour les droits sur mon arborescence.
A ce sujet, attention aux droits 0777, généralement inutiles : 0775 ou même 0755 convient dans la plupart des cas.

Dernière modification par Grand-Pa (2005-04-05 03:58:37)

Hors ligne

#3 2005-03-31 17:12:22

torode
honoris causa
Paris
2003-07-31
86

Re: Problème de création de vignettes

Grand-Pa a écrit:

Question idiote : le script est bien en chmod 775 (exécutable par others) ?

Les droits du script sont 755.

Grand-Pa a écrit:

Le script est-il situé dans le répertoire de PWG ?

Non, il est dans /usr/local/bin/ pour être utilisable partout en ligne de commande sans préciser le chemin. J'ai essayé de le copier dans le répertoire de PWG et de le lancer avec exec ('./maj $dirname') sans succès.

Grand-Pa a écrit:

Dans php.ini, quelle sont les valeurs associées à safe_mode et safe_mode_exec_dir ?

Le safe_mode est off :

Code:

; Safe Mode
;
safe_mode = Off

; By default, Safe Mode does a UID compare check when
; opening files. If you want to relax this to a GID compare,
; then turn on safe_mode_gid.
safe_mode_gid = Off

; When safe_mode is on, UID/GID checks are bypassed when
; including files from this directory and its subdirectories.
; (directory must also be in include_path or full path must
; be used when including)
safe_mode_include_dir =

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
safe_mode_exec_dir =

Grand-Pa a écrit:

A ce sujet, attention aux droits 0777, généralement inutiles : 0775 ou même 0755 convient dans la plupart des cas.

Il faut que les droits du dossier soient 777 pour qu'Apache puisse créer les dossiers pwg_high et thumbnail et exécuter convert. Le problème vient de là!
Dans admin/update.php j'ai fait plusieurs tests :

Code:

exec('/usr/local/bin/maj /var/www/html/photos/galleries/toto');

Sans les droits 777 le script n'est pas exécuté => Apache n'a pas l'autorisation de faire un chmod et chown au début de mon script shell, il faut donc que je programme un cron pour parcourir les dossiers et en changer les droits.

Code:

$pathphoto = str_replace( './', '/var/www/html/photos/', $dirname );
echo "<h1>dirname : $dirname<br>pathphoto : $pathphoto<br><br></h1>";

Résultat :
dirname : ./galleries/toto
pathphoto : /var/www/html/photos/galleries/toto

Code:

$pathphoto = str_replace( './', '/var/www/html/photos/', $dirname );
exec('/usr/local/bin/maj $pathphoto');

Résultat d'un ps afx sur le serveur :

Code:

17932 ?        Ss     0:00 /usr/sbin/httpd
17935 ?        S      0:00  \_ /usr/sbin/httpd
19483 ?        S      0:00  |   \_ /bin/bash /usr/local/bin/maj
19615 ?        R      0:00  |       \_ convert -resize 128x128 /random.php /thumbnail/random.php

Je ne comprends pas pourquoi convert s'attaque aux fichiers .php à la racine du site au lieu de traiter les fichiers de /var/www/html/photos/galleries/toto . Cela dépasse mon niveau de compétences!

Je crois que je vais essayer ton script!
Merci pour ton aide.

Dernière modification par torode (2005-04-05 09:39:35)

Hors ligne

#4 2005-04-01 18:16:29

torode
honoris causa
Paris
2003-07-31
86

Re: Problème de création de vignettes

J'ai adapté le code de Rych à la version 1.4 si cela intéresse quelqu'un. Je l'ai placé à la ligne 350 de la page /admin/update.php .
Conditions nécessaires :
- ImageMagick installé,
- régler le mode du dossier et des fichiers à 777 manuellement avec un client ftp ou par un cron,
- faire deux synchronisations, une qui créera les thumbnails et plein écrans, l'autre qui mettra à jour la base de données,
J'essaierai de trouver un moyen plus propre de le faire plus tard, à moins que Pierrick ne m'indique avant à quel endroit insérer le code pour n'effectuer qu'une mise à jour.

Code:

$thdir = $dirname.'/thumbnail/';
  $hidir = $dirname.'/pwg_high/';
  $oldumask = umask(0);
  @mkdir("$thdir", 0777);
  @mkdir("$hidir", 0777);
  umask($oldumask);
  $filenamelow = strtolower($filename);
  $dirfilename = $dirname.'/'.$filename;
  $dirfilenamelow = $dirname.'/'.$filenamelow;
  rename ("$dirfilename", "$dirfilenamelow");
  $hidir_filenamelow = $hidir.$filenamelow;
  $thdir_filenamelow = $thdir.$filenamelow;
  rename ("$dirfilenamelow", "$hidir_filenamelow");
  $converthi = "convert $hidir_filenamelow -resize 600x600 $dirfilenamelow";
  $convertth = "convert $dirfilenamelow -resize 128x128 $thdir_filenamelow";
  passthru( $converthi );
  passthru( $convertth );

Hors ligne

#5 2005-04-05 03:49:16

Grand-Pa
Membre
Grenoble - France
2005-01-15
17

Re: Problème de création de vignettes

Suite à une demande, j'ai fait une petite modification dans mon script pour remplacer les espaces des noms de fichiers par des underscores.
Si certains utilisaient la précédente version, voici les lignes modifiées :

Code:

20: for i in `ls -Aw1 $1`
30: IMG_FILE_LOWER=$(echo $IMG_FILE | tr '[:upper:] àçéèêëîïôöùüÂÇÉÈÊËÎ??ÔÖÙÜ' '[:lower:]_aceeeeiioouuACEEEEIIOOUU')
78: IFS=$'\t\n'

Et pour ceux qui voudraient conserver les majuscules dans les noms de fichiers, il suffit de supprimer [:upper:] et [:lower:] en ligne 30.

P.S. : ligne 30, après le caractère Î, il y a un I tréma (??) qui n'apparait pas sous IE et qui apparaît bizarement sous Firefox. Pensez à faire la correction vous-même.

Dernière modification par Grand-Pa (2005-04-05 03:54:39)

Hors ligne

  •  » Utilisation
  •  » Problème de création de vignettes

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact