Crop image in PHP

The code below uses the image I want, but for large images it also works. Is there a way to "scale the image"

Idealy, I could have each image about the same size before cropping, to get good results every time

The code

<?php $image = $_GET['src']; // the image to crop $dest_image = 'images/cropped_whatever.jpg'; // make sure the directory is writeable $img = imagecreatetruecolor('200','150'); $org_img = imagecreatefromjpeg($image); $ims = getimagesize($image); imagecopy($img,$org_img, 0, 0, 20, 20, 200, 150); imagejpeg($img,$dest_image,90); imagedestroy($img); echo '<img src="'.$dest_image.'" ><p>'; 
+61
php gd crop
Dec 6 '09 at 17:39
source share
9 answers

If you are trying to create thumbnails, you must first resize the image using imagecopyresampled(); . You must resize the image so that the size of the smaller side of the image is equal to that of the thumb.

For example, if the original image is 1280x800px and the thumb is 200x150px, you should resize the image to 240x150px and then crop it to 200x150px. This means that the aspect ratio of the image will not change.

Here is a general formula for creating thumbnails:

 $image = imagecreatefromjpeg($_GET['src']); $filename = 'images/cropped_whatever.jpg'; $thumb_width = 200; $thumb_height = 150; $width = imagesx($image); $height = imagesy($image); $original_aspect = $width / $height; $thumb_aspect = $thumb_width / $thumb_height; if ( $original_aspect >= $thumb_aspect ) { // If image is wider than thumbnail (in aspect ratio sense) $new_height = $thumb_height; $new_width = $width / ($height / $thumb_height); } else { // If the thumbnail is wider than the image $new_width = $thumb_width; $new_height = $height / ($width / $thumb_width); } $thumb = imagecreatetruecolor( $thumb_width, $thumb_height ); // Resize and crop imagecopyresampled($thumb, $image, 0 - ($new_width - $thumb_width) / 2, // Center the image horizontally 0 - ($new_height - $thumb_height) / 2, // Center the image vertically 0, 0, $new_width, $new_height, $width, $height); imagejpeg($thumb, $filename, 80); 

Not tested this, but it should work.

EDIT

Now tested and working.

+119
Dec 06 '09 at 17:55
source share

imagecopyresampled() will take a rectangular area from $src_image with a width of $src_w and a height of $src_h at position ($src_x, $src_y) and place it in a rectangular area of $dst_image with a width of $dst_w and a height of $dst_h at position ($dst_x, $dst_y) .

If the source and target coordinates, width and height are different, the corresponding stretching or compression of the image fragment will be performed. Coordinates refer to the upper left corner.

This function can be used to copy areas within a single image. But if the areas overlap, the results will be unpredictable.

- Change -

If $src_w and $src_h less than $dst_w and $dst_h respectively, the thumb image will be enlarged. Otherwise, it will be reduced.

 <?php $dst_x = 0; // X-coordinate of destination point $dst_y = 0; // Y-coordinate of destination point $src_x = 100; // Crop Start X position in original image $src_y = 100; // Crop Srart Y position in original image $dst_w = 160; // Thumb width $dst_h = 120; // Thumb height $src_w = 260; // Crop end X position in original image $src_h = 220; // Crop end Y position in original image // Creating an image with true colors having thumb dimensions (to merge with the original image) $dst_image = imagecreatetruecolor($dst_w, $dst_h); // Get original image $src_image = imagecreatefromjpeg('images/source.jpg'); // Cropping imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); // Saving imagejpeg($dst_image, 'images/crop.jpg'); ?> 
+13
Aug 13 '12 at 10:38
source share

php 5.5 has an imagecrop function http://php.net/manual/en/function.imagecrop.php

+1
Mar 26 '16 at 14:22
source share

Improved image cropping functionality in PHP on the fly.

 http://www.example.com/cropimage.php?filename=a.jpg&newxsize=100&newysize=200&constrain=1 

Code in cropimage.php

 $basefilename = @basename(urldecode($_REQUEST['filename'])); $path = 'images/'; $outPath = 'crop_images/'; $saveOutput = false; // true/false ("true" if you want to save images in out put folder) $defaultImage = 'no_img.png'; // change it with your default image $basefilename = $basefilename; $w = $_REQUEST['newxsize']; $h = $_REQUEST['newysize']; if ($basefilename == "") { $img = $path . $defaultImage; $percent = 100; } else { $img = $path . $basefilename; $len = strlen($img); $ext = substr($img, $len - 3, $len); $img2 = substr($img, 0, $len - 3) . strtoupper($ext); if (!file_exists($img)) $img = $img2; if (file_exists($img)) { $percent = @$_GET['percent']; $constrain = @$_GET['constrain']; $w = $w; $h = $h; } else if (file_exists($path . $basefilename)) { $img = $path . $basefilename; $percent = $_GET['percent']; $constrain = $_GET['constrain']; $w = $w; $h = $h; } else { $img = $path . 'no_img.png'; // change with your default image $percent = @$_GET['percent']; $constrain = @$_GET['constrain']; $w = $w; $h = $h; } } // get image size of img $x = @getimagesize($img); // image width $sw = $x[0]; // image height $sh = $x[1]; if ($percent > 0) { // calculate resized height and width if percent is defined $percent = $percent * 0.01; $w = $sw * $percent; $h = $sh * $percent; } else { if (isset ($w) AND !isset ($h)) { // autocompute height if only width is set $h = (100 / ($sw / $w)) * .01; $h = @round($sh * $h); } elseif (isset ($h) AND !isset ($w)) { // autocompute width if only height is set $w = (100 / ($sh / $h)) * .01; $w = @round($sw * $w); } elseif (isset ($h) AND isset ($w) AND isset ($constrain)) { // get the smaller resulting image dimension if both height // and width are set and $constrain is also set $hx = (100 / ($sw / $w)) * .01; $hx = @round($sh * $hx); $wx = (100 / ($sh / $h)) * .01; $wx = @round($sw * $wx); if ($hx < $h) { $h = (100 / ($sw / $w)) * .01; $h = @round($sh * $h); } else { $w = (100 / ($sh / $h)) * .01; $w = @round($sw * $w); } } } $im = @ImageCreateFromJPEG($img) or // Read JPEG Image $im = @ImageCreateFromPNG($img) or // or PNG Image $im = @ImageCreateFromGIF($img) or // or GIF Image $im = false; // If image is not JPEG, PNG, or GIF if (!$im) { // We get errors from PHP ImageCreate functions... // So let echo back the contents of the actual image. readfile($img); } else { // Create the resized image destination $thumb = @ImageCreateTrueColor($w, $h); // Copy from image source, resize it, and paste to image destination @ImageCopyResampled($thumb, $im, 0, 0, 0, 0, $w, $h, $sw, $sh); //Other format imagepng() if ($saveOutput) { //Save image $save = $outPath . $basefilename; @ImageJPEG($thumb, $save); } else { // Output resized image header("Content-type: image/jpeg"); @ImageJPEG($thumb); } } 
+1
Feb 14 '19 at 12:24
source share
 $image = imagecreatefromjpeg($_GET['src']); 

Need to replace with this:

 $image = imagecreatefromjpeg('images/thumbnails/myimage.jpg'); 

Because imagecreatefromjpeg() expects a string.
It worked for me.

link
http://php.net/manual/en/function.imagecreatefromjpeg.php

0
Apr 24 '13 at 19:57
source share

Is there a way to "scale the image."

For a smaller server / PHP approach, here is the jQuery plugin .

You can make all the necessary adjustments - scaling and aspect ratio, view - on the client side and send the end positions and the size of the cropped area to the server side for final manipulation and saving. docs say pretty much so you can swing.

0
Jul 05 '16 at 8:11
source share

HTML Code: -

 enter code here <!DOCTYPE html> <html> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> Select image to upload: <input type="file" name="image" id="fileToUpload"> <input type="submit" value="Upload Image" name="submit"> </form> </body> </html> 

upload.php

 enter code here <?php $image = $_FILES; $NewImageName = rand(4,10000)."-". $image['image']['name']; $destination = realpath('../images/testing').'/'; move_uploaded_file($image['image']['tmp_name'], $destination.$NewImageName); $image = imagecreatefromjpeg($destination.$NewImageName); $filename = $destination.$NewImageName; $thumb_width = 200; $thumb_height = 150; $width = imagesx($image); $height = imagesy($image); $original_aspect = $width / $height; $thumb_aspect = $thumb_width / $thumb_height; if ( $original_aspect >= $thumb_aspect ) { // If image is wider than thumbnail (in aspect ratio sense) $new_height = $thumb_height; $new_width = $width / ($height / $thumb_height); } else { // If the thumbnail is wider than the image $new_width = $thumb_width; $new_height = $height / ($width / $thumb_width); } $thumb = imagecreatetruecolor( $thumb_width, $thumb_height ); // Resize and crop imagecopyresampled($thumb, $image, 0 - ($new_width - $thumb_width) / 2, // Center the image horizontally 0 - ($new_height - $thumb_height) / 2, // Center the image vertically 0, 0, $new_width, $new_height, $width, $height); imagejpeg($thumb, $filename, 80); echo "cropped"; die; ?> 
0
Dec 21 '16 at 16:13
source share

You can use the imagecrop function in (PHP 5> = 5.5.0, PHP 7)

Example:

 <?php $im = imagecreatefrompng('example.png'); $size = min(imagesx($im), imagesy($im)); $im2 = imagecrop($im, ['x' => 0, 'y' => 0, 'width' => $size, 'height' => $size]); if ($im2 !== FALSE) { imagepng($im2, 'example-cropped.png'); imagedestroy($im2); } imagedestroy($im); ?> 
0
05 Sep '19 at 16:07 on
source share
 $image = imagecreatefromjpeg($_GET['src']); $filename = 'images/cropped_whatever.jpg' 

Must be replaced by:

 $image = imagecreatefromjpeg($_GET['src']); 

Then it will work!

-one
Sep 19 2018-11-11T00:
source share



All Articles