4

私のプロジェクトには CodeIgniter の画像クロッパーがあり、picresize.comのように画像をトリミングします (私はjCropを使用しています)。以下に示すバニラコードでうまく機能します。

<?php
$save_to = $this->config->item('images_gallery_thumb_folder').$data['photo_image'];

$targ_w = $this->config->item('gallery_thumb_width');
$targ_h = $this->config->item('gallery_thumb_height');
$src = $this->config->item('images_gallery_folder').$data['photo_image'];

$types = array(1 => 'gif', 'jpeg', 'png');
list($width,$height,$type) = getimagesize($src);

switch ($types[$type]) {
    case 'jpeg':
        $img_r = imagecreatefromjpeg($src);
        break;
    case 'gif':
        $img_r = imagecreatefromgif($src);
        break;

    case 'png':
        $img_r = imagecreatefrompng($src);
        break;

    default:
        $img_r = imagecreatefromjpeg($src);
        break;
}

$dst_r = ImageCreateTrueColor($targ_w,$targ_h );

imagecopyresampled($dst_r,$img_r,0,0,$_POST['x'],$_POST['y'],
    $targ_w,$targ_h,$_POST['w'],$_POST['h']);


switch ($types[$type]) {
    case 'jpeg':
        imagejpeg($dst_r, $save_to, 90); //90 = jpeg quality
        break;
    case 'gif':
        imagegif($dst_r, $save_to);
        break;
    case 'png':
        imagepng($dst_r, $save_to);
        break;
    default:
        imagejpeg($dst_r, $save_to, 90); //90 = jpeg quality
        break;
}


imagedestroy($dst_r);
?>

しかし、私はこれを CodeIgniter の方法でやりたいと思っています。

これは私がこれまでに思いついたものです:

<?php
$img_config = array(
    'source_image'      => $src,
    'new_image'         => $save_to,
    'maintain_ratio'    => false,
    'width'             => $targ_w,
    'height'            => $targ_h,
    'x_axis'            => $_POST['x'],
    'y_axis'            => $_POST['y']
);

$this->load->library('image_lib',$img_config);
//$this->image_lib->resize();
$this->image_lib->crop();
?>

問題は、位置からトリミングされますが、サイズが変更されないことです (より大きなトリミング スクエアを設定したと考えてください)。指定された位置からのみトリミングします。

プロジェクトでimage_mooライブラリも使用していますが、それも成功しませんでした。

編集: Image_mooで、これまでに思いついたコードは次のとおりです。

$this->image_moo
                ->load($src)
                ->crop($_POST['x'],$_POST['y'],($_POST['x']+$_POST['w']),($_POST['y']+$_POST['h']))
                ->resize($targ_w,$targ_h)
                ->save($save_to,true);

問題は、サイズ変更パラメーターを使用すると、トリミング ラインが完全に無視され、画像全体のサイズが変更されることです。前にサイズを変更し、後でクロップを呼び出すと、失敗します。image_moo 呼び出しを 2 回使用することで解決できますが、これは好ましくありません。

これも機能しません:

$this->image_moo
                ->load($src)
                ->crop($_POST['x'],$_POST['y'],($_POST['x']+$_POST['w']),($_POST['y']+$_POST['h']))
                //->resize($targ_w,$targ_h)
                ->save($save_to,true)
                ->resize($targ_w,$targ_h)
                ->save($save_to,true);

例: このように動作します:

$this->image_moo
                ->load($src)
                ->crop($_POST['x'],$_POST['y'],($_POST['x']+$_POST['w']),($_POST['y']+$_POST['h']))
                //->resize($targ_w,$targ_h)
                ->save($save_to,true);
            $this->image_moo
                ->load($save_to)
                ->resize($targ_w,$targ_h)
                ->save($save_to,true);

では、image_moo または CI image_lib を 1 回呼び出して、CodeIgniter (または image_moo) の方法で指定された x/y オフセットでサイズ変更 + クロップするにはどうすればよいですか?

おそらく、なぜ私がそれを 2 回呼び出すことを懸念しているのかと尋ねているはずです。うーん、PQが重要で、2回呼び出すと画質が落ちてしまうので気になります。

前もって感謝します、

4

1 に答える 1

8

指定された Codeigniter コードは、1 つのロジックを除いて問題ありません。同じ画像ファイルを 2 回操作して出力しているため、出力ファイルは元のファイルへの最後の変更によって上書きされます。

各操作は個別に行われるため、これは CI の Image_Lib クラスの制限であると思います。「サイズ変更とトリミング」を一度に行う方法はありません。

最後の操作の出力ファイルで次のアクションが確実に呼び出されるように、各アクションの間に Image_Lib クラスを再初期化する必要があります。

$img_config = array(
    'source_image'      => $src,
    'new_image'         => $save_to,
    'maintain_ratio'    => false,
    'width'             => $targ_w,
    'height'            => $targ_h,
    'x_axis'            => $_POST['x'],
    'y_axis'            => $_POST['y']
);

$this->load->library('image_lib', $img_config);
$this->image_lib->resize();

// Now change the input file to the one that just got resized
// See also $this->image_lib->clear()
$img_config['source_image'] = $save_to;
$this->image_lib->initialize($img_config); 

$this->image_lib->crop();

2 つの異なる構成配列を使用することもできます。

$this->load->library('image_lib');

$this->image_lib->initialize(array(
    'source_image'      => $src,
    'new_image'         => $save_to,
    'maintain_ratio'    => false,
    'width'             => $targ_w,
    'height'            => $targ_h,
));
$this->image_lib->resize();

$this->image_lib->clear();

$this->image_lib->initialize(array(
    'source_image'      => $save_to,
    'x_axis'            => $_POST['x'],
    'y_axis'            => $_POST['y']
));
$this->image_lib->crop();

または、最初にイメージ ファイルのコピーを作成してから、イメージ ライブラリ クラスを呼び出すたびにそれを操作することもできますsource_image

copy($src, $save_to);
$this->load->library('image_lib', array(
    'source_image'      => $save_to,
    'maintain_ratio'    => false,
    'width'             => $targ_w,
    'height'            => $targ_h,
    'x_axis'            => $_POST['x'],
    'y_axis'            => $_POST['y']
));
$this->image_lib->resize();
$this->image_lib->crop();
于 2012-11-30T20:50:36.713 に答える