ImageMagick和PHP正确旋转图像

pobjuy32  于 2022-11-28  发布在  PHP
关注(0)|答案(3)|浏览(134)

我尝试在我的php代码中使用Imagick来正确地定位图像,这样我就可以从它们中剥离元数据,并让它们正确地显示出来。
Detect EXIF Orientation and Rotate Image using ImageMagick
但是它不起作用。在那篇文章中使用autorotate函数,这就是我正在做的:

$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 [版本字符串] =〉ImageMagick 6.8.9-9第16季度x86_64 2015年1月5日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得到成千上万的图像。我们目前正在处理它们当它们显示在我们的网站上时,目前一切都很好,因为<img〉标签似乎很乐意解释EXIF数据并以正确的方向显示图像。但是...我们想开始优化图像,这意味着剥离EXIF信息。所以我需要弄清楚为什么Imagick-〉rotateImage()不起作用。

bfhwhh0e

bfhwhh0e1#

好的,让我们写一个完整的答案:)
我在ImageMagick的-auto-orient链接中的意思是指出,这种自动定向取决于EXIF配置文件和“方向”设置。如果它丢失或错误,自动定向将无法正常工作。要检查您的图像是否具有EXIF配置文件和“方向”,您可以使用以下几种方法:
PHP Imagick(在调用->stripImage()之前用image检查它)

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...

rslzwgfq

rslzwgfq2#

我们可以获得当前图像方向,并可以轻松地使用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> );
    }
zysjyyx4

zysjyyx43#

@Satendra Rawat给出了一个很好但不完整的答案。在GitHub库https://github.com/ianare/exif-samples中,你可以看到8个方向示例。只有3、5和8个正确。
以下是所有方向的更新:

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) {
            default:
            case imagick::ORIENTATION_TOPLEFT:
                break;
            case imagick::ORIENTATION_TOPRIGHT:
                $working_image->flipImage();
                $working_image->rotateImage("#000", 180);
                break;
            case imagick::ORIENTATION_BOTTOMRIGHT:
                $working_image->rotateImage("#000", 180);
                break;
            case imagick::ORIENTATION_BOTTOMLEFT:
                $working_image->flipImage();
                break;
            case imagick::ORIENTATION_LEFTTOP:
                $working_image->rotateImage("#000", -90);
                $working_image->flipImage();
                break;
            case imagick::ORIENTATION_RIGHTTOP:
                $working_image->rotateImage("#000", 90);
                break;
            case imagick::ORIENTATION_RIGHTBOTTOM:
                $working_image->rotateImage("#000", 90);
                $working_image->flipImage();
                break;
            case imagick::ORIENTATION_LEFTBOTTOM:
                $working_image->rotateImage("#000", -90);
                break;
        }
    }
    $working_image->setImageOrientation(imagick::ORIENTATION_TOPLEFT);
    $working_image->writeImage( <unique filename> );
}

相关问题