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_... はオリジナルのものです。
誰か助けてくれませんか?
編集:提案された応答は良いですが、何らかの理由で何かが完全にうまくいかない場合は、ここを見てください:
編集:(コードが更新されました)
ありがとう!