son Posted June 21, 2011 Share Posted June 21, 2011 Hi there,On a page where you can upload images to be displayed on website I am using the following code: define('THUMB_SIZE_W',200);define('THUMB_SIZE_H',200);define('IMG_SIZE_W',490);define('IMG_SIZE_H',490);function resize_image($src, $dst, $width, $height){ if (file_exists($src)) { $chunks = explode('.', $src); $ext = $chunks[count($chunks) - 1]; if ($ext == 'jpg' OR $ext == 'JPG') $orig = imagecreatefromjpeg($src); elseif ($ext == 'gif' OR $ext == 'GIF') $orig = imagecreatefromgif($src); elseif ($ext == 'png' OR $ext == 'PNG') $orig = imagecreatefrompng($src); else { echo "Unspported extension ({$ext})"; return; } $w = imagesx($orig); $h = imagesy($orig); // if it needs to be resized if ($w > $width || $h > $height) { // if the width is larger than allowed if ($w > $width) { $ratio = $width / $w; // ratio is max width divided by actual (<1) $img = imagecreatetruecolor($width, round($h * $ratio)); // height is actual height times ratio (less) imagecopyresampled($img, $orig, 0, 0, 0, 0, $width, round($h * $ratio), $w, $h); $orig = $img; $w = imagesx($orig); $h = imagesy($orig); } // if the height is larger than allowed if ($h > $height) { $ratio = $height / $h; // ratio is max height divided by actual (<1) $img2 = imagecreatetruecolor(round($w * $ratio), $height); // width is actual width times ratio (less) imagecopyresampled($img2, $orig, 0, 0, 0, 0, round($w * $ratio), $height, $w, $h); $orig = $img2; $w = imagesx($orig); $h = imagesy($orig); } switch ($ext) { case 'jpg': imagejpeg($orig, $dst); break; case 'gif': imagegif($orig, $dst); break; case 'png': imagepng($orig, $dst); break; case 'JPG': imagejpeg($orig, $dst); break; case 'GIF': imagegif($orig, $dst); break; case 'PNG': imagepng($orig, $dst); break; } } imagedestroy($orig); } else echo "Error: the source file does not exist ({$src}, {$dst})";} This is working all fine as long as the image in not much smaller than the specified THUMB_SIZE_H and THUMB_SIZE_W. If they are the file is not moved into the relevant folders. The move happens via if (!move_uploaded_file($_FILES[$imgID]['tmp_name'], "../images/main/{$_FILES[$imgID]['name']}")) $errors[$imgID] = 'The image could not be moved.'; else { resize_image("../images/main/{$_FILES[$imgID]['name']}", "../images/main/{$_FILES[$imgID]['name']}", IMG_SIZE_W, IMG_SIZE_H); resize_image("../images/main/{$_FILES[$imgID]['name']}", "../images/thumb/{$_FILES[$imgID]['name']}", THUMB_SIZE_W, THUMB_SIZE_H); } Is there a better way to write my function or why do I have issues with smaller sizes?Thanks,Son Link to comment Share on other sites More sharing options...
trevelluk Posted June 21, 2011 Share Posted June 21, 2011 It looks as though the problem is that the file copy (via the imagejpg(), imagegif() and imagepng() calls) happens inside the if statement: if ($w > $width || $h > $height) So, if $w is less than $width AND $h is less than $height, you'll jump straight down to: imagedestroy($orig); without actually doing anything to the file.I'd suggest adding an else statement at the end of your size check, which just does a straight file copy. Something like: if ($w > $width || $h > $height){... all of your current resizing code ...}else{copy($orig, $dst);}imaegdestroy($orig); This means that if the source image is already below the specified dimensions, it will be copied as-is to the appropriate location. Link to comment Share on other sites More sharing options...
son Posted June 24, 2011 Author Share Posted June 24, 2011 Cheers. Will have a go. This did not occur to me and now as you say it I feel that I should have known this... Will check this on Monday when I am back in office. Having thought I could work in my days off from home turned into a nightmare. The new internet connection is still not installed (you can never trust the dates they give you, can you?) and without a laptop a bit too bothersome... I think I sometimes rely too much on all my software stuff;-)Appreciate your help!Son Link to comment Share on other sites More sharing options...
son Posted June 29, 2011 Author Share Posted June 29, 2011 Ha, ha. I still have to come back. Although with the suggested change the files upload fine and with correct sizes into both folders (..banner/main and ...banner/thumb) I always get an error from line copy($orig, $dst); as copy(Resource id #7) [function.copy]: failed to open stream: No such file or directoryDate/Time: 6-29-2011 16:16:46Array( [src] => ../banner/main/grey100By100.jpg [dst] => ../banner/main/grey100By100.jpg [width] => 210 [height] => 630 [chunks] => Array ( [0] => [1] => [2] => /banner/main/grey100By100 [3] => jpg ) [ext] => jpg [orig] => Resource id #7 [w] => 100 [h] => 100) This rather peculiar as it uploads just fine into relevant folders... Do you have any idea why this might be?Son Link to comment Share on other sites More sharing options...
MrFish Posted June 29, 2011 Share Posted June 29, 2011 copy($orig, $dst); $orig is a php image object. It should be a path to your original file. Link to comment Share on other sites More sharing options...
son Posted June 29, 2011 Author Share Posted June 29, 2011 copy($orig, $dst); $orig is a php image object. It should be a path to your original file. Sorry, Mr Fish, I am not with you as the copy itself works. Could you explain what this means?Son Link to comment Share on other sites More sharing options...
MrFish Posted June 29, 2011 Share Posted June 29, 2011 You error is saying copy is not working. copy(Resource id #7) [function.copy]: failed to open stream: No such file or directoryAnd your $orig variable only works on image objects. $chunks = explode('.', $src); $ext = $chunks[count($chunks) - 1]; if ($ext == 'jpg' OR $ext == 'JPG') $orig = imagecreatefromjpeg($src); elseif ($ext == 'gif' OR $ext == 'GIF') $orig = imagecreatefromgif($src); elseif ($ext == 'png' OR $ext == 'PNG') $orig = imagecreatefrompng($src); copy requires 2 string parameters. The first parameter is the path to the file and the second is the destination path. So you'l wantcopy($src, $dst); Link to comment Share on other sites More sharing options...
son Posted June 29, 2011 Author Share Posted June 29, 2011 Now I am with you. I change it tocopy($src, $dst);which works now and is great. Just to double-check:imagedestroy($orig);is fine without path, isn't it? I am getting paranoid now...Cheers,Son Link to comment Share on other sites More sharing options...
birbal Posted June 29, 2011 Share Posted June 29, 2011 imagedestroy() takes the image resource as parameter which is create by imagecreatefrom*() . not the path of the image Link to comment Share on other sites More sharing options...
son Posted June 29, 2011 Author Share Posted June 29, 2011 imagedestroy() takes the image resource as parameter which is create by imagecreatefrom*() . not the path of the imageCheers... Can sleep now soundly tonight;-)Son Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.