|
|
@ -59,11 +59,13 @@ class rcube_image |
|
|
|
$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) { |
|
|
@ -72,8 +74,11 @@ class rcube_image |
|
|
|
'gd_type' => $gd_type, |
|
|
|
'width' => $width, |
|
|
|
'height' => $height, |
|
|
|
'channels' => $channels, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -181,6 +186,11 @@ class rcube_image |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 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')) { |
|
|
@ -327,6 +337,12 @@ class rcube_image |
|
|
|
// 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')) { |
|
|
|
$image = imagecreatefromjpeg($this->image_file); |
|
|
@ -406,4 +422,22 @@ class rcube_image |
|
|
|
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); |
|
|
|
} |
|
|
|
} |