你說得對,圖像處理類不支持這樣做。
但是,您可以擴展庫(底部爲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,您可能無法獲得所有的空白。
感謝您的幫助......我對我應該怎麼稱呼圖像和的時候有點困惑。我應該運行我在那裏,然後成功上傳運行操作類嗎?如果是,那麼我應該將它上傳到一個臨時文件夾,然後運行操作類,將它移動到正確的文件夾?謝謝你的幫助 – Claremont 2012-03-07 21:42:44
是的,當上傳成功時,在你的else {}中運行操作。我不確定是否有任何理由在兩者之間使用額外的臨時文件夾,除非您需要將未更改的圖像保存在其他地方。如果您將image_lib的source_image設置爲您的upload_path +在$ this-> upload-> data()和new_image中返回的'file_name',它將會覆蓋最初上傳的文件。 – Tjkoopa 2012-03-08 09:17:51