tourner.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined("_ECRIRE_INC_VERSION")) return;
  12. /**
  13. * Tourner un document
  14. *
  15. * http://code.spip.net/@action_tourner_dist
  16. *
  17. * lorsque les arguments sont passes dans arg en GET :
  18. * id_document-angle
  19. *
  20. * @param int $id_document
  21. * @param int $angle
  22. * angle de rotation en degre>0
  23. * @return void
  24. */
  25. function action_tourner_dist($id_document=null, $angle=null) {
  26. if (is_null($id_document) OR is_null($angle)){
  27. $securiser_action = charger_fonction('securiser_action', 'inc');
  28. $arg = $securiser_action();
  29. if (!preg_match(",^\W*(\d+)\W?(-?\d+)$,", $arg, $r)) {
  30. spip_log("action_tourner_dist $arg pas compris");
  31. }
  32. else{
  33. array_shift($r);
  34. list($id_document,$angle) = $r;
  35. }
  36. }
  37. if ($id_document AND autoriser('modifier','document',$id_document))
  38. action_tourner_post($id_document,$angle);
  39. }
  40. /**
  41. * Tourner un document
  42. *
  43. * http://code.spip.net/@action_tourner_post
  44. *
  45. * @param int $id_document
  46. * @param int $angle
  47. * angle de rotation en degre>0
  48. * @return
  49. */
  50. function action_tourner_post($id_document,$angle)
  51. {
  52. $row = sql_fetsel("fichier,extension", "spip_documents", "id_document=".intval($id_document));
  53. if (!$row) return;
  54. include_spip('inc/charsets'); # pour le nom de fichier
  55. include_spip('inc/documents');
  56. // Fichier destination : on essaie toujours de repartir de l'original
  57. $var_rot = $angle;
  58. include_spip('inc/distant'); # pour copie_locale
  59. $src = _DIR_RACINE . copie_locale(get_spip_doc($row['fichier']));
  60. if (preg_match(',^(.*)-r(90|180|270)\.([^.]+)$,', $src, $match)) {
  61. $effacer = $src;
  62. $src = $match[1].'.'.$match[3];
  63. $var_rot += intval($match[2]);
  64. }
  65. $var_rot = ((360 + $var_rot) % 360); // 0, 90, 180 ou 270
  66. if ($var_rot > 0) {
  67. $dest = preg_replace(',\.[^.]+$,', '-r'.$var_rot.'$0', $src);
  68. spip_log("rotation $var_rot $src : $dest");
  69. include_spip('inc/filtres');
  70. include_spip('public/parametrer'); // charger les fichiers fonctions #bugfix spip 2.1.0
  71. $res = filtrer('image_rotation',$src,$var_rot);
  72. $res = filtrer('image_format',$res,$row['extension']);
  73. list($hauteur,$largeur) = taille_image($res);
  74. $res = extraire_attribut($res,'src');
  75. include_spip('inc/getdocument');
  76. deplacer_fichier_upload($res,$dest);
  77. }
  78. else {
  79. $dest = $src;
  80. $size_image = @getimagesize($dest);
  81. $largeur = $size_image[0];
  82. $hauteur = $size_image[1];
  83. }
  84. // succes !
  85. if ($largeur>0 AND $hauteur>0) {
  86. $set = array(
  87. 'fichier' => set_spip_doc($dest),
  88. 'largeur'=>$largeur, 'hauteur'=>$hauteur,
  89. 'distant'=>'non' // le document n'est plus distant apres une transformation
  90. );
  91. if ($taille = @filesize($dest))
  92. $set['taille'] = $taille;
  93. sql_updateq('spip_documents', $set, "id_document=".intval($id_document));
  94. if ($effacer) {
  95. spip_log("rotation : j'efface $effacer");
  96. spip_unlink($effacer);
  97. }
  98. // pipeline pour les plugins
  99. pipeline('post_edition',
  100. array(
  101. 'args' => array(
  102. 'table' => 'spip_documents',
  103. 'table_objet' => 'documents',
  104. 'spip_table_objet' => 'spip_documents',
  105. 'type' =>'document',
  106. 'id_objet' => $id_document,
  107. 'champs' => array('rotation'=>$angle,'orientation'=>$var_rot,'fichier'=>$row['fichier']),
  108. 'serveur' => $serveur,
  109. 'action'=>'tourner',
  110. ),
  111. 'data' => $set
  112. )
  113. );
  114. }
  115. }
  116. // Appliquer l'EXIF orientation
  117. // cf. http://trac.rezo.net/trac/spip/ticket/1494
  118. // http://code.spip.net/@tourner_selon_exif_orientation
  119. function tourner_selon_exif_orientation($id_document, $fichier) {
  120. if (function_exists('exif_read_data')
  121. AND $exif = exif_read_data($fichier)
  122. AND (
  123. $ort = $exif['IFD0']['Orientation']
  124. OR $ort = $exif['Orientation'])
  125. ) {
  126. spip_log("rotation: $ort");
  127. $rot = null;
  128. switch ($ort) {
  129. case 3:
  130. $rot = 180;
  131. case 6:
  132. $rot = 90;
  133. case 8:
  134. $rot = -90;
  135. }
  136. if ($rot)
  137. action_tourner_post(array(null,$id_document, $rot));
  138. }
  139. }
  140. ?>