]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/Graph/external/jpgraph/src/utils/misc/adjimg.php
Agrego tareas pendientes al TODO.
[mecon/meconlib.git] / lib / MLIB / Graph / external / jpgraph / src / utils / misc / adjimg.php
1 <?php
2 //=========================================================================
3 // Name:       adjimg.php
4 // Written by: Johan Persson (johanp@aditus.nu)
5 // Ver:        $Id: adjimg.php,v 1.1 2002/04/20 19:31:33 aditus Exp $
6 //
7 // Description:
8 // (Unsupported) Utility to take an image and adjust it's brightness, 
9 // contrast and saturation. The modified image is the displayed. 
10 // The original file is untouched.
11 //
12 // Usage: adjimg.php?file=name&b=value&c=value&s=scale&sat=saturation
13 //
14 // License:     QPL 1.0
15 //              Copyright (C) 2001,2002 Johan Persson
16 //=========================================================================
17
18 function LoadImage($filename,$format="png") {
19         $f = "imagecreatefrom".$format;
20         $img = @$f($filename);
21         if( !$img ) {
22                 die("Error: Can't read image file: $filename");   
23         }
24         return $img;
25 }
26
27 function AdjSat($img,$sat) {
28         $nbr = imagecolorstotal ($img);
29         for( $i=0; $i<$nbr; ++$i ) {
30                 $colarr = imagecolorsforindex ($img,$i);
31                 $rgb[0]=$colarr["red"];
32                 $rgb[1]=$colarr["green"];
33                 $rgb[2]=$colarr["blue"];
34                 $rgb = AdjRGBSat($rgb,$sat);
35                 imagecolorset ($img, $i, $rgb[0], $rgb[1], $rgb[2]);
36         }
37 }
38
39 function AdjBrightContrast($img,$bright,$contr) {
40         $nbr = imagecolorstotal ($img);
41         for( $i=0; $i<$nbr; ++$i ) {
42                 $colarr = imagecolorsforindex ($img,$i);
43                 $r = AdjRGBBrightContrast($colarr["red"],$bright,$contr);
44                 $g = AdjRGBBrightContrast($colarr["green"],$bright,$contr);
45                 $b = AdjRGBBrightContrast($colarr["blue"],$bright,$contr);              
46                 imagecolorset ($img, $i, $r, $g, $b);
47         }
48 }
49
50 function AdjRGBBrightContrast($rgb,$bright,$contr) {
51         // First handle contrast, i.e change the dynamic range around grey
52         if( $contr <= 0 ) {
53                 // Decrease contrast
54                 $adj = abs($rgb-128) * (-$contr);
55                 if( $rgb < 128 ) 
56                         $rgb += $adj;
57                 else 
58                         $rgb -= $adj;
59         }
60         else { // $contr > 0
61                 // Increase contrast
62                 if( $rgb < 128 )
63                         $rgb = $rgb - ($rgb * $contr);
64                 else
65                         $rgb = $rgb + ((255-$rgb) * $contr);
66         }
67         
68         // Add (or remove) various amount of white
69         $rgb += $bright*255;    
70         $rgb=min($rgb,255);
71         $rgb=max($rgb,0);
72         return $rgb;    
73 }
74         
75
76
77 // Adjust saturation for RGB array $u. $sat is a value between -1 and 1
78 // Note: Due to GD inability to handle true color the RGB values are only between
79 // 8 bit. This makes saturation quite sensitive for small increases in parameter sat.
80 // 
81 // Tip: To get a grayscale picture set sat=-100, values <-100 changes the colors
82 // to the complementary colors.
83 // 
84 // Implementation note: The saturation is implemented directly in the RGB space
85 // by adjusting the perpendicular distance between the RGB point and the "grey"
86 // line (1,1,1). Setting $sat>0 moves the point away from the line along the perp.
87 // distance and a negative value moves the point closer to the line.
88 // The values are truncated when the color point hits the bounding box along the
89 // RGB axis.
90 // DISCLAIMER: I'm not 100% sure this is he correct way to imeplemen a saturation 
91 // function in RGB space. 
92 function sign($a) {if( $a>=0) return 1; else return -1;}
93 function AdjRGBSat($rgb,$sat) {
94         // Gray vector
95         $v=array(1,1,1);
96
97         // Dot product
98         $dot = $rgb[0]*$v[0]+$rgb[1]*$v[1]+$rgb[2]*$v[2];
99
100         // Normalize dot product
101         $normdot = $dot/3;
102
103         // Direction vector between $u and its projection onto $v
104         for($i=0; $i<3; ++$i)
105                 $r[$i] = $rgb[$i] - $normdot*$v[$i];
106
107         // Adjustment factor so that sat==1 sets the highest RGB value to 255
108         if( $sat > 0 ) {
109                 $m=0;
110                 for( $i=0; $i<3; ++$i) {
111                         if( sign($r[$i]) == 1 && $r[$i]>0)
112                                 $m=max($m,(255-$rgb[$i])/$r[$i]);
113                 }
114                 $tadj=$m;
115         }
116         else
117                 $tadj=1;
118                 
119         $tadj = $tadj*$sat;     
120         for($i=0; $i<3; ++$i) {
121                 $un[$i] = round($rgb[$i] + $tadj*$r[$i]);               
122                 
123                 // Truncate color when they reach 0
124                 if( $un[$i]<0 ) $un[$i]=0;
125                 
126                 // Avoid potential rounding error
127                 if( $un[$i]>255 ) $un[$i]=255;
128         }               
129         return $un;     
130 }
131         
132
133         
134 if( empty($file) )
135         die("<b>Usage:</b><br>r.php?file=name&[b=value][&c=value][&s=scale][&sat=saturation]<p>
136         file= Filename, must end with the image format, i.e. .png, .jpg, .gif<br>
137         b       = Brightness value [-1, 1]<br>
138         c       = Contrast value [-1, 1]<br>
139         s       = Scale<br>
140         sat= Color saturation value.<br>");
141
142 if(strstr($file,"png")) 
143         $bkg = LoadImage($file);
144 elseif( strstr($file,"jpg")) 
145         $bkg = LoadImage($file,"jpeg");
146 elseif( strstr($file,"gif")) 
147         $bkg = LoadImage($file,"gif");          
148         
149 if( empty($b) ) $b=0;
150 if( empty($c) ) $c=0;
151 if( empty($s) ) $s=1;
152 if( empty($sat) ) $sat=0;
153
154 // Adjust contrast and brightness of background color
155 if( $b || $c )
156         AdjBrightContrast($bkg,$b,$c);
157
158 // Adjust color saturation
159 if( $sat )
160         AdjSat($bkg,$sat);
161
162 // Get width & height
163 $bw = ImageSX($bkg);
164 $bh = ImageSY($bkg);
165
166 // Scale image
167 $w=$bw*$s;
168 $h=$bh*$s;
169
170 $img = imagecreate($w,$h);
171 imagecopyresized($img,$bkg,0,0,0,0,$w,$h,$bw,$bh);
172 $background_color = ImageColorAllocate ($img, 255, 255, 255);
173
174 if(strstr($file,"png")) {
175         header ("Content-type: image/png");
176         imagepng($img);
177 }
178 elseif( strstr($file,"jpg")) {
179         header ("Content-type: image/jpeg");
180         imagejpeg($img);        
181 }
182 elseif( strstr($file,"gif")) {
183         header ("Content-type: image/gif");
184         imagegif($img); 
185 }
186 else
187         die("Unknown graphic format in file $file");
188 ?>