2

Web サイト用の単純な画像トリミング ユーティリティを構築しています。

私は小さな問題を抱えています:それを行うたびに歪みがあります(私の選択座標は大まかに推定されるため、たとえば、画像が間違った寸法で描画されます)。

私が言いたいことを理解してもらうために、これをスケッチしました。

ここに画像の説明を入力

私が達成しようとしていることを理解するのに役立つコードを次に示します。

    //Get the new coordinates to crop the image.
    $x1 = $request->getPost('x1');
    $y1 = $request->getPost('y1');
    $x2 = $request->getPost('x2');
    $y2 = $request->getPost('y2');
    $w = $request->getPost('w');
    $h = $request->getPost('h');

    $croptool_width = $request->getPost('croptool_width');
    $croptool_height = $request->getPost('croptool_height');

    $original_width = $request->getPost('original_width');
    $original_height = $request->getPost('original_height');

    $infos = pathinfo($original_image_location);
    $extension = strtolower($infos['extension']);

    switch($extension) {
        case 'gif':
            $sourceImage = imagecreatefromgif($original_image_location);
            break;
        case 'jpg':
        case 'jpeg':
            $sourceImage = imagecreatefromjpeg($original_image_location);
            break;
        case 'png':
            $sourceImage = imagecreatefrompng($original_image_location);
            break;
    }

    // Take croptool's dimension, transpose selection coordinates to fit the original image.
    $scale_y = $original_height / $croptool_height;
    $scale_x = $original_width / $croptool_width;

    $scaled_x1 = $x1 * $scale_x;
    $scaled_y1 = $y1 * $scale_y;
    $scaled_x2 = $x2 * $scale_x;
    $scaled_y2 = $y2 * $scale_y;

    // Crop selection and save to disk
    $cropImage = imagecreatetruecolor(Model_Wineries::getCoverImageWidth(), Model_Wineries::getCoverImageHeight());

    imagecopyresampled(
        $cropImage, $sourceImage, 
        0, 0, 
        $scaled_x1, $scaled_y1,
        Model_Wineries::getLogoImageWidth(), Model_Wineries::getLogoImageHeight(), 
        $scaled_x2, $scaled_y2
    );

    if (file_exists($cover_image_location))
        unlink($cover_image_location);

    imagejpeg($cropImage, $cover_image_location, 90);

    chmod($cover_image_location, 0777);

    if (file_exists($original_image_location))
        unlink($original_image_location);

私が理解するのに苦労している部分は、$scale変数を適切に計算する方法です。

$croptool_width と $croptool_height は両方とも縮小された寸法です。$original_... はオリジナルのものです。

誰か助けてくれませんか?

編集:提案された応答は良いですが、何らかの理由で何かが完全にうまくいかない場合は、ここを見てください:

ここに画像の説明を入力

編集:(コードが更新されました)

ありがとう!

4

3 に答える 3

1

私の誤解かもしれませんが、「スケール」ではなく「割合」を計算していると思います。スケールは元の寸法と新しい寸法の製品です。多分:

    $scale_y = $original_height / $croptool_height;
$scale_x = $original_width / $croptool_width;

$scaled_x1 = $x1 * $scale_x;
$scaled_y1 = $y1 * $scale_y;
$scaled_x2 = $x2 * $scale_x;
$scaled_y2 = $y2 * $scale_y;


//Original height = 1000 and Croptool height = 100 ==> scale_y = 10; Pixel (0, 45) on crop space == 45 * 10 == 450 on original image.
//Original height = 100 and Croptool height = 1000 ==> scale_y = 0.10; Pixel (0, 450) on crop space == 450 * 0.10 == 45 on original image.

お役に立てれば。

編集:

私は PHP API に詳しくありませんが、提供されたソースの幅とソースの高さが間違っているようです。次のように計算できるかもしれません。

 imagecopyresampled(
    $cropImage, $sourceImage, 
    0, 0, 
    $scaled_x1, $scaled_y1,
    Model_Wineries::getLogoImageWidth(), Model_Wineries::getLogoImageHeight(), 
    $scaled_x2 - $scaled_x1, $scaled_y2 - $scaled_y1
);
于 2013-09-04T20:28:43.917 に答える
0

これを試すことができます:

original width * new height / original height = new width;

original height * new width / original width = new height;

[1]画像の幅と高さから縦横比を取得 (PHP or JS)

于 2013-09-04T21:58:07.080 に答える
0

これが完全な解決策かどうかはわかりませんが、ここに問題があります。

imagecopyresampled(
        $cropImage, $sourceImage, 
        0, 0, 
        $scaled_x1, $scaled_y1,
        Model_Wineries::getLogoImageWidth(), Model_Wineries::getLogoImageHeight(), 
        $scaled_x2, $scaled_y2
    );

この関数のphpドキュメントによると、最後の2つのパラメーターはソース画像の幅と高さである必要がありますが、代わりに座標を渡しています。したがって、$scaled_x2 の代わりに $scaled_x2-$scaled_x1 を渡し、$scaled_y2 の代わりに $scaled_y2-$scaled_y1 を渡します。

于 2013-09-09T05:38:18.260 に答える