web-dev-qa-db-ja.com

PHPでimagickを使用するにはどうすればよいですか? (サイズ変更と切り抜き)

私はサムネイルのトリミングにimagickを使用していますが、トリミングされたサムネイルに画像の上部(髪、目)が欠落していることがあります。

画像のサイズを変更してからトリミングすることを考えていました。また、画像サイズの比率を維持する必要があります。

以下は私が作物に使用するphpスクリプトです:

$im = new imagick( "img/20130815233205-8.jpg" );
$im->cropThumbnailImage( 80, 80 );
$im->writeImage( "thumb/th_80x80_test.jpg" );
echo '<img src="thumb/th_80x80_test.jpg">';

ありがとう。

15
newworroo

「重要な」パーツが常に同じ場所にあるとは限らないため、このタスクは簡単ではありません。それでも、このようなものを使用して

$im = new imagick("c:\\temp\\523764_169105429888246_1540489537_n.jpg");
$imageprops = $im->getImageGeometry();
$width = $imageprops['width'];
$height = $imageprops['height'];
if($width > $height){
    $newHeight = 80;
    $newWidth = (80 / $height) * $width;
}else{
    $newWidth = 80;
    $newHeight = (80 / $width) * $height;
}
$im->resizeImage($newWidth,$newHeight, imagick::FILTER_LANCZOS, 0.9, true);
$im->cropImage (80,80,0,0);
$im->writeImage( "D:\\xampp\\htdocs\\th_80x80_test.jpg" );
echo '<img src="th_80x80_test.jpg">';

(テスト済み)

うまくいくはずです。 cropImageパラメータ(0と0)は、トリミング領域の左上隅を決定します。したがって、これらをいじると、画像に残っているものについて異なる結果が得られます。

29
Martin Müller

Martinの回答 に基づいて、Imagick画像のサイズを変更してトリミングし、指定された幅と高さに合わせるより一般的な関数を作成しました(つまり、CSS background-size: cover宣言とまったく同じように動作します):

/**
 * Resizes and crops $image to fit provided $width and $height.
 *
 * @param \Imagick $image
 *   Image to change.
 * @param int $width
 *   New desired width.
 * @param int $height
 *   New desired height.
 */
function image_cover(Imagick $image, $width, $height) {
  $ratio = $width / $height;

  // Original image dimensions.
  $old_width = $image->getImageWidth();
  $old_height = $image->getImageHeight();
  $old_ratio = $old_width / $old_height;

  // Determine new image dimensions to scale to.
  // Also determine cropping coordinates.
  if ($ratio > $old_ratio) {
    $new_width = $width;
    $new_height = $width / $old_width * $old_height;
    $crop_x = 0;
    $crop_y = intval(($new_height - $height) / 2);
  }
  else {
    $new_width = $height / $old_height * $old_width;
    $new_height = $height;
    $crop_x = intval(($new_width - $width) / 2);
    $crop_y = 0;
  }

  // Scale image to fit minimal of provided dimensions.
  $image->resizeImage($new_width, $new_height, imagick::FILTER_LANCZOS, 0.9, true);

  // Now crop image to exactly fit provided dimensions.
  $image->cropImage($new_width, $new_height, $crop_x, $crop_y);
}

これが誰かを助けることを願っています。

5