Php 在ImageMagick中合成时,顶层会旋转

Php 在ImageMagick中合成时,顶层会旋转,php,imagemagick,Php,Imagemagick,我正在使用PHP中的Imagick库对imagemagick进行一些图像处理。用户上传一张照片,我调整它的大小,然后使用compositeImage功能在上面放置一个透明的PNG层。代码大致如下所示: $image = new Imagick($imagepath); $overlay = new Imagick("filters/photo-filter-flat.png"); $geo = $image->getImageGeometry(); if ($geo['height']

我正在使用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度。我认为这与不同的文件格式有关,是否有一种公认的方法在合成图像之前对图像进行规格化以防止出现这种情况?

因此,问题在于exif方向值。这里有一些关于这个主题的好信息:

基本上,在合成图像之前,必须先解析图像的方向。PHP文档网站上的评论中有一个很好的功能:


那是。。。。奇怪的你确定他们一开始就不是这样旋转的吗。Ie也许exif数据有旋转,而你的图像查看器正在“修复”它?@Hamish+1很好。真正奇怪的是,不管我如何打开照片,照片总是方向正确的。我创建的PNG作为一个覆盖是什么得到旋转。。。有时候。发生这种情况的照片是从我的智能手机上创建的。奇怪。也许imagik正在用exif做一些聪明的事情。它有元数据吗?有一些元数据,与方向无关。看看这个:Photoshop“为Web保存”纠正了这个问题。使用Imagick“stripImage”函数可以使图像旋转,并使覆盖正确定向。我觉得我在服用疯狂的药丸,我相信熟悉图像格式的人可以在2秒钟内告诉我这个问题是什么。
// 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); 
}