Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Crop image in PHP

Tags:

php

crop

gd

The code below crops the image well, which is what i want, but for larger images, it wotn work as well. Is there any way of 'zooming out of the image'

Idealy i would be able to have each image roughly the same size before cropping so that i would get good results each time

Code is

<?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>'; 
like image 669
user195257 Avatar asked Dec 06 '09 17:12

user195257


People also ask

How do I crop an image using HTML?

If your image doesn't fit the layout, you can resize it in the HTML. One of the simplest ways to resize an image in the HTML is using the height and width attributes on the img tag. These values specify the height and width of the image element. The values are set in px i.e. CSS pixels.


2 Answers

If you are trying to generate 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 the corresponding side of the thumb.

For example, if your source image is 1280x800px and your thumb is 200x150px, you must resize your image to 240x150px and then crop it to 200x150px. This is so that the aspect ratio of the image won't change.

Here's 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); 

Haven't tested this but it should work.

EDIT

Now tested and working.

like image 66
Tatu Ulmanen Avatar answered Sep 29 '22 18:09

Tatu Ulmanen


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

If the source and destination coordinates and width and heights differ, appropriate stretching or shrinking of the image fragment will be performed. The coordinates refer to the upper left corner.

This function can be used to copy regions within the same image. But if the regions overlap, the results will be unpredictable.

- Edit -

If $src_w and $src_h are smaller than $dst_w and $dst_h respectively, thumb image will be zoomed in. Otherwise it will be zoomed out.

<?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'); ?> 
like image 26
Eranda Avatar answered Sep 29 '22 17:09

Eranda