ImageMagick 和 PHP 正确旋转图像

Posted

技术标签:

【中文标题】ImageMagick 和 PHP 正确旋转图像【英文标题】:ImageMagick and PHP to properly rotate an image 【发布时间】:2017-02-09 18:59:26 【问题描述】:

我正在尝试在我的 php 代码中使用 Imagick 来正确定位图像,这样我就可以从它们中剥离元数据并让它们正确显示。我尝试了这篇文章中的方法:

Detect EXIF Orientation and Rotate Image using ImageMagick

但它不起作用。使用该帖子中的自动旋转功能,这就是我正在做的事情:

$working_image = new \Imagick();
$working_image->readImageBlob( $source_data);
$working_image->setImageFormat('jpeg');
autorotate($working_image);

... some resizing code:
$working_image->resizeImage( $width, $height, \Imagick::FILTER_CATROM, .7);

// get rid of metadata
$working_image->stripImage();

$working_image->writeImage( <unique filename> );

$working_image->getImageBlob();
... write out to data file to google

我们使用 Google 的云服务来存储我们的文件,因此调用了“getImageBlob”。

问题是这似乎不起作用。生成的图像仍然以相同的方式定向,但现在没有元数据,因此标签不会“修复”它们。

我在这里做错了什么?我正在使用这个版本的 Imagick PHP 对象:

[版本号] => 1673 [versionString] => ImageMagick 6.8.9-9 Q16 x86_64 2015-01-05 http://www.imagemagick.org

回应您的回答:

感谢您的澄清。查看我遇到问题的特定图像之一, identify -verbose 显示定义方向的多个位置:

Orientation: RightTop
exif:Orientation: 6
exif:thumbnail:Orientation: 6

这反映在我在 PHP 中对 Imagick::getImageOrientation 的调用中,它返回“6”值,然后导致我的代码调用诸如“Imagick::rotateImage("#000", 180);"之类的函数.问题是这些调用不会改变图像。 8-(

核心问题是:我们每天从全国各地的 MLS 获得成千上万的这些图像。我们目前通过自动流程处理它们(当前调整大小)。当它们显示在我们的网站上时,目前一切正常,因为&lt;img> 标签似乎很乐意解释 EXIF 数据并以正确的方向显示图像。但是...我们想开始优化图像,这意味着去除 EXIF 信息。所以我需要弄清楚为什么 Imagick->rotateImage() 不起作用。

【问题讨论】:

见-auto-orient - 是什么告诉你图片中的EXIF配置文件? 嗯,有自动定向.. 但是我如何从 PHP 和 Imagick 对象中调用它呢?这是一个批处理功能,目前每天处理(调整大小)数万张图像。我正在尝试扩展此处理以修复图像方向。至于 EXIF 是如何进入图像的——我猜是从正在使用的任何相机——在我现在使用的测试图像的情况下,三星 SM-G900V。但我无法控制 - 这些图像是从全国的房地产经纪人那里收到的,可能涉及数千个摄像头。 不确定是不是拼写错误,但是对于方向 6(RightTop),预期的旋转调用应该是 $image-&gt;rotateImage("#000", 90); 而不是 180。如果是拼写错误,使用 cmdline convert input.jpg -rotate 90 out.jpg 是否有效? 【参考方案1】:

好的,让我们写一个完整的答案:)

我对 ImageMagick 的-auto-orient 的链接的意思是要指出,这种自动定位取决于 EXIF 配置文件和“方向”设置。如果它丢失或错误,自动定向将无法按预期工作。要检查您的图像是否具有完整的方向的 EXIF 配置文件,您可以使用以下几种方法:

PHP Imagick(在调用 -&gt;stripImage() 之前检查图像)

echo 'Orientation is: ', $working_image->getImageOrientation();

PHP(如果你有本地文件)

$exif = exif_read_data('input.jpg');
echo 'Orientation is: ', isset($exif['Orientation']) ? $exif['Orientation'] : 'missing';

在线EXIF reader.

您获得的值描述为例如here 或更多关于图像自动旋转主题的信息,示例图像为here

或者您可以使用 Gimp 或 Photoshop 等程序。

所以你没有做错任何事,没有 EXIF 这将无法工作。将标签写入图像的是相机,因此不能保证您的所有照片都有它。

也许改为为您网站中的访问者提供图像旋转?现在有了 CSS3 transform: rotate(deg) 属性,这让它变得非常简单,see....

【讨论】:

附加信息:昨天,我们的流程处理了 240 万张图像。幸运的是,它们中的大多数都是正面朝上的。 8-)【参考方案2】:

我们可以通过Imagick获取当前的图像方向,并可以轻松更新到原来的方向

public function fix_image_orientation()
    
        $working_image = new \Imagick();
        $working_image->readImageBlob($source_data);
        $working_image->setImageFormat('jpeg');
        $orientation = $working_image->getImageOrientation();
        if (!empty($orientation)) 
            switch ($orientation) 
                case imagick::ORIENTATION_BOTTOMRIGHT:
                    $working_image->rotateimage("#000", 180);
                    break;

                case imagick::ORIENTATION_RIGHTTOP:
                    $working_image->rotateimage("#000", 90);
                    break;

                case imagick::ORIENTATION_LEFTBOTTOM:
                    $working_image->rotateimage("#000", -90);
                    break;
            
        
        $working_image->setImageOrientation(imagick::ORIENTATION_TOPLEFT);
        $working_image->writeImage( <unique filename> );
    

【讨论】:

以上是关于ImageMagick 和 PHP 正确旋转图像的主要内容,如果未能解决你的问题,请参考以下文章

imagemagick 旋转图像10°时超出的部分填充为黑色要修改成白色该怎样

Imagemagick 旋转透明图像上不需要的黑色背景

ImageMagick:将一张图像的 4 个边缘并排合成到另一张图像中

我可以 3d 将 Y 轴上的图像从 php 旋转 10-15 度吗?

php imagemagick可以去水印吗

ImageMagick PHP - 在图像上扭曲文本和注释