annotate includes/image.gd.inc @ 1:c1f4ac30525a 6.0

Drupal 6.0
author Franck Deroche <webmaster@defr.org>
date Tue, 23 Dec 2008 14:28:28 +0100
parents
children
rev   line source
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 */