webmaster@1
|
1 <?php |
webmaster@1
|
2 // $Id: image.gd.inc,v 1.4 2008/01/15 10:17:42 goba Exp $ |
webmaster@1
|
3 |
webmaster@1
|
4 /** |
webmaster@1
|
5 * @file |
webmaster@1
|
6 * GD2 toolkit for image manipulation within Drupal. |
webmaster@1
|
7 */ |
webmaster@1
|
8 |
webmaster@1
|
9 /** |
webmaster@1
|
10 * @ingroup image |
webmaster@1
|
11 * @{ |
webmaster@1
|
12 */ |
webmaster@1
|
13 |
webmaster@1
|
14 /** |
webmaster@1
|
15 * Retrieve information about the toolkit. |
webmaster@1
|
16 */ |
webmaster@1
|
17 function image_gd_info() { |
webmaster@1
|
18 return array('name' => 'gd', 'title' => t('GD2 image manipulation toolkit')); |
webmaster@1
|
19 } |
webmaster@1
|
20 |
webmaster@1
|
21 /** |
webmaster@1
|
22 * Retrieve settings for the GD2 toolkit. |
webmaster@1
|
23 */ |
webmaster@1
|
24 function image_gd_settings() { |
webmaster@1
|
25 if (image_gd_check_settings()) { |
webmaster@1
|
26 $form = array(); |
webmaster@1
|
27 $form['status'] = array( |
webmaster@1
|
28 '#value' => t('The GD toolkit is installed and working properly.') |
webmaster@1
|
29 ); |
webmaster@1
|
30 |
webmaster@1
|
31 $form['image_jpeg_quality'] = array( |
webmaster@1
|
32 '#type' => 'textfield', |
webmaster@1
|
33 '#title' => t('JPEG quality'), |
webmaster@1
|
34 '#description' => t('Define the image quality for JPEG manipulations. Ranges from 0 to 100. Higher values mean better image quality but bigger files.'), |
webmaster@1
|
35 '#size' => 10, |
webmaster@1
|
36 '#maxlength' => 3, |
webmaster@1
|
37 '#default_value' => variable_get('image_jpeg_quality', 75), |
webmaster@1
|
38 '#field_suffix' => t('%'), |
webmaster@1
|
39 ); |
webmaster@1
|
40 $form['#element_validate'] = array('image_gd_settings_validate'); |
webmaster@1
|
41 |
webmaster@1
|
42 return $form; |
webmaster@1
|
43 } |
webmaster@1
|
44 else { |
webmaster@1
|
45 form_set_error('image_toolkit', t('The GD image toolkit requires that the GD module for PHP be installed and configured properly. For more information see <a href="@url">PHP\'s image documentation</a>.', array('@url' => 'http://php.net/image'))); |
webmaster@1
|
46 return FALSE; |
webmaster@1
|
47 } |
webmaster@1
|
48 } |
webmaster@1
|
49 |
webmaster@1
|
50 /** |
webmaster@1
|
51 * Validate the submitted GD settings. |
webmaster@1
|
52 */ |
webmaster@1
|
53 function image_gd_settings_validate($form, &$form_state) { |
webmaster@1
|
54 // Validate image quality range. |
webmaster@1
|
55 $value = $form_state['values']['image_jpeg_quality']; |
webmaster@1
|
56 if (!is_numeric($value) || $value < 0 || $value > 100) { |
webmaster@1
|
57 form_set_error('image_jpeg_quality', t('JPEG quality must be a number between 0 and 100.')); |
webmaster@1
|
58 } |
webmaster@1
|
59 } |
webmaster@1
|
60 |
webmaster@1
|
61 /** |
webmaster@1
|
62 * Verify GD2 settings (that the right version is actually installed). |
webmaster@1
|
63 * |
webmaster@1
|
64 * @return |
webmaster@1
|
65 * A boolean indicating if the GD toolkit is avaiable on this machine. |
webmaster@1
|
66 */ |
webmaster@1
|
67 function image_gd_check_settings() { |
webmaster@1
|
68 if ($check = get_extension_funcs('gd')) { |
webmaster@1
|
69 if (in_array('imagegd2', $check)) { |
webmaster@1
|
70 // GD2 support is available. |
webmaster@1
|
71 return TRUE; |
webmaster@1
|
72 } |
webmaster@1
|
73 } |
webmaster@1
|
74 return FALSE; |
webmaster@1
|
75 } |
webmaster@1
|
76 |
webmaster@1
|
77 /** |
webmaster@1
|
78 * Scale an image to the specified size using GD. |
webmaster@1
|
79 */ |
webmaster@1
|
80 function image_gd_resize($source, $destination, $width, $height) { |
webmaster@1
|
81 if (!file_exists($source)) { |
webmaster@1
|
82 return FALSE; |
webmaster@1
|
83 } |
webmaster@1
|
84 |
webmaster@1
|
85 $info = image_get_info($source); |
webmaster@1
|
86 if (!$info) { |
webmaster@1
|
87 return FALSE; |
webmaster@1
|
88 } |
webmaster@1
|
89 |
webmaster@1
|
90 $im = image_gd_open($source, $info['extension']); |
webmaster@1
|
91 if (!$im) { |
webmaster@1
|
92 return FALSE; |
webmaster@1
|
93 } |
webmaster@1
|
94 |
webmaster@1
|
95 $res = imagecreatetruecolor($width, $height); |
webmaster@1
|
96 if ($info['extension'] == 'png') { |
webmaster@1
|
97 $transparency = imagecolorallocatealpha($res, 0, 0, 0, 127); |
webmaster@1
|
98 imagealphablending($res, FALSE); |
webmaster@1
|
99 imagefilledrectangle($res, 0, 0, $width, $height, $transparency); |
webmaster@1
|
100 imagealphablending($res, TRUE); |
webmaster@1
|
101 imagesavealpha($res, TRUE); |
webmaster@1
|
102 } |
webmaster@1
|
103 elseif ($info['extension'] == 'gif') { |
webmaster@1
|
104 // If we have a specific transparent color. |
webmaster@1
|
105 $transparency_index = imagecolortransparent($im); |
webmaster@1
|
106 if ($transparency_index >= 0) { |
webmaster@1
|
107 // Get the original image's transparent color's RGB values. |
webmaster@1
|
108 $transparent_color = imagecolorsforindex($im, $transparency_index); |
webmaster@1
|
109 // Allocate the same color in the new image resource. |
webmaster@1
|
110 $transparency_index = imagecolorallocate($res, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']); |
webmaster@1
|
111 // Completely fill the background of the new image with allocated color. |
webmaster@1
|
112 imagefill($res, 0, 0, $transparency_index); |
webmaster@1
|
113 // Set the background color for new image to transparent. |
webmaster@1
|
114 imagecolortransparent($res, $transparency_index); |
webmaster@1
|
115 // Find number of colors in the images palette. |
webmaster@1
|
116 $number_colors = imagecolorstotal($im); |
webmaster@1
|
117 // Convert from true color to palette to fix transparency issues. |
webmaster@1
|
118 imagetruecolortopalette($res, TRUE, $number_colors); |
webmaster@1
|
119 } |
webmaster@1
|
120 } |
webmaster@1
|
121 imagecopyresampled($res, $im, 0, 0, 0, 0, $width, $height, $info['width'], $info['height']); |
webmaster@1
|
122 $result = image_gd_close($res, $destination, $info['extension']); |
webmaster@1
|
123 |
webmaster@1
|
124 imagedestroy($res); |
webmaster@1
|
125 imagedestroy($im); |
webmaster@1
|
126 |
webmaster@1
|
127 return $result; |
webmaster@1
|
128 } |
webmaster@1
|
129 |
webmaster@1
|
130 /** |
webmaster@1
|
131 * Rotate an image the given number of degrees. |
webmaster@1
|
132 */ |
webmaster@1
|
133 function image_gd_rotate($source, $destination, $degrees, $background = 0x000000) { |
webmaster@1
|
134 if (!function_exists('imageRotate')) { |
webmaster@1
|
135 return FALSE; |
webmaster@1
|
136 } |
webmaster@1
|
137 |
webmaster@1
|
138 $info = image_get_info($source); |
webmaster@1
|
139 if (!$info) { |
webmaster@1
|
140 return FALSE; |
webmaster@1
|
141 } |
webmaster@1
|
142 |
webmaster@1
|
143 $im = image_gd_open($source, $info['extension']); |
webmaster@1
|
144 if (!$im) { |
webmaster@1
|
145 return FALSE; |
webmaster@1
|
146 } |
webmaster@1
|
147 |
webmaster@1
|
148 $res = imageRotate($im, $degrees, $background); |
webmaster@1
|
149 $result = image_gd_close($res, $destination, $info['extension']); |
webmaster@1
|
150 |
webmaster@1
|
151 return $result; |
webmaster@1
|
152 } |
webmaster@1
|
153 |
webmaster@1
|
154 /** |
webmaster@1
|
155 * Crop an image using the GD toolkit. |
webmaster@1
|
156 */ |
webmaster@1
|
157 function image_gd_crop($source, $destination, $x, $y, $width, $height) { |
webmaster@1
|
158 $info = image_get_info($source); |
webmaster@1
|
159 if (!$info) { |
webmaster@1
|
160 return FALSE; |
webmaster@1
|
161 } |
webmaster@1
|
162 |
webmaster@1
|
163 $im = image_gd_open($source, $info['extension']); |
webmaster@1
|
164 $res = imageCreateTrueColor($width, $height); |
webmaster@1
|
165 imageCopy($res, $im, 0, 0, $x, $y, $width, $height); |
webmaster@1
|
166 $result = image_gd_close($res, $destination, $info['extension']); |
webmaster@1
|
167 |
webmaster@1
|
168 imageDestroy($res); |
webmaster@1
|
169 imageDestroy($im); |
webmaster@1
|
170 |
webmaster@1
|
171 return $result; |
webmaster@1
|
172 } |
webmaster@1
|
173 |
webmaster@1
|
174 /** |
webmaster@1
|
175 * GD helper function to create an image resource from a file. |
webmaster@1
|
176 * |
webmaster@1
|
177 * @param $file |
webmaster@1
|
178 * A string file path where the iamge should be saved. |
webmaster@1
|
179 * @param $extension |
webmaster@1
|
180 * A string containing one of the following extensions: gif, jpg, jpeg, png. |
webmaster@1
|
181 * @return |
webmaster@1
|
182 * An image resource, or FALSE on error. |
webmaster@1
|
183 */ |
webmaster@1
|
184 function image_gd_open($file, $extension) { |
webmaster@1
|
185 $extension = str_replace('jpg', 'jpeg', $extension); |
webmaster@1
|
186 $open_func = 'imageCreateFrom'. $extension; |
webmaster@1
|
187 if (!function_exists($open_func)) { |
webmaster@1
|
188 return FALSE; |
webmaster@1
|
189 } |
webmaster@1
|
190 return $open_func($file); |
webmaster@1
|
191 } |
webmaster@1
|
192 |
webmaster@1
|
193 /** |
webmaster@1
|
194 * GD helper to write an image resource to a destination file. |
webmaster@1
|
195 * |
webmaster@1
|
196 * @param $res |
webmaster@1
|
197 * An image resource created with image_gd_open(). |
webmaster@1
|
198 * @param $destination |
webmaster@1
|
199 * A string file path where the iamge should be saved. |
webmaster@1
|
200 * @param $extension |
webmaster@1
|
201 * A string containing one of the following extensions: gif, jpg, jpeg, png. |
webmaster@1
|
202 * @return |
webmaster@1
|
203 * Boolean indicating success. |
webmaster@1
|
204 */ |
webmaster@1
|
205 function image_gd_close($res, $destination, $extension) { |
webmaster@1
|
206 $extension = str_replace('jpg', 'jpeg', $extension); |
webmaster@1
|
207 $close_func = 'image'. $extension; |
webmaster@1
|
208 if (!function_exists($close_func)) { |
webmaster@1
|
209 return FALSE; |
webmaster@1
|
210 } |
webmaster@1
|
211 if ($extension == 'jpeg') { |
webmaster@1
|
212 return $close_func($res, $destination, variable_get('image_jpeg_quality', 75)); |
webmaster@1
|
213 } |
webmaster@1
|
214 else { |
webmaster@1
|
215 return $close_func($res, $destination); |
webmaster@1
|
216 } |
webmaster@1
|
217 } |
webmaster@1
|
218 |
webmaster@1
|
219 /** |
webmaster@1
|
220 * @} End of "ingroup image". |
webmaster@1
|
221 */ |