Commit | Line | Data |
---|---|---|
c495c100 P |
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 | ?> |