2

PHP で Imagick ライブラリを使用して、imagemagick で画像操作を行っています。ユーザーが写真をアップロードし、サイズを変更してから、compositeImage 関数を使用してその上に透明な PNG レイヤーを配置します。コードはおおよそ次のようになります。

$image = new Imagick($imagepath);
$overlay = new Imagick("filters/photo-filter-flat.png");

$geo = $image->getImageGeometry();

if ($geo['height'] > $geo['width']) {
    $image->scaleImage(0, 480);
} else {
    $image->scaleImage(320, 0);
}

$image->compositeImage($overlay, imagick::COMPOSITE_ATOP, 0, 0);

return $image;

奇妙なことに、一部の写真では、オーバーレイを上に配置すると、オーバーレイが 90 度回転します。これはさまざまなファイル形式に関係していると思いますが、これを防ぐために画像を合成する前に画像を正規化する方法はありますか?

4

1 に答える 1

0

したがって、問題はexifの向きの値であることがわかりました。このトピックに関する一般的な情報は、http ://www.daveperrett.com/articles/2012/07/28/exif-orientation-handling-is-a-ghetto/ にあります。

基本的に、合成する前に画像の向きを解決する必要があります。PHP ドキュメンテーション サイトのコメントに優れた関数があります: http://www.php.net/manual/en/imagick.getimageorientation.php

// Note: $image is an Imagick object, not a filename! See example use below. 
    function autoRotateImage($image) { 
    $orientation = $image->getImageOrientation(); 

    switch($orientation) { 
        case imagick::ORIENTATION_BOTTOMRIGHT: 
            $image->rotateimage("#000", 180); // rotate 180 degrees 
        break; 

        case imagick::ORIENTATION_RIGHTTOP: 
            $image->rotateimage("#000", 90); // rotate 90 degrees CW 
        break; 

        case imagick::ORIENTATION_LEFTBOTTOM: 
            $image->rotateimage("#000", -90); // rotate 90 degrees CCW 
        break; 
    } 

    // Now that it's auto-rotated, make sure the EXIF data is correct in case the EXIF gets saved with the image! 
    $image->setImageOrientation(imagick::ORIENTATION_TOPLEFT); 
} 
于 2013-07-15T16:41:41.410 に答える