Hatena::ブログ(Diary)

KuniTsujiのPHP開発日記

 | 

2009-03-23

CodeIgniterでのイメージ操作処理について

| 15:09

かなりご無沙汰なブログですが。

先日、CIでのファイルのアップの変更をかきましたが、WEBサイトでファイルアップで一番多いのが、なんと言っても画像関係だと思います。

CIでは、image_libという画像操作のライブラリがありますが、簡単なメソッドしかありません。

たとえば、リサイズ。

resize()メソッドがあるのですが、WIDTHとHEIGHT両方を指定しないと、デフォルトのファイルの幅になります。

しかし、実際に多いのは、

180X180ピクセルの幅に収まるようにすることが多いんじゃないでしょうか。

この場合、強制的に180X180で指定してしまうと、正方形の画像ならいいですが、まずそんなことはありません。

つまり、縦横、どちらかが180ピクセルに収まるように最適化する必要があるということです。

で、そんなあなたに(自分ですが)便利なヘルパーを作ってみました。

MYNETS_file_helper.phpとして、アプリケーションのhelpersディレクトリに保存します。

あ、通常はMYNETS_ではなく、MY_ですね。

かなり強制的なヘルパーにしているので、最適化する部分のコードのみ。

        $s_width  = $img_data['image_width'];
        $s_height = $img_data['image_height'];
        $w = PROFILE_IMAGE_WIDTH;
        $h = PROFILE_IMAGE_HEIGTH;
        
        if (!$w) $w = $s_width;
        if (!$h) $h = $s_height;

        // リサイズの必要がない場合
        if ($s_width <= $w && $s_height <= $h)
        {
            //そのまま
            $img_conf['width']  = $s_width;
            $img_conf['height'] = $s_height;
        }
        else
        {
            // 出力サイズ変更
            $o_width  = $s_width;
            $o_height = $s_height;

            if ($w < $s_width)
            {
                $o_width  = $w;
                $o_height = $s_height * $w / $s_width;
                if ( $o_height < 1 )
                {
                    $o_height = 1;
                }
            }
            if ($h < $o_height && $h < $s_height)
            {
                $o_width  = $s_width * $h / $s_height;
                $o_height = $h;
                if ( $o_width < 1 )
                {
                    $o_width = 1;
                }
            }
            
            $img_conf['width']  = $o_width;
            $img_conf['height'] = $o_height;
        }

PROFILE_IMAGE_WIDTH等の定数には、プロフィール用画像の最適ピクセルサイズを入れておきます。

$image_dataは、投稿されたファイルのデータです。

CIのuploadクラスを使った場合、

$image_data = $CI->upload->data('image_file');

こんな感じで取得できるはずです。

開設すると、もとファイルのサイズと、最適化したいサイズを用意し、

比較。

その後、楯が180なのか横が180で最適化されるのかを判断して、$img_conf配列に入れています。

で、その後に

$CI->load->library('image_lib', $img_conf);

$CI->image_lib->resize();

これで最適化された縦横180ピクセルに収まります。

トラックバック - http://d.hatena.ne.jp/KuniTsuji/20090323/1237788599
 | 
Connection: close