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