Rev 609 | Blame | Compare with Previous | 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 foisif (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 ratiofunction 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 utiliseif ($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, refuserif (!$force AND !eregi(",$format,", ",$formats_graphiques,"))return;// normalement il a ete creeif ($destdir) {$destdir = creer_repertoire(_DIR_IMG, $destdir);}$destination = _DIR_IMG . $destdir . $destfile;# spip_log("$dir $destination");// chercher un cacheforeach (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 tailleif ($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 retournerif ($srcWidthAND $srcWidth <= $maxWidth AND $srcHeight <= $maxHeight) {$vignette = $destination.'.'.preg_replace(',^.*\.,', '', $image);@copy($image, $vignette);}// imagemagick en ligne de commandeelse 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 gd2else if ($process == 'gd1' OR $process == 'gd2') {// Recuperer l'image d'origineif ($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 destinationif ($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'imagereturn $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 fichierif (eregi("src='([^']+)'", $img, $regs)) $logo = $regs[1];if (!$logo) $logo = $img;if (!$srcWidthAND $srcsize = @getimagesize($logo))$srcWidth = $srcsize[0];if (!$srcHeightAND $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 maxiif ($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 compteelseif ($taille > 0 AND $taille_y == 0)$taille_y = 100000; # {300,0} -> c'est 300 qui compteelse if ($taille == 0 AND $taille_y == 0)return '';// recuperer le nom du fichierif ($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 echantif ($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 CSSif ($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 clairif ($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 />";}}}}?>