Subversion Repositories Sites.tela-botanica.org

Rev

Rev 7 | Blame | Last modification | View Log | RSS feed

<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2005                                                *
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/


//
// Ce fichier ne sera execute qu'une fois
if (defined("_ECRIRE_INC_LOGOS")) return;
define("_ECRIRE_INC_LOGOS", "1");


function cherche_image_nommee($nom, $formats = array ('gif', 'jpg', 'png')) {
        // _DIR_IMG contient deja le ../ dans ecrire (PREFIX1
        //      if (ereg("^../",$nom))  $nom = substr($nom,3);
        if (ereg("^" . _DIR_IMG, $nom)) {
                $nom = substr($nom,strlen(_DIR_IMG));
        }
        $pos = strrpos($nom, "/");
        if ($pos > 0) {
                $chemin = substr($nom, 0, $pos+1);
                $nom = substr($nom, $pos+1);
        } else {
                $chemin = "";
        }

        reset($formats);
        while (list(, $format) = each($formats)) {
                $d = _DIR_IMG . "$chemin$nom.$format";
                if (@file_exists($d)){ 
                        return array(_DIR_IMG."$chemin", $nom, $format);
                }
        }
}



function decrire_logo($racine) {
        global $connect_id_auteur;
                
        if ($img = cherche_image_nommee($racine)) {
                list($dir, $racine, $fmt) = $img;
                $fid = $dir . "$racine.".$fmt; 
                if ($taille = @getimagesize($fid))
                        $xy = _T('info_largeur_vignette', array('largeur_vignette' => $taille[0], 'hauteur_vignette' => $taille[1]));

                return array("$racine.$fmt", $xy);
        }
        return '';
}


function afficher_boite_logo($type, $id_objet, $id, $texteon, $texteoff) {
        global $options, $spip_display;

        $logon = $type.'on'.$id;
        $logoff = $type.'off'.$id;

        if ($spip_display != 4) {
        
                echo "<p>";
                debut_cadre_relief("image-24.gif");
                echo "<div class='verdana1' style='text-align: center;'>";
                $desc = decrire_logo($logon);
                afficher_logo($logon, $texteon, $desc, $id_objet, $id);

                if ($desc AND $texteoff) {
                        echo "<br /><br />";
                        $desc = decrire_logo($logoff);
                        afficher_logo($logoff, $texteoff, $desc, $id_objet, $id);
                }
        
                echo "</div>";
                fin_cadre_relief();
                echo "</p>";
        }
}


function afficher_logo($racine, $titre, $logo, $id_objet, $id) {
        global $connect_id_auteur;
        global $couleur_foncee, $couleur_claire;
        global $clean_link;

        include_ecrire('inc_admin.php3');
 
        $redirect = $clean_link->getUrl();

        echo "<b>";
        echo bouton_block_invisible(md5($titre));
        echo $titre;
        echo "</b>";
        echo "<font size=1>";

        if ($logo) {
                list ($fichier, $taille) =  $logo;
                $hash = calculer_action_auteur("supp_logo $fichier");

                echo "<p><center><div><a href='"._DIR_IMG.$fichier."'>";
                echo reduire_image_logo(_DIR_IMG.$fichier, 170);
                echo "</a></div>";
                echo debut_block_invisible(md5($titre));
                echo $taille;
                echo "\n<br />[<a href='../spip_image.php3?";
                echo "$id_objet=$id&";
                echo "image_supp=$fichier&hash_id_auteur=$connect_id_auteur&hash=$hash&redirect=".urlencode($redirect)."'>"._T('lien_supprimer')."</A>]";
                echo fin_block();
                echo "</center></p>";
        }
        else {
                $hash = calculer_action_auteur("ajout_logo $racine");
                echo debut_block_invisible(md5($titre));

                echo "\n\n<FORM ACTION='../spip_image.php3' METHOD='POST'
                        ENCTYPE='multipart/form-data'>";
                echo "\n<INPUT NAME='redirect' TYPE=Hidden VALUE='$redirect'>";
                echo "\n<INPUT NAME='$id_objet' TYPE=Hidden VALUE='$id'>";
                echo "\n<INPUT NAME='hash_id_auteur' TYPE=Hidden VALUE='$connect_id_auteur'>";
                echo "\n<INPUT NAME='hash' TYPE=Hidden VALUE='$hash'>";
                echo "\n<INPUT NAME='ajout_logo' TYPE=Hidden VALUE='oui'>";
                echo "\n<INPUT NAME='logo' TYPE=Hidden VALUE='$racine'>";
                if (tester_upload()){
                        echo "\n"._T('info_telecharger_nouveau_logo')."<BR>";
                        echo "\n<INPUT NAME='image' TYPE=File CLASS='forml' style='font-size:9px;' SIZE=15>";
                        echo "\n <div align='right'><INPUT NAME='ok' TYPE=Submit VALUE='"._T('bouton_telecharger')."' CLASS='fondo' style='font-size:9px;'></div>";
                } else {

                        $myDir = opendir(_DIR_TRANSFERT);
                        while($entryName = readdir($myDir)){
                                if (!ereg("^\.",$entryName) AND eregi("(gif|jpg|png)$",$entryName)){
                                        $entryName = addslashes($entryName);
                                        $afficher .= "\n<OPTION VALUE='" .
                                                _DIR_TRANSFERT .
                                                "$entryName'>$entryName";
                                }
                        }
                        closedir($myDir);

                        if (strlen($afficher) > 10){
                                echo "\n"._T('info_selectionner_fichier_2');
                                echo "\n<SELECT NAME='image' CLASS='forml' SIZE=1>";
                                echo $afficher;
                                echo "\n</SELECT>";
                                echo "\n  <INPUT NAME='ok' TYPE=Submit VALUE='"._T('bouton_choisir')."' CLASS='fondo'>";
                        } else {
                                echo _T('info_installer_images_dossier');
                        }

                }
                echo fin_block();
                echo "</FORM>\n";
        }

        echo "</font>";
}


//
// Creation automatique d'une vignette
//

// Calculer le ratio
function image_ratio ($srcWidth, $srcHeight, $maxWidth, $maxHeight) {
        $ratioWidth = $srcWidth/$maxWidth;
        $ratioHeight = $srcHeight/$maxHeight;

        if ($ratioWidth <=1 AND $ratioHeight <=1) {
                $destWidth = $srcWidth;
                $destHeight = $srcHeight;
        } else if ($ratioWidth < $ratioHeight) {
                $destWidth = $srcWidth/$ratioHeight;
                $destHeight = $maxHeight;
        }
        else {
                $destWidth = $maxWidth;
                $destHeight = $srcHeight/$ratioWidth;
        }
        return array (ceil($destWidth), ceil($destHeight),
                max($ratioWidth,$ratioHeight));
}

function creer_vignette($image, $maxWidth, $maxHeight, $format, $destdir, $destfile, $process='AUTO', $force=false, $test_cache_only = false) {
        global $convert_command, $pnmscale_command;
        // ordre de preference des formats graphiques pour creer les vignettes
        // le premier format disponible, selon la methode demandee, est utilise
        if ($format == 'png')
                $formats_sortie = array('png','jpg','gif');
        else
                $formats_sortie = array('jpg','png','gif');
                
        if ($process == 'AUTO')
                $process = lire_meta('image_process');

        // liste des formats qu'on sait lire
        $formats_graphiques = lire_meta('formats_graphiques');

        // si le doc n'est pas une image, refuser
        if (!$force AND !eregi(",$format,", ",$formats_graphiques,"))
                return;
        // normalement il a ete cree
        if ($destdir) {
          $destdir = creer_repertoire(_DIR_IMG, $destdir);
        } 
        $destination = _DIR_IMG . $destdir . $destfile;
#       spip_log("$dir $destination");
        // chercher un cache
        foreach (array('gif','jpg','png') as $fmt)
                if (@file_exists($destination.'.'.$fmt)) {
                        $vignette = $destination.'.'.$fmt;
                        if ($force) @unlink($vignette);
                }

        if ($test_cache_only AND !$vignette) return;

        // utiliser le cache ?
        if (!$test_cache_only)
        if ($force OR !$vignette OR (@filemtime($vignette) < @filemtime($image))) {

                $creation = true;
                // calculer la taille
                if ($srcsize = @getimagesize($image)) {
                        $srcWidth=$srcsize[0];
                        $srcHeight=$srcsize[1];
                        list ($destWidth,$destHeight) = image_ratio($srcWidth, $srcHeight, $maxWidth, $maxHeight);
                } else if ($process == 'convert' OR $process == 'imagick') {
                        $destWidth = $maxWidth;
                        $destHeight = $maxHeight;
                } else {
                        spip_log("echec $process sur $image");
                        return;
                }

                // Si l'image est de la taille demandee (ou plus petite), simplement
                // la retourner
                if ($srcWidth
                AND $srcWidth <= $maxWidth AND $srcHeight <= $maxHeight) {
                        $vignette = $destination.'.'.preg_replace(',^.*\.,', '', $image);
                        @copy($image, $vignette);
                }

                // imagemagick en ligne de commande
                else if ($process == 'convert') {
                        $format = $formats_sortie[0];
                        $vignette = $destination.".".$format;
                        $commande = "$convert_command -size ${destWidth}x${destHeight} ./$image -geometry ${destWidth}x${destHeight} +profile \"*\" ./".escapeshellcmd($vignette);
                        spip_log($commande);
                        exec($commande);
                        if (!@file_exists($vignette)) {
                                        spip_log("echec convert sur $vignette");
                                        return; // echec commande
                        }
                }
                else
                // imagick (php4-imagemagick)
                if ($process == 'imagick') {
                        $format = $formats_sortie[0];
                        $vignette = "$destination.".$format;
                        $handle = imagick_readimage($image);
                        imagick_resize($handle, $destWidth, $destHeight, IMAGICK_FILTER_LANCZOS, 0.75);
                        imagick_write($handle, $vignette);
                        if (!@file_exists($vignette)) {
                                spip_log("echec imagick sur $vignette");
                                return; 
                        }
                }
                else if ($process == "netpbm") {
                        $format_sortie = "jpg";
                        $vignette = $destination.".".$format_sortie;
                        $pnmtojpeg_command = ereg_replace("pnmscale", "pnmtojpeg", $pnmscale_command);
                        if ($format == "jpg") {
                                
                                $jpegtopnm_command = ereg_replace("pnmscale", "jpegtopnm", $pnmscale_command);

                                exec("$jpegtopnm_command $image | $pnmscale_command -width $destWidth | $pnmtojpeg_command > $vignette");
                                if (!@file_exists($vignette)) {
                                        spip_log("echec netpbm-jpg sur $vignette");
                                        return;
                                }
                        } else if ($format == "gif") {
                                $giftopnm_command = ereg_replace("pnmscale", "giftopnm", $pnmscale_command);
                                exec("$giftopnm_command $image | $pnmscale_command -width $destWidth | $pnmtojpeg_command > $vignette");
                                if (!@file_exists($vignette)) {
                                        spip_log("echec netpbm-gif sur $vignette");
                                        return;
                                }
                        } else if ($format == "png") {
                                $pngtopnm_command = ereg_replace("pnmscale", "pngtopnm", $pnmscale_command);
                                exec("$pngtopnm_command $image | $pnmscale_command -width $destWidth | $pnmtojpeg_command > $vignette");
                                if (!@file_exists($vignette)) {
                                        spip_log("echec netpbm-png sur $vignette");
                                        return;
                                }
                        }
                }
                // gd ou gd2
                else if ($process == 'gd1' OR $process == 'gd2') {

                        // Recuperer l'image d'origine
                        if ($format == "jpg") {
                                $srcImage = @ImageCreateFromJPEG($image);
                        }
                        else if ($format == "gif"){
                                $srcImage = @ImageCreateFromGIF($image);
                        }
                        else if ($format == "png"){
                                $srcImage = @ImageCreateFromPNG($image);
                        }
                        if (!$srcImage) {
                                spip_log("echec gd1/gd2");
                                return;
                        }
                        // Choisir le format destination
                        // - on sauve de preference en JPEG (meilleure compression)
                        // - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire
                        # bug : gd_formats contient la liste des fichiers qu'on sait *lire*,
                        # pas *ecrire*
                        $gd_formats = lire_meta("gd_formats");
                        foreach ($formats_sortie as $fmt) {
                                if (ereg($fmt, $gd_formats)) {
                                        if ($format <> "gif" OR $GLOBALS['flag_ImageGif'])
                                                $destFormat = $fmt;
                                        break;
                                }
                        }

                        if (!$destFormat) {
                                spip_log("pas de format pour $image");
                                return;
                        }

                        // Initialisation de l'image destination
                        if ($process == 'gd2' AND $destFormat != "gif")
                                $destImage = ImageCreateTrueColor($destWidth, $destHeight);
                        if (!$destImage)
                                $destImage = ImageCreate($destWidth, $destHeight);

                        // Recopie de l'image d'origine avec adaptation de la taille
                        $ok = false;
                        if (($process == 'gd2') AND function_exists('ImageCopyResampled'))
                                $ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
                        if (!$ok)
                                $ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);

                        // Sauvegarde de l'image destination
                        $vignette = "$destination.$destFormat";
                        $format = $destFormat;
                        if ($destFormat == "jpg")
                                ImageJPEG($destImage, $vignette, 70);
                        else if ($destFormat == "gif")
                                ImageGIF($destImage, $vignette);
                        else if ($destFormat == "png")
                                ImagePNG($destImage, $vignette);

                        ImageDestroy($srcImage);
                        ImageDestroy($destImage);
                }
        }

        $size = @getimagesize($vignette);
        $retour['width'] = $largeur = $size[0];
        $retour['height'] = $hauteur = $size[1];
        $retour['fichier'] = $vignette;
        $retour['format'] = $format;
        $retour['date'] = @filemtime($vignette);
        

        // renvoyer l'image
        return $retour;
}



//
// Retourner taille d'une image
// pour les filtres |largeur et |hauteur
//
function taille_image($img) {

        if (eregi("width *= *['\"]?( *[0-9]+ *)", $img, $regs))
                $srcWidth = intval(trim($regs[1]));
        if (eregi("height *= *['\"]?( *[0-9]+ *)", $img, $regs))
                $srcHeight = intval(trim($regs[1]));

        // recuperer le nom du fichier
        if (eregi("src='([^']+)'", $img, $regs)) $logo = $regs[1];
        if (!$logo) $logo = $img;

        if (!$srcWidth
        AND $srcsize = @getimagesize($logo))
                $srcWidth = $srcsize[0];

        if (!$srcHeight
        AND $srcsize = @getimagesize($logo))
                $srcHeight = $srcsize[1];

        return array($srcHeight, $srcWidth);
        
}




//
// Reduire la taille d'un logo
// [(#LOGO_ARTICLE||reduire_image{100,60})]
//

// Cette fonction accepte en entree un nom de fichier ou un tag <img ...>

function reduire_image_logo($img, $taille = -1, $taille_y = -1) {

        // Determiner la taille x,y maxi
        if ($taille == -1) {
                $taille = lire_meta('taille_preview');
                if (!$taille)
                        $taille = 150;
        }
        if ($taille_y == -1)
                $taille_y = $taille;

        if ($taille == 0 AND $taille_y > 0)
                $taille = 100000; # {0,300} -> c'est 300 qui compte
        else
        if ($taille > 0 AND $taille_y == 0)
                $taille_y = 100000; # {300,0} -> c'est 300 qui compte
        else if ($taille == 0 AND $taille_y == 0)
                return '';

        // recuperer le nom du fichier
        if ($src = extraire_attribut($img, 'src'))
                $logo = $src;
        else
                $logo = $img;
        if (!$logo) return '';

        // Si c'est une image distante, la recuperer (si possible)
        if (!$local = copie_locale($logo)) {
                spip_log("pas de version locale de $logo");
                return $img;
        }
        $logo = $local;


        $attributs = '';

        // preserver le name='...' et le mettre en alt le cas echant
        if ($name = extraire_attribut($img, 'name')) {
                $attributs .= ' name="'.entites_html($name).'"'; 
                $attributs_alt = ' alt="'.entites_html($name).'"'; 
        }
        if ($alt = extraire_attribut($img, 'alt'))
                $attributs_alt = ' alt="'.entites_html($alt).'"'; 

        $attributs .= $attributs_alt;

        // attributs deprecies. Transformer en CSS
        if ($espace = extraire_attribut($img, 'hspace'))
                $attributs .= " style='margin: $espace" . "px; border-width: 0px;'";
        else 
                $attributs .=  " style='border-width: 0px;' class='spip_logos'";
        // attribut deprecie mais equivalent CSS pas clair
        if ($align = extraire_attribut($img, 'align'))
                $attributs .= " align='$align'";

        if (eregi("(.*)\.(jpg|gif|png)$", $logo, $regs)) {
                if ($i = cherche_image_nommee($regs[1], array($regs[2]))) {
                        list(,$nom,$format) = $i;
                        if ($taille_origine = @getimagesize($logo)) {
                                list ($destWidth,$destHeight, $ratio) = image_ratio(
                                        $taille_origine[0], $taille_origine[1], $taille, $taille_y);

                                // Creer effectivement la vignette reduite
                                $suffixe = '-'.$destWidth.'x'.$destHeight;
                                $preview = creer_vignette($logo, $taille, $taille_y,
                                        $format, ('cache'.$suffixe), $nom.$suffixe);
                                if ($preview) {
                                        $logo = $preview['fichier'];
                                        $destWidth = $preview['width'];
                                        $destHeight = $preview['height'];
                                }

                                if (!_DIR_RESTREINT)
                                        $date = '?date='.filemtime($logo);
                                return "<img src='$logo$date' width='$destWidth' height='$destHeight'$attributs />";
                        }
                }
        }
}

?>