source: spip-zone/_plugins_/image_ragged/image_ragged_filtre.php @ 33511

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

bug

File size: 4.2 KB
Line 
1<?php
2/**
3 * Copyright Arnaud Martin
4 * Filtre trouve sur paris-beyrouth:
5 * http://www.paris-beyrouth.org/Un-habillage-irregulier-2
6 *
7 * integre en plugin par Pierre Andrews
8 */
9
10function image_ragged ($img, $align, $margin=10, $coul=-1) {
11
12  include_spip("inc/filtres_images");
13  if (strlen($coul) == 6) {
14        $couleurs = couleur_hex_to_dec($coul);
15        $dr= $couleurs["red"];
16        $dg= $couleurs["green"];
17        $db= $couleurs["blue"];
18        $placer_fond = true;
19  }
20  else $placer_fond = false;
21
22  $image = image_valeurs_trans($img, "float-$align$coul$margin", "php");
23  if (!$image) return("");
24
25  $w = $image["largeur"];
26  $h = $image["hauteur"];
27  $precision = round($h / 5);
28       
29  $im = $image["fichier"];
30  $dest = $image["fichier_dest"];
31  $creer = $image["creer"];
32
33        $placer_fond = true;
34
35  if (!$placer_fond) $ret = "<div style='position: relative; float: $align; width: 0px; height: 0px;'><img src='$im' class='format_png spip_ragged' alt='' style='position: absolute; $align: 0px;' /></div>";
36
37  if ($creer) {
38        include_spip('inc/logos'); // bicoz presence reduire_image
39        $im_n = extraire_attribut(image_reduire($im, 0, $precision), "src");
40        $nouveau = image_valeurs_trans($im_n, "reduction-$precision");
41        $im_n = $nouveau["fichier"];
42               
43        $x_i = $nouveau["largeur"];
44        $y_i = $nouveau["hauteur"];
45        $rapport = ($w / $x_i);
46       
47               
48        $im_n = $image["fonction_imagecreatefrom"]($im_n);
49
50
51
52        // une premiere passe
53        // pour recuperer les valeurs
54        for ($j = 0; $j < $y_i; $j++) {
55          $transp = true;
56               
57          for ($i = 0; $i < $x_i && $transp; $i++) {
58
59                if ($align == "right") $rgb = ImageColorAt($im_n, $i+1, $j);
60                else $rgb = ImageColorAt($im_n, ($x_i - $i)-1, $j);
61                $a = ($rgb >> 24) & 0xFF;
62                $r = ($rgb >> 16) & 0xFF;
63                $g = ($rgb >> 8) & 0xFF;
64                $b = $rgb & 0xFF;
65
66                if ($a > 125) $larg[$j] ++;
67                else if ($placer_fond && abs($r-$dr)+abs($g-$dg)+abs($b-$db) < 40) $larg[$j] ++;
68                else $transp = false;
69          }                     
70        }
71               
72        $larg[-1] = $x_i;
73        $larg[$y_i] = $x_i;
74       
75
76        // On reprend chaque larg pour appliquer le margin verticalement       
77        // La valeur "larg" de chaque ligne est inchangee,
78        // mais on calcule une valeur a ajouter si les lignes avant et apres sont plus longues
79        // le $add sera ensuite ajouté à la marge en "margin", sinon on a des caracteres masques sous IE.
80        // La valeur de l'espacement vertical est au moins 25px, parce que les lignes de texte se calculent non sur la ligne de base, mais sur leur premier pixel superieur
81        // il faut donc y aller large pour eviter les superpositions
82        $vertical = ceil(max($margin, 25) / 5);
83        for ($i = -1; $i <= $y_i; $i ++) {
84               
85                $add[$i] = 0;
86               
87                for ($j = max($i - $vertical, -1); $j <= min($i + $vertical, $y_i); $j++) {
88                        $add[$i] = max($add[$i], ($larg[$i] - $larg[$j]));
89                       
90                }
91        }
92
93        if ($align == "left") $mrg = "margin-right";
94        else $mrg = "padding-left";
95
96        // On ajoute un div pour forcer le margin vertical au dessus - ca evite notamment que la premiere ligne de texte passe sous l'image
97    $forme .= "\n<div style='float: $align; clear: $align; $mrg: ".($add[0]*$rapport + $margin)."px; width:".($w - ($larg[0] * $rapport))."px ; height: ".max($margin,25)."px; overflow: hidden;'></div>";
98
99        // une deuxieme passe
100        // pour appliquer les valeurs
101        // en utilisant les valeurs precedente et suivante
102        for ($j = 0; $j < $y_i; $j++) {
103          $reste = ($precision - $j);
104          $haut_rest = $h - $haut_tot;
105          $hauteur = round(($haut_rest) / $reste);
106          $haut_tot = $haut_tot + $hauteur;
107          $resultat = $larg[$j];
108
109          // Placer l'image en fond de differentes tranches
110          // uniquement si detourage par la couleur de fond
111          if ($placer_fond && $haut_tot <= $h) $backg = " background: url($im) $align -".($haut_tot-$hauteur)."px no-repeat;";
112          else $backg = "";
113
114          $forme .= "\n<div style='float: $align; clear: $align; $mrg: ".($add[$j] * $rapport + $margin)."px; width: ".round(($w - ($resultat)*$rapport))."px ; height: ".round($hauteur)."px; overflow: hidden;$backg'></div>";
115        }
116        // Ajouter un div de plus en dessous
117        $forme .= "\n<div style='float: $align; clear: $align; width: ".($margin+round(($w - ($resultat)*$rapport)))."px ; height: ".round($hauteur)."px; overflow: hidden;'></div>";
118
119        // Sauvegarder le fichier               
120        $handle = fopen($dest, 'w');
121        fwrite($handle, $forme);
122        fclose($handle);
123
124        $ret .= $forme;
125  }
126  else {
127        $ret .= join(file($dest),"");
128  }
129
130  return $ret;
131}
132?>
Note: See TracBrowser for help on using the repository browser.