diff options
author | alecpl <alec@alec.pl> | 2012-03-19 10:44:57 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2012-03-19 10:44:57 +0000 |
commit | a71a97fa49fb1c7fbe5e042b2cf6239f7372acb4 (patch) | |
tree | 1a4ebc634607aae7da0858d490f0da4fd2c1cfda /program/include/rcube_image.php | |
parent | d1e3430bfa1338268315e7425d0fbab995f5e107 (diff) |
- Image resize with GD extension (#1488383)
Diffstat (limited to 'program/include/rcube_image.php')
-rw-r--r-- | program/include/rcube_image.php | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/program/include/rcube_image.php b/program/include/rcube_image.php new file mode 100644 index 000000000..9fe15fe54 --- /dev/null +++ b/program/include/rcube_image.php @@ -0,0 +1,165 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | program/include/rcube_image.php | + | | + | This file is part of the Roundcube Webmail client | + | Copyright (C) 2005-2012, The Roundcube Dev Team | + | Copyright (C) 2011-2012, Kolab Systems AG | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + | PURPOSE: | + | Image resizer | + | | + +-----------------------------------------------------------------------+ + | Author: Thomas Bruederli <roundcube@gmail.com> | + | Author: Aleksander Machniak <alec@alec.pl> | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +class rcube_image +{ + private $image_file; + + function __construct($filename) + { + $this->image_file = $filename; + } + + /** + * Get image properties. + * + * @return mixed Hash array with image props like type, width, height + */ + public function props() + { + $rcmail = rcmail::get_instance(); + + if (function_exists('getimagesize') && ($imsize = @getimagesize($this->image_file))) { + $width = $imsize[0]; + $height = $imsize[1]; + $gd_type = $imsize['2']; + $type = image_type_to_extension($imsize['2'], false); + } + + if (!$type && ($cmd = $rcmail->config->get('im_identify_path', false))) { + $id = rcmail::exec($cmd. ' 2>/dev/null {in}', array('in' => $this->image_file)); + list(, $type, $size) = explode(' ', strtolower($id)); + if ($size) { + list($width, $height) = explode('x', $size); + } + } + + if ($type) { + return array( + 'type' => $type, + 'gd_type' => $gd_type, + 'width' => $width, + 'height' => $height, + ); + } + } + + + /** + * Resize image to a given size + * + * @param int $size Max width/height size + * @param string $filename Output filename + * + * @return Success of convert as true/false + */ + public function resize($size, $filename = null) + { + $result = false; + $rcmail = rcmail::get_instance(); + $convert = $rcmail->config->get('im_convert_path', false); + $identify = $rcmail->config->get('im_identify_path', false); + $props = $this->props(); + + if (!$filename) { + $filename = $this->image_file; + } + + // use Imagemagick + if ($convert) { + $p['out'] = $filename; + $p['in'] = $this->image_file; + $p['size'] = $size.'x'.$size; + $p['type'] = $type = $props['type']; + + if (!$type) { + list(, $p['type']) = explode(' ', strtolower(rcmail::exec($identify . ' 2>/dev/null {in}', $p))); // for things like eps + } + + $type = strtr($type, array("jpeg" => "jpg", "tiff" => "tif", "ps" => "eps", "ept" => "eps")); + $p += array('type' => $type, 'types' => "bmp,eps,gif,jp2,jpg,png,svg,tif", 'quality' => 75); + $p['-opts'] = array('-resize' => $size.'>'); + + if (in_array($type, explode(',', $p['types']))) { // Valid type? + $result = rcmail::exec($convert . ' 2>&1 -flatten -auto-orient -colorspace RGB -quality {quality} {-opts} {in} {type}:{out}', $p) === ''; + } + + if ($result) { + return true; + } + } + + // use GD extension + $gd_types = array(IMAGETYPE_JPEG, IMAGETYPE_GIF, IMAGETYPE_PNG); + if ($props['gd_type'] && in_array($props['gd_type'], $gd_types)) { + if ($props['gd_type'] == IMAGETYPE_JPEG) { + $image = imagecreatefromjpeg($this->image_file); + } + elseif($props['gd_type'] == IMAGETYPE_GIF) { + $image = imagecreatefromgif($this->image_file); + } + elseif($props['gd_type'] == IMAGETYPE_PNG) { + $image = imagecreatefrompng($this->image_file); + } + + $scale = $size / max($props['width'], $props['height']); + $width = $props['width'] * $scale; + $height = $props['height'] * $scale; + + $new_image = imagecreatetruecolor($width, $height); + + // Fix transparency of gif/png image + if ($props['gd_type'] != IMAGETYPE_JPEG) { + imagealphablending($new_image, false); + imagesavealpha($new_image, true); + $transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127); + imagefilledrectangle($new_image, 0, 0, $width, $height, $transparent); + } + + imagecopyresampled($new_image, $image, 0, 0, 0, 0, $width, $height, $props['width'], $props['height']); + $image = $new_image; + + if ($props['gd_type'] == IMAGETYPE_JPEG) { + $result = imagejpeg($image, $filename, 75); + } + elseif($props['gd_type'] == IMAGETYPE_GIF) { + $result = imagegif($image, $filename); + } + elseif($props['gd_type'] == IMAGETYPE_PNG) { + $result = imagepng($image, $filename, 6, PNG_ALL_FILTERS); + } + + if ($result) { + return true; + } + } + + + // @TODO: print error to the log? + return false; + } + +} |