source: spip-zone/_plugins_/smush_images/trunk/inc/smush_image.php @ 83073

Last change on this file since 83073 was 83073, checked in by kent1@…, 6 years ago

Tout passe par inc/smush_image

Améliorations diverses

Version 0.4.0

File size: 3.4 KB
Line 
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3
4function inc_smush_image_dist($im){
5        if(!_IS_BOT){
6                if(defined(_SMUSH_API) && _SMUSH_API){
7                        $image = _image_valeurs_trans($im, "smush");
8                        $im = $image["fichier"];
9                        $dest = $image["fichier_dest"];
10                        $creer = $image["creer"];
11                        include_spip('inc/smush_php_compat');
12                        if(!file_exists($im))
13                                return $im;
14
15                        // L'adresse de l'API que l'on utilise
16                        $url_smush = 'http://www.smushit.com/ysmush.it/ws.php';
17
18                        // On ajoute les paramètres nécessaires pour l'API
19                        $url_smush_finale = parametre_url($url_smush,'img',url_absolue($im));
20                        spip_log("SMUSH : recuperation du contenu de $url_smush_finale","smush");
21
22                        $content = file_get_contents($url_smush_finale);
23                        $newcontent = json_decode($content, true);
24                        if(!$newcontent['error']){
25                                include_spip('inc/distant');
26                                $new_url = $newcontent['dest'];
27                                spip_log("SMUSH : recuperation du fichier $new_url","smush");
28                                $contenu = recuperer_page($new_url,false,false,_COPIE_LOCALE_MAX_SIZE);
29                                if ($contenu)
30                                        ecrire_fichier($im, $contenu);
31                        }else{
32                                spip_log('SMUSH en erreur','smush.'._LOG_ERREUR);
33                                spip_log($newcontent['error'],'smush.'._LOG_ERREUR);
34                        }
35                        return $im;
36                }else
37                        return image_smush($im);
38        }
39
40        return $im;
41}
42
43/**
44 * Fonction de réduction d'image
45 * Nécessite que la fonction exec() soit utilisable
46 * Nécessite certains binaires sur le serveur :
47 * -* identify : apt-get install imagemagick
48 * -* convert : apt-get install imagemagick
49 * -* pngnq : apt-get install pngnq
50 * -* pngoptim : apt-get install pngoptim
51 * -* jpegtran : apt-get install libjpeg-progs
52 * -* gifsicle : apt-get install gifsicle
53 *
54 * @param string $im
55 *              Le tag image (<img src...>) à réduire
56 * @return string
57 *              Le nouveau tag image
58 */
59function image_smush($im) {
60        $fonction = array('smush', func_get_args());
61        $image = _image_valeurs_trans($im, "smush",false,$fonction);
62        if (!$image) $im;
63
64        $im = $image["fichier"];
65        $dest = $image["fichier_dest"];
66        $creer = $image["creer"];
67
68        // Methode precise
69        // resultat plus beau, mais tres lourd
70        // Et: indispensable pour preserver transparence!
71        if ($creer) {
72                $format = trim(exec('identify -format %m '.$im));
73                /**
74                 * On récupère le nom de fichier sans extension
75                 */
76                $tmp = explode('.',$dest);
77                array_pop($tmp);
78                $tmp = join('.',$tmp);
79               
80                /**
81                 * Si on est sur un GIF, on le transforme en PNG
82                 * On utilise la commande convert pour cela
83                 */
84                if ($format == 'GIF') {
85                        $dest = $tmp.'.png';
86                        exec('convert '.$im.' '.$dest);
87                        $im = $dest;
88                        $format = 'PNG';
89                }
90               
91                /**
92                 * On est sur un PNG
93                 */
94                if ($format == 'PNG') {
95                        $nq = substr($im,0,-4).'-nq8.png';
96                        exec('pngnq '.$im.' && optipng -o5 '.$nq.' -out '.$dest,$out);
97                        if(file_exists($nq))
98                                spip_unlink($nq);
99                }
100               
101                /**
102                 * On est sur un JPEG
103                 */
104                else if ($format == 'JPEG') {
105                        $fsize = filesize($im);
106                        $dest = $tmp.'.jpg';
107                        if ($fsize < 10*1024)
108                                exec('jpegtran -copy none -optimize '.$im.' > '.$dest);
109                        else
110                                exec('jpegtran -copy none -progressive '.$im.' > '.$dest);
111                }
112
113                /**
114                 * On est sur un GIF animé
115                 */
116                else if(preg_match('/^GIFGIF/',$format)){
117                        $dest = $tmp.'.gif';
118                        exec('gifsicle -O3 '.$im.' -o '.$dest);
119                }
120               
121                /**
122                 * Si la taille du résultat est supérieure à l'original,
123                 * on retourne l'original en supprimant le fichier temporaire créé
124                 */
125                if(filesize($dest) > filesize($im)){
126                        spip_unlink($dest);
127                        $dest = $im;
128                }
129        }
130        return _image_ecrire_tag($image,array('src'=>$dest));
131}
132?>
Note: See TracBrowser for help on using the repository browser.