我得到 exif 来读取上传图像的方向。问题是在某些图像中我收到此错误:
警告 exif_read_data(php3KLADx):第 5 行的 /home/i/public_html/orientation.php 中不支持文件
任何想法如何避免这种情况?
<?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);
}
}
?>
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法抑制警告的输出:
@exif_read_data($file_tmp)
当然,抑制警告并不是一个好主意,但似乎没有办法避免这个警告:没有函数可以在不尝试读取 EXIF 数据并收到警告的情况下测试 EXIF 数据的有效性。
我尝试测试
exif_imagetype($file_tmp)
但某些有效的图像类型可能具有或不具有可读的 EXIF 数据。PNG 就是其中之一:我发现一些示例,其中一个文件可以正常读取,但另一个文件发出警告。
你应该这样做,如下所示:
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);
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)