X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Faction%2Ftourner.php;fp=www%2Fecrire%2Faction%2Ftourner.php;h=c067a0b17113c28636991b3d60a23f374a93ff53;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/ecrire/action/tourner.php b/www/ecrire/action/tourner.php new file mode 100644 index 0000000..c067a0b --- /dev/null +++ b/www/ecrire/action/tourner.php @@ -0,0 +1,232 @@ + 0) { + $dest = preg_replace(',\.[^.]+$,', '-r'.$var_rot.'$0', $src); + spip_log("rotation $var_rot $src : $dest"); + + $process = $GLOBALS['meta']['image_process']; + + // imagick (php4-imagemagick) + if ($process == 'imagick') { + $handle = imagick_readimage($src); + imagick_rotate($handle, $var_rot); + imagick_write($handle, $dest); + if (!@file_exists($dest)) return; // echec imagick + } + else if ($process == "gd2") { // theoriquement compatible gd1, mais trop forte degradation d'image + gdRotate ($src, $dest, $var_rot); + } + else if ($process == "convert") { + if (_CONVERT_COMMAND!='') { + define ('_CONVERT_COMMAND', 'convert'); + define ('_ROTATE_COMMAND', _CONVERT_COMMAND.' -rotate %t %src %dest'); + } else + define ('_ROTATE_COMMAND', ''); + if (_ROTATE_COMMAND!=='') { + $commande = str_replace( + array('%t', '%src', '%dest'), + array( + $var_rot, + escapeshellcmd($src), + escapeshellcmd($dest) + ), + _ROTATE_COMMAND); + spip_log($commande); + exec($commande); + } else + $dest = $src; + } + } + else + $dest = $src; + + $size_image = @getimagesize($dest); + $largeur = $size_image[0]; + $hauteur = $size_image[1]; + + // succes ! + if ($largeur>0 AND $hauteur>0) { + sql_updateq('spip_documents', array('fichier' => set_spip_doc($dest), 'largeur'=>$largeur, 'hauteur'=>$hauteur), "id_document=$arg"); + if ($effacer) { + spip_log("j'efface $effacer"); + spip_unlink($effacer); + } + // pipeline pour les plugins + pipeline('post_edition', + array( + 'args' => array( + 'table' => 'spip_documents', + 'table_objet' => 'documents', + 'spip_table_objet' => 'spip_documents', + 'type' =>'document', + 'id_objet' => $arg, + 'champs' => array('rotation'=>$r[2],'orientation'=>$var_rot,'fichier'=>$row), + 'serveur' => $serveur, + 'action'=>'tourner', + ), + 'data' => array('fichier'=>$row) + ) + ); + } + +} + + +///////////////////////////////////////////////////////////////////// +// +// Faire tourner une image +// +// http://doc.spip.org/@gdRotate +function gdRotate ($src, $dest, $rtt){ + $src_img = ''; + if(preg_match("/\.(png|gif|jpe?g|bmp)$/i", $src, $regs)) { + switch($regs[1]) { + case 'png': + if (function_exists('ImageCreateFromPNG')) { + $src_img=ImageCreateFromPNG($src); + $save = 'imagepng'; + } + break; + case 'gif': + if (function_exists('ImageCreateFromGIF')) { + $src_img=ImageCreateFromGIF($src); + $save = 'imagegif'; + } + break; + case 'jpeg': + case 'jpg': + if (function_exists('ImageCreateFromJPEG')) { + $src_img=ImageCreateFromJPEG($src); + $save = 'Imagejpeg'; + } + break; + case 'bmp': + if (function_exists('ImageCreateFromWBMP')) { + $src_img=@ImageCreateFromWBMP($src); + $save = 'imagewbmp'; + } + break; + } + } + + if (!$src_img) { + spip_log("gdrotate: image non lue, $src"); + return false; + } + + $size=@getimagesize($src); + if (!($size[0] * $size[1])) return false; + + if (function_exists('imagerotate')) { + $dst_img = imagerotate($src_img, -$rtt, 0); + } else { + + // Creer l'image destination (hauteur x largeur) et la parcourir + // pixel par pixel (un truc de fou) + if ($rtt == 180) + $size_dest = $size; + else + $size_dest = array($size[1],$size[0]); + + if ($GLOBALS['meta']['image_process'] == "gd2") + $dst_img=ImageCreateTrueColor($size_dest[0],$size_dest[1]); + else + $dst_img=ImageCreate($size_dest[0],$size_dest[1]); + + // t=top; b=bottom; r=right; l=left + for ($t=0;$t<=$size_dest[0]-1; $t++) { + $b = $size_dest[0] -1 - $t; + for ($l=0;$l<=$size_dest[1]-1; $l++) { + $r = $size_dest[1] -1 - $l; + switch ($rtt) { + case 90: + imagecopy($dst_img,$src_img,$t,$r,$r,$b,1,1); + break; + case 270: + imagecopy($dst_img,$src_img,$t,$l,$r,$t,1,1); + break; + case 180: + imagecopy($dst_img,$src_img,$t,$l,$b,$r,1,1); + break; + } + } + } + } + ImageDestroy($src_img); + ImageInterlace($dst_img,0); + + // obligatoire d'enregistrer dans le meme format, puisqu'on change le doc + // mais pas son extension + $save($dst_img,$dest); +} + +// Appliquer l'EXIF orientation +// cf. http://trac.rezo.net/trac/spip/ticket/1494 +// http://doc.spip.org/@tourner_selon_exif_orientation +function tourner_selon_exif_orientation($id_document, $fichier) { + + if (function_exists('exif_read_data') + AND $exif = exif_read_data($fichier) + AND ( + $ort = $exif['IFD0']['Orientation'] + OR $ort = $exif['Orientation']) + ) { + spip_log("rotation: $ort"); + $rot = null; + switch ($ort) { + case 3: + $rot = 180; + case 6: + $rot = 90; + case 8: + $rot = -90; + } + if ($rot) + action_tourner_post(array(null,$id_document, $rot)); + } +} + +?>