Crop whitespace from image in PHP

前端 未结 6 603
盖世英雄少女心
盖世英雄少女心 2020-11-28 04:43

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

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

Thanks.

6条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-28 05:13

    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");
    

提交回复
热议问题