| | |
| | | <?php |
| | | |
| | | /* |
| | | /** |
| | | +-----------------------------------------------------------------------+ |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2012, The Roundcube Dev Team | |
| | |
| | | ); |
| | | |
| | | |
| | | /** |
| | | * Class constructor |
| | | * |
| | | * @param string $filename Image file name/path |
| | | */ |
| | | function __construct($filename) |
| | | { |
| | | $this->image_file = $filename; |
| | |
| | | $height = $imsize[1]; |
| | | $gd_type = $imsize['2']; |
| | | $type = image_type_to_extension($imsize['2'], false); |
| | | $channels = $imsize['channels']; |
| | | } |
| | | |
| | | // use ImageMagick |
| | | if (!$type && ($data = $this->identify())) { |
| | | list($type, $width, $height) = $data; |
| | | $channels = null; |
| | | } |
| | | |
| | | if ($type) { |
| | |
| | | 'gd_type' => $gd_type, |
| | | 'width' => $width, |
| | | 'height' => $height, |
| | | 'channels' => $channels, |
| | | ); |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * Resize image to a given size. Use only to shrink an image. |
| | | * If an image is smaller than specified size it will be not resized. |
| | | * |
| | | * @param int $size Max width/height size |
| | | * @param string $filename Output filename |
| | | * @param boolean $browser_compat Convert to image type displayable by any browser |
| | | * @param int $size Max width/height size |
| | | * @param string $filename Output filename |
| | | * @param boolean $browser_compat Convert to image type displayable by any browser |
| | | * |
| | | * @return mixed Output type on success, False on failure |
| | | */ |
| | |
| | | } |
| | | } |
| | | |
| | | // do we have enough memory? (#1489937) |
| | | if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && !$this->mem_check($props)) { |
| | | return false; |
| | | } |
| | | |
| | | // use GD extension |
| | | if ($props['gd_type']) { |
| | | if ($props['gd_type'] == IMAGETYPE_JPEG && function_exists('imagecreatefromjpeg')) { |
| | |
| | | $width = intval($props['width'] * $scale); |
| | | $height = intval($props['height'] * $scale); |
| | | $new_image = imagecreatetruecolor($width, $height); |
| | | |
| | | if ($new_image === false) { |
| | | return false; |
| | | } |
| | | |
| | | // Fix transparency of gif/png image |
| | | if ($props['gd_type'] != IMAGETYPE_JPEG) { |
| | |
| | | /** |
| | | * Convert image to a given type |
| | | * |
| | | * @param int $type Destination file type (see class constants) |
| | | * @param string $filename Output filename (if empty, original file will be used |
| | | * and filename extension will be modified) |
| | | * @param int $type Destination file type (see class constants) |
| | | * @param string $filename Output filename (if empty, original file will be used |
| | | * and filename extension will be modified) |
| | | * |
| | | * @return bool True on success, False on failure |
| | | */ |
| | |
| | | |
| | | // use GD extension (TIFF isn't supported) |
| | | $props = $this->props(); |
| | | |
| | | // do we have enough memory? (#1489937) |
| | | if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && !$this->mem_check($props)) { |
| | | return false; |
| | | } |
| | | |
| | | |
| | | if ($props['gd_type']) { |
| | | if ($props['gd_type'] == IMAGETYPE_JPEG && function_exists('imagecreatefromjpeg')) { |
| | |
| | | catch (Exception $e) {} |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Check if we have enough memory to load specified image |
| | | */ |
| | | private function mem_check($props) |
| | | { |
| | | // image size is unknown, we can't calculate required memory |
| | | if (!$props['width']) { |
| | | return true; |
| | | } |
| | | |
| | | // channels: CMYK - 4, RGB - 3 |
| | | $multip = ($props['channels'] ?: 3) + 1; |
| | | |
| | | // calculate image size in memory (in bytes) |
| | | $size = $props['width'] * $props['height'] * $multip; |
| | | return rcube_utils::mem_check($size); |
| | | } |
| | | } |