2012-03-07 343 views
0

我使用的是上傳類CodeIgniter的隨附:笨裁剪圖像

$config['upload_path'] = getcwd() . '/public/images'; 
$config['allowed_types'] = 'gif|jpg|png'; 
$config['max_size'] = '100'; 
$config['max_width'] = '1024'; 
$config['max_height'] = '768'; 
$config['encrypt_name'] = true; 

$this->load->library('upload', $config); 

if (! $this->upload->do_upload()) 
{ 
    echo $error = array('error' => $this->upload->display_errors()); 

} 
else 
{ 
    echo $data = array('upload_data' => $this->upload->data()); 
} 

它工作正常上傳文件,但現在我想修剪掉圖像的所有多餘的空白。我看着圖像處理類,但似乎沒有這樣做。所以我環顧四周,發現這個Crop whitespace from image in PHP。我不確定如何將兩者結合在一起。有任何想法嗎?

回答

1

你說得對,圖像處理類不支持這樣做。

但是,您可以擴展庫(底部爲http://codeigniter.com/user_guide/general/creating_libraries.html),並根據您已找到的鏈接添加新方法。

在這裏,我的工作很無聊,延長CI的圖像處理lib和添加這個方法:

public function trim_whitespace($color = 'FFFFFF') 
{ 
    //load the image 
    $img = $this->image_create_gd(); 

    //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) != '0x'.$color) { 
       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) != '0x'.$color) { 
       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) != '0x'.$color) { 
       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) != '0x'.$color) { 
       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)); 

    // Output the image 
    if ($this->dynamic_output == TRUE) 
    { 
     $this->image_display_gd($newimg); 
    } 
    else 
    { 
     // Or save it 
     if (! $this->image_save_gd($newimg)) 
     { 
      return FALSE; 
     } 
    } 
} 

用法:

// load extended image lib 
$this->load->library('image_lib'); 

// configure image lib 
$config['image_library'] = 'gd2'; 
$config['source_image'] = 'path/to/source.img'; 
$config['new_image']  = 'path/to/output.img'; 

$this->image_lib->initialize($config); 
$this->image_lib->trim_whitespace('38ff7e'); // set colour to trim, defaults to white (ffffff) 
$this->image_lib->clear(); 

值得一提的是,即使它會工作,你真的不應該使用這個作爲dynamic_output,做保存修剪,否則它只會放慢一切。此外,它只是尋找1個顏色值(儘管這是來自您發佈的代碼的限制,可能會有更好的功能),所以如果它是一個壓縮的jpg,您可能無法獲得所有的空白。

+0

感謝您的幫助......我對我應該怎麼稱呼圖像和的時候有點困惑。我應該運行我在那裏,然後成功上傳運行操作類嗎?如果是,那麼我應該將它上傳到一個臨時文件夾,然後運行操作類,將它移動到正確的文件夾?謝謝你的幫助 – Claremont 2012-03-07 21:42:44

+0

是的,當上傳成功時,在你的else {}中運行操作。我不確定是否有任何理由在兩者之間使用額外的臨時文件夾,除非您需要將未更改的圖像保存在其他地方。如果您將image_lib的source_image設置爲您的upload_path +在$ this-> upload-> data()和new_image中返回的'file_name',它將會覆蓋最初上傳的文件。 – Tjkoopa 2012-03-08 09:17:51

0

要使用ImageMagick的,你應該將功能添加到image_lib.php:

public function trimimg() 
    { 
     $protocol = 'image_process_'.$this->image_library;  
     return $this->$protocol('trimimg'); 
    } 

,然後添加到函數

public function image_process_imagemagick($action = 'resize') 
    { 
     // Do we have a vaild library path?  
     if ($this->library_path === '') 
     { 
      $this->set_error('imglib_libpath_invalid'); 
      return FALSE; 
     } 

     if (! preg_match('/convert$/i', $this->library_path)) 
     { 
      $this->library_path = rtrim($this->library_path, '/').'/convert'; 
     } 

     // Execute the command 
     $cmd = $this->library_path.' -quality '.$this->quality; 

     if ($action === 'crop') 
     { 
      $cmd .= ' -crop '.$this->width.'x'.$this->height.'+'.$this->x_axis.'+'.$this->y_axis; 
     } 
     elseif ($action === 'rotate') 
     { 
      $cmd .= ($this->rotation_angle === 'hor' OR $this->rotation_angle === 'vrt') 
        ? ' -flop' 
        : ' -rotate '.$this->rotation_angle; 
     } 
     elseif ($action === 'trimimg') 
     { 
      $cmd .= ' -trim'; 
     } 

最後ELSEIF。

然後

$this->image_lib->trimimg())