source: spip-zone/_plugins_/image_responsive/image_responsive_options.php @ 94695

Last change on this file since 94695 was 94695, checked in by arno@…, 4 years ago

Déterminer les dimensions par le parent plutôt que par l’image elle-même (bug curieux sur Firefox).

File size: 8.4 KB
Line 
1<?php
2
3if (!defined("_IMAGE_RESPONSIVE_CALCULER")) define("_IMAGE_RESPONSIVE_CALCULER", false);
4if (!defined("_SPIP_LIER_RESSOURCES")) define("_SPIP_LIER_RESSOURCES", false);
5
6
7function _findSharp($intOrig, $intFinal) {
8  $intFinal = $intFinal * (750.0 / $intOrig);
9  $intA     = 52;
10  $intB     = -0.27810650887573124;
11  $intC     = .00047337278106508946;
12  $intRes   = $intA + $intB * $intFinal + $intC * $intFinal * $intFinal;
13  return max(round($intRes), 0);
14}
15
16
17function image_reduire_net($source, $taille = 0, $taille_y=0, $dpr=0) {
18        // ordre de preference des formats graphiques pour creer les vignettes
19        // le premier format disponible, selon la methode demandee, est utilise
20
21
22        //$force = true;
23        include_spip('inc/filtres_images_lib_mini');
24       
25        if ($dpr > 1) {
26                $taille = $taille * $dpr;
27                $taille_y = $taille_y * $dpr;   
28        }
29
30        if ($taille == 0 AND $taille_y > 0)
31                $taille = 10000; # {0,300} -> c'est 300 qui compte
32        elseif ($taille > 0 AND $taille_y == 0)
33                $taille_y = 10000; # {300,0} -> c'est 300 qui compte
34        elseif ($taille == 0 AND $taille_y == 0)
35                return '';
36
37        $valeurs = _image_valeurs_trans($source, "reduire_net-{$taille}-{$taille_y}-{$dpr}", false);
38        $image = $valeurs['fichier'];
39        $format = $valeurs['format_source'];
40
41        $destdir = dirname($valeurs['fichier_dest']);
42        $destfile = basename($valeurs['fichier_dest'],".".$valeurs["format_dest"]);
43
44
45       
46        $format_sortie = $valeurs['format_dest'];
47       
48        // liste des formats qu'on sait lire
49        $img = isset($GLOBALS['meta']['formats_graphiques'])
50          ? (strpos($GLOBALS['meta']['formats_graphiques'], $format)!==false)
51          : false;
52
53        // si le doc n'est pas une image, refuser
54        if (!$force AND !$img) return;
55        $destination = "$destdir/$destfile";
56
57
58        // chercher un cache
59        $vignette = '';
60        if ($test_cache_only AND !$vignette) return;
61
62        // utiliser le cache ?
63        if (!$test_cache_only)
64        if ($force OR !$vignette OR (@filemtime($vignette) < @filemtime($image))) {
65
66                $creation = true;
67                // calculer la taille
68                if (($srcWidth=$valeurs['largeur']) && ($srcHeight=$valeurs['hauteur'])){
69                        if (!($destWidth=$valeurs['largeur_dest']) || !($destHeight=$valeurs['hauteur_dest']))
70                                list ($destWidth,$destHeight) = _image_ratio($valeurs['largeur'], $valeurs['hauteur'], $maxWidth, $maxHeight);
71                }
72                else {
73                        $destWidth = $maxWidth;
74                        $destHeight = $maxHeight;
75                }
76
77                // Si l'image est de la taille demandee (ou plus petite), simplement
78                // la retourner
79                if ($srcWidth
80                AND $srcWidth <= $maxWidth AND $srcHeight <= $maxHeight) {
81                        $vignette = $destination.'.'.$format;
82                        @copy($image, $vignette);
83                }
84                else {
85                        if (_IMG_GD_MAX_PIXELS && $srcWidth*$srcHeight>_IMG_GD_MAX_PIXELS){
86                                spip_log("vignette gd1/gd2 impossible : ".$srcWidth*$srcHeight."pixels");
87                                return $image;
88                        }
89                        $destFormat = $format_sortie;
90                        if (!$destFormat) {
91                                spip_log("pas de format pour $image");
92                                return;
93                        }
94                       
95                        $fonction_imagecreatefrom = $valeurs['fonction_imagecreatefrom'];
96                        if (!function_exists($fonction_imagecreatefrom))
97                                return '';
98                        $srcImage = @$fonction_imagecreatefrom($image);
99                        if (!$srcImage) { 
100                                spip_log("echec gd1/gd2"); 
101                                return $image; 
102                        } 
103                       
104                        // Initialisation de l'image destination
105                        if ($destFormat != "gif") 
106                                $destImage = ImageCreateTrueColor($destWidth, $destHeight); 
107                        if (!$destImage) 
108                                $destImage = ImageCreate($destWidth, $destHeight); 
109
110                        // Recopie de l'image d'origine avec adaptation de la taille
111                        $ok = false; 
112                        if (function_exists('ImageCopyResampled')) { 
113                                if ($format == "gif") { 
114                                        // Si un GIF est transparent,
115                                        // fabriquer un PNG transparent 
116                                        $transp = imagecolortransparent($srcImage); 
117                                        if ($transp > 0) $destFormat = "png"; 
118                                }
119                                if ($destFormat == "png") { 
120                                        // Conserver la transparence
121                                        if (function_exists("imageAntiAlias")) imageAntiAlias($destImage,true); 
122                                        @imagealphablending($destImage, false); 
123                                        @imagesavealpha($destImage,true); 
124                                }
125                                $ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
126                        }
127                        if (!$ok)
128                                $ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
129                       
130                        //die (phpversion());
131                       
132                        if($destFormat == "jpg" && function_exists('imageconvolution')) {
133                                $intSharpness = _findSharp($srcWidth, $destWidth);
134                                $arrMatrix = array(
135                                        array(-1, -2, -1),
136                                        array(-2, $intSharpness + 12, -2),
137                                        array(-1, -2, -1)
138                                );
139                               
140                                $div = array_sum(array_map('array_sum', $arrMatrix)); 
141                                //die ("div: ".$div);
142                               
143                                // On s'arrange maintenant pour que le divisor soit 1
144                                // parce qu'imageconvoluion en PHP 5.5.9 semble ne prendre en compte
145                                // que cette valeur
146                                $arrMatrix = array(
147                                        array(-1/$div, -2/$div, -1/$div),
148                                        array(-2/$div, ($intSharpness + 12)/$div, -2/$div),
149                                        array(-1/$div, -2/$div, -1/$div)
150                                );
151                                $divisor = array_sum(array_map('array_sum', $arrMatrix));           
152                                //die ("divisor: ".$divisor);
153                                                               
154
155                                imageconvolution($destImage, $arrMatrix, $divisor, 0);
156                        }
157                        // Sauvegarde de l'image destination
158                        $valeurs['fichier_dest'] = $vignette = "$destination.$destFormat";
159                        $valeurs['format_dest'] = $format = $destFormat;
160                       
161                        if ($dpr > 1.5) $qualite = 40;
162                        else $qualite=_IMG_GD_QUALITE;
163                        _image_gd_output($destImage,$valeurs, $qualite);
164
165                        if ($srcImage)
166                                ImageDestroy($srcImage);
167                        ImageDestroy($destImage);
168                }
169        }
170        $size = @getimagesize($vignette);
171        // Gaffe: en safe mode, pas d'acces a la vignette,
172        // donc risque de balancer "width='0'", ce qui masque l'image sous MSIE
173        if ($size[0] < 1) $size[0] = $destWidth;
174        if ($size[1] < 1) $size[1] = $destHeight;
175       
176        $largeur = $size[0];
177        $hauteur = $size[1];
178        $date = @filemtime($vignette);
179       
180
181        // dans l'espace prive mettre un timestamp sur l'adresse
182        // de l'image, de facon a tromper le cache du navigateur
183        // quand on fait supprimer/reuploader un logo
184        // (pas de filemtime si SAFE MODE)
185        $date = test_espace_prive() ? ('?'.$date) : '';
186
187        return _image_ecrire_tag(
188                $valeurs,
189                array('src'=>"$vignette",
190                'width'=>$largeur,
191                'height'=>$hauteur)
192        );
193
194}
195
196
197
198function retour_image_responsive($img, $taille, $dpr, $xsendfile, $retour="http"){
199        if (!preg_match(',\.(gif|jpe?g|png)$,i', $img)
200        OR !preg_match(',^\d+v?$,', $taille)
201        OR !preg_match(',^[\d\.]*$,', $dpr)
202        OR !file_exists($img)) {
203                if($retour == "http") {
204                        header('HTTP/1.1 500 Internal Server Error');
205                        die( "Erreur" );
206                } else {
207                        return find_in_path("rien.gif");
208                }
209        } else {
210
211                include_spip("inc/filtres");
212                if (preg_match("/([0-9]+)v$/", $taille, $regs)) {
213                        $taille = $regs[1];
214                        $v = true;
215                        $taille = min($taille, hauteur($img));
216                } else {
217                        $v = false;
218                        $taille = min($taille, largeur($img));
219                }
220
221       
222                $terminaison = substr($img, strlen($img)-3, 3);
223                $base = sous_repertoire(_DIR_VAR, "cache-responsive");
224                $base = sous_repertoire($base, "cache-".$taille);
225                $dest = md5($img);
226                if ($dpr > 1) $dest .= "$dest-$dpr";
227                else $dpr = false;
228               
229                $dest = $base.$dest.".".$terminaison;
230
231                if (file_exists($dest)) {
232                        if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && 
233                                strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= filemtime($dest))
234                        {
235                                if($retour == "http") {
236                                        header('HTTP/1.0 304 Not Modified');
237                                        exit;
238                                } else {
239                                        return $img;
240                                }
241                        }
242                }
243               
244                if (!file_exists($dest) OR filemtime($dest) < filemtime($img)) {
245                        // Là on fabrique l'image
246                        // et on la recopie vers $dest
247                        //
248                        //cette méthode permet d'accélérer par rapport à SPIP
249                        // parce qu'on connait le nom du fichier à l'avance
250                        // et on fait donc les tests sans déclencher la cavalerie
251                       
252                        if ($v) {
253                                $img_new = image_reduire_net ($img, 0, $taille, $dpr);
254                        } else {
255                                $img_new = image_reduire_net ($img, $taille, 0, $dpr);
256                        }
257                        $img_new = extraire_attribut($img_new, "src");
258                       
259                        copy($img_new, $dest);
260                        if ($img_new != $img) unlink ($img_new);
261                }
262
263                if($retour == "http") {
264                        $extension = str_replace("jpg", "jpeg", $terminaison);
265                        $expires = 60*60*24*14;
266               
267                        if ($xsendfile == 1) { 
268                                $dest = realpath("$dest");
269                                //die($dest);
270                                header("X-Sendfile: $dest");
271                                header("Content-Type: image/".$extension);
272                                exit;
273                        } else {
274                                ob_get_clean();
275                                header("Content-Type: image/".$extension);
276                                header("Pragma: public");
277                                header("Cache-Control: maxage=".$expires);
278                                header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');
279                                header('Content-Length: '.filesize($dest));
280               
281                                header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($dest)).' GMT', true, 200);
282                                readfile($dest);
283                                ob_end_flush();
284                        }
285                } else {
286                        return $dest;
287                }
288
289        }
290}
Note: See TracBrowser for help on using the repository browser.