画像ライブラリは私に多くの頭痛の種をもたらしました. それが悪いからではなく、それを使って何か新しいことをしようとするたびに、それがどのように機能するかを再学習しなければならないからです. 少なくとも私にとっては、ドキュメントは少しわかりにくいです。
最初は、トリミングする前にサイズを変更する方が理にかなっているとも思いました。正確な理由は覚えていませんが、後で反対のことをしたほうがよいことがわかりました。私はそれについて誤解しているかもしれませんが、私のコードは今では問題なく動作するので、その戦略に固執するつもりです。
私が重要だと思うもう 1 つのことは、'maintain_ratio' を FALSE に設定し、自分で計算を行うことです。
最近、サイズ変更のために関数を書き直しましたが、変数 $top_crop を除いて、ほとんど自明だと思います。これが私の「床屋」変数で、トップをどれだけ削るかを想定しようとします。構成ファイルの「設定」では、20 に設定しています。これは、トリミングされる合計量のうち、上部から 20% を取ることを意味します。つまり、100px をトリミングする場合、上から 20 ピクセル、下から 80 ピクセルを取得します。
とにかく、これが私のトリミング用のコードです。それを使用して、ニーズに合わせて調整できます。
function resize_img($data){
if ($data['width'] == 0 || $data['height'] == 0){
return FALSE;
}
$this->config->load('settings');
$ratio = $data['height']/$data['width'];
$targ_ratio = $data['max_ht']/$data['max_wd'];
$top_crop = $this->config->item('crop_top');
if ($targ_ratio >= $ratio){
//too wide
$crop_width = floor($data['height'] / $targ_ratio);
$crop_height = $data['height'];
} else {
//too tall
$crop_width = $data['width'];
$crop_height = floor($data['width'] * $targ_ratio);
}
$img_data = array( 'source_image' => $data['full_path'],
'maintain_ratio' => FALSE,
'x_axis' => round(($data['width'] - $crop_width)/2),
'y_axis' => round(($data['height'] - $crop_height)*$top_crop/100),
'width' => $crop_width,
'height' => $crop_height);
//thumbs have a target path
if ($data['target_path']){
$img_data['new_image'] = $data['target_path'];
//set source for the crop, because for thumbs it will be the thumb folder
$source = $data['target_path'].$data['file_name'];
} else {
$source = $data['full_path'];
}
$this->image_lib->clear();
$this->image_lib->initialize($img_data);
if ($this->image_lib->crop()){
$img_data = array( 'source_image' => $source,
'maintain_ratio' => FALSE,
'width' => $data['max_wd'],
'height' => $data['max_ht']);
$this->image_lib->clear();
$this->image_lib->initialize($img_data);
if($this->image_lib->resize()){
return array('height' => $data['max_ht'], 'width' => $data['max_wd']);
}
}
return $this->image_lib->display_errors();
}