Check available memory for image resizing with GD on Windows (#1489937)

pull/246/head
Thomas Bruederli 10 years ago
parent a63b9b546c
commit 5c9ddcc052

@ -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);
}
}

Loading…
Cancel
Save