squellete2
[aidenligne_francais_universite.git] / ecrire / action / tourner.php
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 ?>