[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/action/ -> tourner.php (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2007                                                *
   7   *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
   8   *                                                                         *
   9   *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  10   *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
  11  \***************************************************************************/
  12  
  13  if (!defined("_ECRIRE_INC_VERSION")) return;
  14  
  15  include_spip('inc/charsets');    # pour le nom de fichier
  16  include_spip('base/abstract_sql');
  17  
  18  // http://doc.spip.org/@action_tourner_dist
  19  function action_tourner_dist() {
  20      include_spip('inc/distant'); # pour copie_locale
  21  
  22      $securiser_action = charger_fonction('securiser_action', 'inc');
  23      $arg = $securiser_action();
  24  
  25      if (!preg_match(",^\W*(\d+)\W?(-?\d+)$,", $arg, $r)) {
  26          spip_log("action_tourner_dist $arg pas compris");
  27      } else  action_tourner_post($r);
  28  }
  29  
  30  // http://doc.spip.org/@action_tourner_post
  31  function action_tourner_post($r)
  32  {
  33      $arg = $r[1];
  34      $result = spip_query("SELECT fichier FROM spip_documents WHERE id_document=$arg");
  35  
  36      if (!$row = spip_fetch_array($result))
  37          return;
  38  
  39      // Fichier destination : on essaie toujours de repartir de l'original
  40      $var_rot = $r[2];
  41      $src = copie_locale($row['fichier']);
  42      if (preg_match(',^(.*)-r(90|180|270)\.([^.]+)$,', $src, $match)) {
  43          $effacer = $src;
  44          $src = $match[1].'.'.$match[3];
  45          $var_rot += intval($match[2]);
  46      }
  47      $var_rot = ((360 + $var_rot) % 360); // 0, 90, 180 ou 270
  48  
  49      if ($var_rot > 0) {
  50          $dest = preg_replace(',\.[^.]+$,', '-r'.$var_rot.'$0', $src);
  51          spip_log("rotation $var_rot $src : $dest");
  52  
  53          $process = $GLOBALS['meta']['image_process'];
  54  
  55          // imagick (php4-imagemagick)
  56          if ($process == 'imagick') {
  57              $handle = imagick_readimage($src);
  58              imagick_rotate($handle, $var_rot);
  59              imagick_write($handle, $dest);
  60              if (!@file_exists($dest)) return;    // echec imagick
  61          }
  62          else if ($process == "gd2") { // theoriquement compatible gd1, mais trop forte degradation d'image
  63              gdRotate ($src, $dest, $var_rot);
  64          }
  65          else if ($process = "convert") {
  66              if (_CONVERT_COMMAND!='') {
  67                  define ('_CONVERT_COMMAND', 'convert');
  68                  define ('_ROTATE_COMMAND', _CONVERT_COMMAND.' -rotate %t %src %dest');
  69              } else
  70                  define ('_ROTATE_COMMAND', '');
  71              if (_ROTATE_COMMAND!=='') {
  72                  $commande = str_replace(
  73                      array('%t', '%src', '%dest'),
  74                      array(
  75                          $var_rot,
  76                          escapeshellcmd($src),
  77                          escapeshellcmd($dest)
  78                      ),
  79                      _ROTATE_COMMAND);
  80                  spip_log($commande);
  81                  exec($commande);
  82              } else
  83                  $dest = $src;
  84          }
  85      }
  86      else
  87          $dest = $src;
  88  
  89      $size_image = @getimagesize($dest);
  90      $largeur = $size_image[0];
  91      $hauteur = $size_image[1];
  92  
  93      // succes !
  94      if ($largeur>0 AND $hauteur>0) {
  95          spip_query("UPDATE spip_documents SET fichier='".addslashes($dest)."', largeur=$largeur, hauteur=$hauteur WHERE id_document=$arg");
  96          if ($effacer) {
  97              spip_log("j'efface $effacer");
  98              @unlink($effacer);
  99          }
 100      }
 101  
 102  }
 103  
 104  
 105  /////////////////////////////////////////////////////////////////////
 106  //
 107  // Faire tourner une image
 108  //
 109  // http://doc.spip.org/@gdRotate
 110  function gdRotate ($src, $dest, $rtt){
 111      $src_img = '';
 112      if(preg_match("/\.(png|gif|jpe?g|bmp)$/i", $src, $regs)) {
 113          switch($regs[1]) {
 114              case 'png':
 115                if (function_exists('ImageCreateFromPNG')) {
 116                  $src_img=ImageCreateFromPNG($src);
 117                  $save = 'imagepng';
 118                }
 119                break;
 120              case 'gif':
 121                if (function_exists('ImageCreateFromGIF')) {
 122                  $src_img=ImageCreateFromGIF($src);
 123                  $save = 'imagegif';
 124                }
 125                break;
 126              case 'jpeg':
 127              case 'jpg':
 128                if (function_exists('ImageCreateFromJPEG')) {
 129                  $src_img=ImageCreateFromJPEG($src);
 130                  $save = 'Imagejpeg';
 131                }
 132                break;
 133              case 'bmp':
 134                if (function_exists('ImageCreateFromWBMP')) {
 135                  $src_img=@ImageCreateFromWBMP($src);
 136                  $save = 'imagewbmp';
 137                }
 138                break;
 139          }
 140      }
 141  
 142      if (!$src_img) {
 143          spip_log("gdrotate: image non lue, $src");
 144          return false;
 145      }
 146  
 147      $size=@getimagesize($src);
 148      if (!($size[0] * $size[1])) return false;
 149  
 150      if (function_exists('imagerotate')) {
 151          $dst_img = imagerotate($src_img, -$rtt, 0);
 152      } else {
 153  
 154          // Creer l'image destination (hauteur x largeur) et la parcourir
 155          // pixel par pixel (un truc de fou)
 156          if ($rtt == 180)
 157              $size_dest = $size;
 158          else
 159              $size_dest = array($size[1],$size[0]);
 160          
 161          if ($GLOBALS['meta']['image_process'] == "gd2")
 162              $dst_img=ImageCreateTrueColor($size_dest[0],$size_dest[1]);
 163          else
 164              $dst_img=ImageCreate($size_dest[0],$size_dest[1]);
 165  
 166          // t=top; b=bottom; r=right; l=left
 167          for ($t=0;$t<=$size_dest[0]-1; $t++) {
 168              $b = $size_dest[0] -1 - $t;
 169              for ($l=0;$l<=$size_dest[1]-1; $l++) {
 170                  $r = $size_dest[1] -1 - $l;
 171                  switch ($rtt) {
 172                      case 90:
 173                          imagecopy($dst_img,$src_img,$t,$r,$r,$b,1,1);
 174                          break;
 175                      case 270:
 176                          imagecopy($dst_img,$src_img,$t,$l,$r,$t,1,1);
 177                          break;
 178                      case 180:
 179                          imagecopy($dst_img,$src_img,$t,$l,$b,$r,1,1);
 180                          break;
 181                  }
 182              }
 183          }
 184      }
 185      ImageDestroy($src_img);
 186      ImageInterlace($dst_img,0);
 187  
 188      // obligatoire d'enregistrer dans le meme format, puisqu'on change le doc
 189      // mais pas son id_type
 190      $save($dst_img,$dest);
 191  }
 192  
 193  ?>


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics