警告:exif_read_data(php3KLADx):文件不受支持,位于/home/i/public_html/orientation.php的第5行。

5

我使用exif读取上传图像的方向。

问题在于在某些图像中,我遇到了以下错误:

警告:exif_read_data(php3KLADx):文件不受支持,在/home/i/public_html/orientation.php的第5行

有什么办法可以避免这个问题吗?

<?php
function exif_orientation($file_tmp) {

$image = imagecreatefromstring(file_get_contents($file_tmp));
$exif = exif_read_data($file_tmp);

if(!empty($exif['Orientation'])) {
    switch($exif['Orientation']) {
        case 8:
            $image = imagerotate($image,90,0);
            break;
        case 3:
            $image = imagerotate($image,180,0);
            break;
        case 6:
            $image = imagerotate($image,-90,0);
            break;
    }
    imagejpeg($image, $file_tmp, 90);
}
}
?>
2个回答

5
您可以通过以下方式抑制警告输出: @exif_read_data($file_tmp) 当然,抑制警告并不是一个好主意,但似乎没有避免此警告的方法:没有函数可测试EXIF数据的有效性,而不是尝试读取它并获得警告。
我尝试使用exif_imagetype($file_tmp)进行测试,但某些有效的图像类型可能具有可读或不可读的EXIF数据。 PNG就是其中之一:我发现一个文件可以很好地读取,但另一个则会出现警告。

1
如果你预计会出现错误,请使用try-catch。不要使用@符号。 - Maarten
5
但是try-catch语句不能抑制警告。 在编程的30年中,我一直尽力遵循最佳实践(例如不抑制警告、不使用goto语句、永远不允许case语句贯穿到下一个语句),但这些规则有时也存在使用情况。 如果我违反了这些规则其中任何一个,我会添加代码注释以说明为什么这样做。这样当某个过于热心或过于资深的程序员将其更改为“正确”的方式时,我就知道是谁在程序停止工作时应该承担责任 :) - Peter Ford
2
今天遇到了这个问题,try catch不起作用,必须使用@。 - ganey

5
您应该按以下方式操作:
if (!function_exists('imageOrientation'))
{
function imageOrientation(string $directory)
{
    if(file_exists($directory))
    {
        $destination_extension = strtolower(pathinfo($directory, PATHINFO_EXTENSION));
        if(in_array($destination_extension, ["jpg","jpeg"]) && exif_imagetype($directory) === IMAGETYPE_JPEG)
        {
            if(function_exists('exif_read_data'))
            {
                $exif = exif_read_data($directory);
                if(!empty($exif) && isset($exif['Orientation']))
                {
                    $orientation = $exif['Orientation'];
                    switch ($orientation)
                    {
                        case 2:
                            $flip = 1;
                            $deg = 0;
                            break;
                        case 3:
                            $flip = 0;
                            $deg = 180;
                            break;
                        case 4:
                            $flip = 2;
                            $deg = 0;
                            break;
                        case 5:
                            $flip = 2;
                            $deg = -90;
                            break;
                        case 6:
                            $flip = 0;
                            $deg = -90;
                            break;
                        case 7:
                            $flip = 1;
                            $deg = -90;
                            break;
                        case 8:
                            $flip = 0;
                            $deg = 90;
                            break;
                        default:
                            $flip = 0;
                            $deg = 0;
                    }
                    $img = imagecreatefromjpeg($directory);
                    if($deg !== 1 && $img !== null)
                    {
                        if($flip !== 0)
                        {
                            imageflip($img,$flip);
                        }
                        $img = imagerotate($img, $deg, 0);
                        imagejpeg($img, $directory);
                    }
                }
            }
        }
    }
}
}

2
为什么要检查文件名扩展名?为什么使用魔数(例如2)而不是常量(例如IMG_FLIP_BOTH)?何时$deg !== 1会变成FALSE?为什么没有任何注释? - AmigoJack
你的建议中关键的部分是什么,据说可以避免OP所描述的问题? - Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接