Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Crop whitespace from image in PHP

Tags:

php

image

crop

gd

Is it possible to remove the whitespace surrounding an image in PHP?

NOTE: to clarify I mean something like photoshops trim feature.

Thanks.

like image 831
usertest Avatar asked Nov 03 '09 19:11

usertest


People also ask

How to trim image in PHP?

PHP | imagecrop() Function The imagecrop() function is an inbuilt function in PHP which is used to crop an image to the given rectangle. This function crops an image to the given rectangular area and returns the resulting image.


1 Answers

To trim all whitespace, as you call it, surrounding the interesting part of the image, first we find out where the "whitespace" stops, and then we copy everything inside of those borders.

//load the image $img = imagecreatefromjpeg("http://ecx.images-amazon.com/images/I/413XvF0yukL._SL500_AA280_.jpg");  //find the size of the borders $b_top = 0; $b_btm = 0; $b_lft = 0; $b_rt = 0;  //top for(; $b_top < imagesy($img); ++$b_top) {   for($x = 0; $x < imagesx($img); ++$x) {     if(imagecolorat($img, $x, $b_top) != 0xFFFFFF) {        break 2; //out of the 'top' loop     }   } }  //bottom for(; $b_btm < imagesy($img); ++$b_btm) {   for($x = 0; $x < imagesx($img); ++$x) {     if(imagecolorat($img, $x, imagesy($img) - $b_btm-1) != 0xFFFFFF) {        break 2; //out of the 'bottom' loop     }   } }  //left for(; $b_lft < imagesx($img); ++$b_lft) {   for($y = 0; $y < imagesy($img); ++$y) {     if(imagecolorat($img, $b_lft, $y) != 0xFFFFFF) {        break 2; //out of the 'left' loop     }   } }  //right for(; $b_rt < imagesx($img); ++$b_rt) {   for($y = 0; $y < imagesy($img); ++$y) {     if(imagecolorat($img, imagesx($img) - $b_rt-1, $y) != 0xFFFFFF) {        break 2; //out of the 'right' loop     }   } }  //copy the contents, excluding the border $newimg = imagecreatetruecolor(     imagesx($img)-($b_lft+$b_rt), imagesy($img)-($b_top+$b_btm));  imagecopy($newimg, $img, 0, 0, $b_lft, $b_top, imagesx($newimg), imagesy($newimg));  //finally, output the image header("Content-Type: image/jpeg"); imagejpeg($newimg); 

My old example, that assumes an identical "border" on all sides of the image, just to clarify the comments :)

//load the image $img = imagecreatefromjpeg("img.jpg");  //find the size of the border. $border = 0; while(imagecolorat($img, $border, $border) == 0xFFFFFF) {   $border++; }  //copy the contents, excluding the border //This code assumes that the border is the same size on all sides of the image. $newimg = imagecreatetruecolor(imagesx($img)-($border*2), imagesy($img)-($border*2)); imagecopy($newimg, $img, 0, 0, $border, $border, imagesx($newimg), imagesy($newimg));  //finally, if you want, overwrite the original image imagejpeg($newimg, "img.jpg"); 
like image 85
gnud Avatar answered Sep 29 '22 05:09

gnud