0

イメージがあります。そのサイズを正確に 500x250 にしたい。画像の比率も維持したい。したがって、私の計画は、サイズを変更してからトリミングすることでした。画像のサイズを変更するための私のコードを以下に示します。

$config['image_library'] = 'gd2';
$config['source_image'] = './pictures/'.$pic_name;
$config['maintain_ratio'] = TRUE;
$config['width'] = 500;
$this->load->library('image_lib', $config);
$this->image_lib->resize();

サイズを変更すると、画像のサイズは 500x768 になります。それから私はそれをトリミングしようとしています。トリミングのコードを以下に示します。

$config['image_library'] = 'gd2';
$config['source_image'] = './pictures/'.$pic_name;
$config['x_axis'] = '0';
$config['y_axis'] = '0';
$config['height'] = 250;
$config['width'] = 500;
$this->image_lib->initialize($config); 
$this->image_lib->crop();

現在、画像のサイズは 163x250 になっています。コードの何が問題なのかわかりません。

4

2 に答える 2

1

あなたが何をしているのかimage_libはわかりませんが、サイズ変更時に必要なサイズよりもアスペクト比が小さくなることを考慮していないと思います。

次のような画像があるとします: 1000 x 300

リサイズすると500×150になります(縦横比を維持しているため)

500 x 250 としてトリミングすると、サイズが異なるか、画像が歪んでしまいます。

あなたがする必要があるのは、どちら側(高さまたは幅)の値が小さいかを動的に決定し、アスペクト比を維持してその側にサイズ変更してからトリミングすることです。このようにして、画像には、前述のサイズでトリミングするのに十分なコンテンツが常に含まれます。

于 2013-05-02T18:25:15.070 に答える
0

画像ライブラリは私に多くの頭痛の種をもたらしました. それが悪いからではなく、それを使って何か新しいことをしようとするたびに、それがどのように機能するかを再学習しなければならないからです. 少なくとも私にとっては、ドキュメントは少しわかりにくいです。

最初は、トリミングする前にサイズを変更する方が理にかなっているとも思いました。正確な理由は覚えていませんが、後で反対のことをしたほうがよいことがわかりました。私はそれについて誤解しているかもしれませんが、私のコードは今では問題なく動作するので、その戦略に固執するつもりです。

私が重要だと思うもう 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();
}
于 2013-05-03T13:23:18.213 に答える