After a user has uploaded an image I'm trying to create a thumbnail of it. The problem is that when my script attempts to load a large image into memory in order to resample it (for example taken on an iPad at 2448px x 3264px), it runs out of memory when calling imagecreatefromjpeg
. I can't increase the available memory because it's a shared server, and I can't install any alternative image libraries for the same reason.
$name = "upload/1/" . $filename;
move_uploaded_file($_FILES['myFile']['tmp_name'], $name);
createthumb($name, "upload/1/th_" . $filename, 230, 172);
function createthumb($name, $filename, $new_w, $new_h) {
global $Postcode;
$system=explode('.', $name);
if (preg_match('/jpg|jpeg/',$system[1])) {
$src_img=imagecreatefromjpeg($name);
}
if (preg_match('/png/',$system[1])) {
$src_img=imagecreatefrompng($name);
}
$old_x=imageSX($src_img);
$old_y=imageSY($src_img);
if ($old_x > $old_y) {
$thumb_w=$new_w;
$thumb_h=$old_y*($new_h/$old_x);
}
if ($old_x < $old_y) {
$thumb_w=$old_x*($new_w/$old_y);
$thumb_h=$new_h;
}
if ($old_x == $old_y) {
$thumb_w=$new_w;
$thumb_h=$new_h;
}
$dst_img=ImageCreateTrueColor($thumb_w,$thumb_h);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);
if (preg_match("/png/",$system[1])){
imagepng($dst_img, $filename);
}
else {
imagejpeg($dst_img, $filename);
}
imagedestroy($dst_img);
}
Is there ANY way I can solve this issue with the caveat that I can't increase the memory or use a different image library?