root/devel/lib/phpthumb/phpthumb.filters.php

Revision 421, 54.3 kB (checked in by sven, 3 years ago)

icons: upgrade phpthumb to 1.7.2 and move it to lib/
change icons to be output through a function rather than the bundled phpThumb.php, to allow greater control over security

  • Property svn:eol-style set to native
Line 
1 <?php
2 //////////////////////////////////////////////////////////////
3 ///  phpThumb() by James Heinrich <info@silisoftware.com>   //
4 //        available at http://phpthumb.sourceforge.net     ///
5 //////////////////////////////////////////////////////////////
6 ///                                                         //
7 // phpthumb.filters.php - image processing filter functions //
8 //                                                         ///
9 //////////////////////////////////////////////////////////////
10
11 class phpthumb_filters {
12
13     var $phpThumbObject = null;
14
15     function phpthumb_filters() {
16         return true;
17     }
18
19     function ApplyMask(&$gdimg_mask, &$gdimg_image) {
20         if (phpthumb_functions::gd_version() < 2) {
21             $this->DebugMessage('Skipping ApplyMask() because gd_version is "'.phpthumb_functions::gd_version().'"', __FILE__, __LINE__);
22             return false;
23         }
24         if (phpthumb_functions::version_compare_replacement(phpversion(), '4.3.2', '>=')) {
25
26             $this->DebugMessage('Using alpha ApplyMask() technique', __FILE__, __LINE__);
27             if ($gdimg_mask_resized = phpthumb_functions::ImageCreateFunction(ImageSX($gdimg_image), ImageSY($gdimg_image))) {
28
29                 ImageCopyResampled($gdimg_mask_resized, $gdimg_mask, 0, 0, 0, 0, ImageSX($gdimg_image), ImageSY($gdimg_image), ImageSX($gdimg_mask), ImageSY($gdimg_mask));
30                 if ($gdimg_mask_blendtemp = phpthumb_functions::ImageCreateFunction(ImageSX($gdimg_image), ImageSY($gdimg_image))) {
31
32                     $color_background = ImageColorAllocate($gdimg_mask_blendtemp, 0, 0, 0);
33                     ImageFilledRectangle($gdimg_mask_blendtemp, 0, 0, ImageSX($gdimg_mask_blendtemp), ImageSY($gdimg_mask_blendtemp), $color_background);
34                     ImageAlphaBlending($gdimg_mask_blendtemp, false);
35                     ImageSaveAlpha($gdimg_mask_blendtemp, true);
36                     for ($x = 0; $x < ImageSX($gdimg_image); $x++) {
37                         for ($y = 0; $y < ImageSY($gdimg_image); $y++) {
38                             //$RealPixel = phpthumb_functions::GetPixelColor($gdimg_mask_blendtemp, $x, $y);
39                             $RealPixel = phpthumb_functions::GetPixelColor($gdimg_image, $x, $y);
40                             $MaskPixel = phpthumb_functions::GrayscalePixel(phpthumb_functions::GetPixelColor($gdimg_mask_resized, $x, $y));
41                             $MaskAlpha = 127 - (floor($MaskPixel['red'] / 2) * (1 - ($RealPixel['alpha'] / 127)));
42                             $newcolor = phpthumb_functions::ImageColorAllocateAlphaSafe($gdimg_mask_blendtemp, $RealPixel['red'], $RealPixel['green'], $RealPixel['blue'], $MaskAlpha);
43                             ImageSetPixel($gdimg_mask_blendtemp, $x, $y, $newcolor);
44                         }
45                     }
46                     ImageAlphaBlending($gdimg_image, false);
47                     ImageSaveAlpha($gdimg_image, true);
48                     ImageCopy($gdimg_image, $gdimg_mask_blendtemp, 0, 0, 0, 0, ImageSX($gdimg_mask_blendtemp), ImageSY($gdimg_mask_blendtemp));
49                     ImageDestroy($gdimg_mask_blendtemp);
50
51                 } else {
52                     $this->DebugMessage('ImageCreateFunction() failed', __FILE__, __LINE__);
53                 }
54                 ImageDestroy($gdimg_mask_resized);
55
56             } else {
57                 $this->DebugMessage('ImageCreateFunction() failed', __FILE__, __LINE__);
58             }
59
60         } else {
61             // alpha merging requires PHP v4.3.2+
62             $this->DebugMessage('Skipping ApplyMask() technique because PHP is v"'.phpversion().'"', __FILE__, __LINE__);
63         }
64         return true;
65     }
66
67
68     function Bevel(&$gdimg, $width, $hexcolor1, $hexcolor2) {
69         $width     = ($width     ? $width     : 5);
70         $hexcolor1 = ($hexcolor1 ? $hexcolor1 : 'FFFFFF');
71         $hexcolor2 = ($hexcolor2 ? $hexcolor2 : '000000');
72
73         ImageAlphaBlending($gdimg, true);
74         for ($i = 0; $i < $width; $i++) {
75             $alpha = round(($i / $width) * 127);
76             $color1[$i] = phpthumb_functions::ImageHexColorAllocate($gdimg, $hexcolor1, false, $alpha);
77             $color2[$i] = phpthumb_functions::ImageHexColorAllocate($gdimg, $hexcolor2, false, $alpha);
78
79             ImageLine($gdimg,                   $i,                   $i,                   $i, ImageSY($gdimg) - $i, $color1[$i]); // left
80             ImageLine($gdimg,                   $i,                   $i, ImageSX($gdimg) - $i,                   $i, $color1[$i]); // top
81             ImageLine($gdimg, ImageSX($gdimg) - $i, ImageSY($gdimg) - $i, ImageSX($gdimg) - $i,                   $i, $color2[$i]); // right
82             ImageLine($gdimg, ImageSX($gdimg) - $i, ImageSY($gdimg) - $i,                   $i, ImageSY($gdimg) - $i, $color2[$i]); // bottom
83         }
84         return true;
85     }
86
87
88     function Blur(&$gdimg, $radius=0.5) {
89         // Taken from Torstein Hønsi's phpUnsharpMask (see phpthumb.unsharp.php)
90
91         $radius = round(max(0, min($radius, 50)) * 2);
92         if (!$radius) {
93             return false;
94         }
95
96         $w = ImageSX($gdimg);
97         $h = ImageSY($gdimg);
98         if ($imgBlur = ImageCreateTrueColor($w, $h)) {
99             // Gaussian blur matrix:
100             //    1    2    1
101             //    2    4    2
102             //    1    2    1
103
104             // Move copies of the image around one pixel at the time and merge them with weight
105             // according to the matrix. The same matrix is simply repeated for higher radii.
106             for ($i = 0; $i < $radius; $i++)    {
107                 ImageCopy     ($imgBlur, $gdimg, 0, 0, 1, 1, $w - 1, $h - 1);            // up left
108                 ImageCopyMerge($imgBlur, $gdimg, 1, 1, 0, 0, $w,     $h,     50.00000);  // down right
109                 ImageCopyMerge($imgBlur, $gdimg, 0, 1, 1, 0, $w - 1, $h,     33.33333);  // down left
110                 ImageCopyMerge($imgBlur, $gdimg, 1, 0, 0, 1, $w,     $h - 1, 25.00000);  // up right
111                 ImageCopyMerge($imgBlur, $gdimg, 0, 0, 1, 0, $w - 1, $h,     33.33333);  // left
112                 ImageCopyMerge($imgBlur, $gdimg, 1, 0, 0, 0, $w,     $h,     25.00000);  // right
113                 ImageCopyMerge($imgBlur, $gdimg, 0, 0, 0, 1, $w,     $h - 1, 20.00000);  // up
114                 ImageCopyMerge($imgBlur, $gdimg, 0, 1, 0, 0, $w,     $h,     16.666667); // down
115                 ImageCopyMerge($imgBlur, $gdimg, 0, 0, 0, 0, $w,     $h,     50.000000); // center
116                 ImageCopy     ($gdimg, $imgBlur, 0, 0, 0, 0, $w,     $h);
117             }
118             return true;
119         }
120         return false;
121     }
122
123
124     function BlurGaussian(&$gdimg) {
125         if (phpthumb_functions::version_compare_replacement(phpversion(), '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) {
126             if (ImageFilter($gdimg, IMG_FILTER_GAUSSIAN_BLUR)) {
127                 return true;
128             }
129             $this->DebugMessage('FAILED: ImageFilter($gdimg, IMG_FILTER_GAUSSIAN_BLUR)', __FILE__, __LINE__);
130             // fall through and try it the hard way
131         }
132         $this->DebugMessage('FAILED: phpthumb_filters::BlurGaussian($gdimg) [using phpthumb_filters::Blur() instead]', __FILE__, __LINE__);
133         return phpthumb_filters::Blur($gdimg, 0.5);
134     }
135
136
137     function BlurSelective(&$gdimg) {
138         if (phpthumb_functions::version_compare_replacement(phpversion(), '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) {
139             if (ImageFilter($gdimg, IMG_FILTER_SELECTIVE_BLUR)) {
140                 return true;
141             }
142             $this->DebugMessage('FAILED: ImageFilter($gdimg, IMG_FILTER_SELECTIVE_BLUR)', __FILE__, __LINE__);
143             // fall through and try it the hard way
144         }
145         // currently not implemented "the hard way"
146         $this->DebugMessage('FAILED: phpthumb_filters::BlurSelective($gdimg) [function not implemented]', __FILE__, __LINE__);
147         return false;
148     }
149
150
151     function Brightness(&$gdimg, $amount=0) {
152         if ($amount == 0) {
153             return true;
154         }
155         $amount = max(-255, min(255, $amount));
156
157         if (phpthumb_functions::version_compare_replacement(phpversion(), '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) {
158             if (ImageFilter($gdimg, IMG_FILTER_BRIGHTNESS, $amount)) {
159                 return true;
160             }
161             $this->DebugMessage('FAILED: ImageFilter($gdimg, IMG_FILTER_BRIGHTNESS, '.$amount.')', __FILE__, __LINE__);
162             // fall through and try it the hard way
163         }
164
165         $scaling = (255 - abs($amount)) / 255;
166         $baseamount = (($amount > 0) ? $amount : 0);
167         for ($x = 0; $x < ImageSX($gdimg); $x++) {
168             for ($y = 0; $y < ImageSY($gdimg); $y++) {
169                 $OriginalPixel = phpthumb_functions::GetPixelColor($gdimg, $x, $y);
170                 foreach ($OriginalPixel as $key => $value) {
171                     $NewPixel[$key] = round($baseamount + ($OriginalPixel[$key] * $scaling));
172                 }
173                 $newColor = ImageColorAllocate($gdimg, $NewPixel['red'], $NewPixel['green'], $NewPixel['blue']);
174                 ImageSetPixel($gdimg, $x, $y, $newColor);
175             }
176         }
177         return true;
178     }
179
180
181     function Contrast(&$gdimg, $amount=0) {
182         if ($amount == 0) {
183             return true;
184         }
185         $amount = max(-255, min(255, $amount));
186
187         if (phpthumb_functions::version_compare_replacement(phpversion(), '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) {
188             if (ImageFilter($gdimg, IMG_FILTER_CONTRAST, $amount)) {
189                 return true;
190             }
191             $this->DebugMessage('FAILED: ImageFilter($gdimg, IMG_FILTER_CONTRAST, '.$amount.')', __FILE__, __LINE__);
192             // fall through and try it the hard way
193         }
194
195         if ($amount > 0) {
196             $scaling = 1 + ($amount / 255);
197         } else {
198             $scaling = (255 - abs($amount)) / 255;
199         }
200         for ($x = 0; $x < ImageSX($gdimg); $x++) {
201             for ($y = 0; $y < ImageSY($gdimg); $y++) {
202                 $OriginalPixel = phpthumb_functions::GetPixelColor($gdimg, $x, $y);
203                 foreach ($OriginalPixel as $key => $value) {
204                     $NewPixel[$key] = min(255, max(0, round($OriginalPixel[$key] * $scaling)));
205                 }
206                 $newColor = ImageColorAllocate($gdimg, $NewPixel['red'], $NewPixel['green'], $NewPixel['blue']);
207                 ImageSetPixel($gdimg, $x, $y, $newColor);
208             }
209         }
210     }
211
212
213     function Colorize(&$gdimg, $amount, $targetColor) {
214         $amount      = (is_numeric($amount)                          ? $amount      : 25);
215         $targetColor = (phpthumb_functions::IsHexColor($targetColor) ? $targetColor : 'gray');
216
217         if ($amount == 0) {
218             return true;
219         }
220
221         if (phpthumb_functions::version_compare_replacement(phpversion(), '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) {
222             if ($targetColor == 'gray') {
223                 $targetColor = '808080';
224             }
225             $r = substr($targetColor, 0, 2);
226             $g = substr($targetColor, 2, 2);
227             $b = substr($targetColor, 4, 2);
228             if (ImageFilter($gdimg, IMG_FILTER_COLORIZE, $r, $g, $b)) {
229                 return true;
230             }
231             $this->DebugMessage('FAILED: ImageFilter($gdimg, IMG_FILTER_COLORIZE)', __FILE__, __LINE__);
232             // fall through and try it the hard way
233         }
234
235         // overridden below for grayscale
236         if ($targetColor != 'gray') {
237             $TargetPixel['red']   = hexdec(substr($targetColor, 0, 2));
238             $TargetPixel['green'] = hexdec(substr($targetColor, 2, 2));
239             $TargetPixel['blue']  = hexdec(substr($targetColor, 4, 2));
240         }
241
242         for ($x = 0; $x < ImageSX($gdimg); $x++) {
243             for ($y = 0; $y < ImageSY($gdimg); $y++) {
244                 $OriginalPixel = phpthumb_functions::GetPixelColor($gdimg, $x, $y);
245                 if ($targetColor == 'gray') {
246                     $TargetPixel = phpthumb_functions::GrayscalePixel($OriginalPixel);
247                 }
248                 foreach ($TargetPixel as $key => $value) {
249                     $NewPixel[$key] = round(max(0, min(255, ($OriginalPixel[$key] * ((100 - $amount) / 100)) + ($TargetPixel[$key] * ($amount / 100)))));
250                 }
251                 //$newColor = phpthumb_functions::ImageColorAllocateAlphaSafe($gdimg, $NewPixel['red'], $NewPixel['green'], $NewPixel['blue'], $OriginalPixel['alpha']);
252                 $newColor = ImageColorAllocate($gdimg, $NewPixel['red'], $NewPixel['green'], $NewPixel['blue']);
253                 ImageSetPixel($gdimg, $x, $y, $newColor);
254             }
255         }
256         return true;
257     }
258
259
260     function Crop(&$gdimg, $left=0, $right=0, $top=0, $bottom=0) {
261         if (!$left && !$right && !$top && !$bottom) {
262             return true;
263         }
264         $oldW = ImageSX($gdimg);
265         $oldH = ImageSY($gdimg);
266         if (($left   > 0) && ($left   < 1)) { $left   = round($left   * $oldW); }
267         if (($right  > 0) && ($right  < 1)) { $right  = round($right  * $oldW); }
268         if (($top    > 0) && ($top    < 1)) { $top    = round($top    * $oldH); }
269         if (($bottom > 0) && ($bottom < 1)) { $bottom = round($bottom * $oldH); }
270         $right  = min($oldW - $left - 1, $right);
271         $bottom = min($oldH - $top  - 1, $bottom);
272         $newW = $oldW - $left - $right;
273         $newH = $oldH - $top  - $bottom;
274
275         if ($imgCropped = ImageCreateTrueColor($newW, $newH)) {
276             ImageCopy($imgCropped, $gdimg, 0, 0, $left, $top, $newW, $newH);
277             if ($gdimg = ImageCreateTrueColor($newW, $newH)) {
278                 ImageCopy($gdimg, $imgCropped, 0, 0, 0, 0, $newW, $newH);
279                 ImageDestroy($imgCropped);
280                 return true;
281             }
282             ImageDestroy($imgCropped);
283         }
284         return false;
285     }
286
287
288     function Desaturate(&$gdimg, $amount, $color='') {
289         if ($amount == 0) {
290             return true;
291         }
292         return phpthumb_filters::Colorize($gdimg, $amount, (phpthumb_functions::IsHexColor($color) ? $color : 'gray'));
293     }
294
295
296     function DropShadow(&$gdimg, $distance, $width, $hexcolor, $angle, $fade) {
297         if (phpthumb_functions::gd_version() < 2) {
298             return false;
299         }
300         $distance = ($distance ? $distance : 10);
301         $width    = ($width    ? $width    : 10);
302         $hexcolor = ($hexcolor ? $hexcolor : '000000');
303         $angle    = ($angle    ? $angle    : 225);
304         $fade     = ($fade     ? $fade     : 1);
305
306         $width_shadow  = cos(deg2rad($angle)) * ($distance + $width);
307         $height_shadow = sin(deg2rad($angle)) * ($distance + $width);
308
309         $scaling = min(ImageSX($gdimg) / (ImageSX($gdimg) + abs($width_shadow)), ImageSY($gdimg) / (ImageSY($gdimg) + abs($height_shadow)));
310
311         for ($i = 0; $i < $width; $i++) {
312             $WidthAlpha[$i] = (abs(($width / 2) - $i) / $width) * $fade;
313             $Offset['x'] = cos(deg2rad($angle)) * ($distance + $i);
314             $Offset['y'] = sin(deg2rad($angle)) * ($distance + $i);
315         }
316
317         $tempImageWidth  = ImageSX($gdimg)  + abs($Offset['x']);
318         $tempImageHeight = ImageSY($gdimg) + abs($Offset['y']);
319
320         if ($gdimg_dropshadow_temp = phpthumb_functions::ImageCreateFunction($tempImageWidth, $tempImageHeight)) {
321
322             ImageAlphaBlending($gdimg_dropshadow_temp, false);
323             ImageSaveAlpha($gdimg_dropshadow_temp, true);
324             $transparent1 = phpthumb_functions::ImageColorAllocateAlphaSafe($gdimg_dropshadow_temp, 0, 0, 0, 127);
325             ImageFill($gdimg_dropshadow_temp, 0, 0, $transparent1);
326
327             for ($x = 0; $x < ImageSX($gdimg); $x++) {
328                 for ($y = 0; $y < ImageSY($gdimg); $y++) {
329                     $PixelMap[$x][$y] = phpthumb_functions::GetPixelColor($gdimg, $x, $y);
330                 }
331             }
332             for ($x = 0; $x