我在PHP中使用Imagick libray使用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度。我认为这与不同的文件格式有关,是否有一种可接受的方法来规范化图像,然后再将它们合成以防止这种情况?
答案 0 :(得分: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);
}