0

jcropユーザーが自分の画像のサムネイルを作成できるようにするために使用しようとしています190x190 pixels.

jcrop動作しているようで、正しい座標を送信してくれます。しかし、imagecopyresampled非常に予測不可能な動作をしているようで、期待どおりの結果が得られません。これが私のコードです:

$destWidth = $destHeight = 190;
$jpeg_quality = 90;
$path = Yii::app()->basePath."/../images/user/";
$src = $path.$model->image;

$img_src = imagecreatefromjpeg($src);
$img_dest = ImageCreateTrueColor( $destWidth, $destHeight );

imagecopyresampled(
$img_dest, //destination image
$img_src, //source image
0, //top left coordinate of the destination image in x direction
0, //top left coordinate of the destination image in y direction
$_POST['x'], //top left coordinate in x direction of source image that I want copying to start at
$_POST['y'], //top left coordinate in y direction of source image that I want copying to start at
$destWidth, //190, thumbnail width
$destHeight, //190, thumbnail height
$_POST['w'], //how wide the rectangle from the source image we want thumbnailed is
$_POST['h'] //how high the rectangle from the source image we want thumbnailed is
);

imagejpeg($img_dest,$path."thumbs/test.jpg",$jpeg_quality);

私は真剣に途方に暮れています.4つの$_POST変数がすべて正しく入っていることを確認しましたが、何らかの理由で適切なサムネイルを取得できません. 私が確かに言えることは、サムネイルが通常ズームインしすぎていることと、開始​​したい左上隅が使用されていないことです。

4

1 に答える 1

4

これが私の最終的なソースコードです。CSS が最大高さ 550px と最大幅 700px を許可しているため、CSS がコードと競合していることがわかりました。これにより、大きな画像の幅や高さが正しくありませんでした。したがって、これらの場合、画像の縦横比と、CSS によるサイズ変更方法に基づいて乗数を追加する必要がありました。

        $destWidth = $destHeight = 190;
        $jpeg_quality = 90;

        $path = Yii::app()->basePath."/../images/user/";
        $src = $path.$model->image;
        $img_src = imagecreatefromjpeg($src);
        $img_dest = ImageCreateTrueColor( $destWidth, $destHeight );

        //
        // IMPORTANT!! 
        // If you change the max-width or max-height in the css, you MUST change them here too!!
        //
        $maxWidth = 700;
        $maxHeight = 550;

        $srcWidth = imagesx($img_src);
        $srcHeight = imagesy($img_src);
        $srcRatio = $srcWidth/$srcHeight;
        $mult = 1;

        //if the image is wider than the max allowed width AND has a wider aspect ratio than a max height + max width image
        if ($srcWidth > $maxWidth && $srcRatio > $maxWidth/$maxHeight) {
            $mult = $srcWidth/$maxWidth;
        //else if the image is taller than the max height
        } else if ($srcHeight > $maxHeight) {
            $mult = $srcHeight/$maxHeight;
        }

        imagecopyresampled(
            $img_dest, //destination image
            $img_src, //source image
            0, //top left coordinate of the destination image in x direction
            0, //top left coordinate of the destination image in y direction
            $_POST['x']*$mult, //top left coordinate in x direction of source image that I want copying to start at
            $_POST['y']*$mult, //top left coordinate in y direction of source image that I want copying to start at
            $destWidth, //190, thumbnail width
            $destHeight, //190, thumbnail height
            $_POST['w']*$mult, //how wide the rectangle from the source image we want thumbnailed is
            $_POST['h']*$mult //how high the rectangle from the source image we want thumbnailed is
        );

        imagejpeg($img_dest,$path."thumbs/$model->image",$jpeg_quality);
于 2013-03-15T02:36:27.983 に答える