首页  >  问答  >  正文

PHP 仅从图像中删除方向 exif(不使用 imagick)

我编写了一个脚本,可以在本地批量调整上传的图像大小并创建缩略图。问题是,如果某些图像是垂直方向的,但调整大小后它们会水平旋转。

这是由于图像的 exif 方向造成的。有没有一种简单的方法可以通过 PHP 从图像中删除方向 exif?我知道 Imagick 可以完成,但我不能/不想安装它。

没有它还有什么解决方案吗?

现在我正在通过在图像编辑器中打开这样的图像并重新保存它而不保留 exif 信息来解决这个问题。之后,当我在脚本中调整此类图像的大小时,结果是正确的。

所以我只想在调整大小之前从 PHP 脚本中的图像中删除 exif。

我尝试了一个检查方向 exif 的函数:

function removeExif($filename) {
    if (function_exists('exif_read_data')) {
      $exif = exif_read_data($filename);
      if($exif && isset($exif['Orientation'])) {
        $orientation = $exif['Orientation'];
        if($orientation != 1){

           // $img = new Imagick($filename);
           // $img->stripImage();
           // $img->writeImage($filename);

        } 
      } 
    } 
  }

所以我只需要用其他东西替换 Imagick 部分,而不安装任何额外的库,也许使用已经包含的 GD 或其他东西。

P粉141925181P粉141925181180 天前361

全部回复(1)我来回复

  • P粉569205478

    P粉5692054782024-03-28 00:52:35

    好吧,所以我决定旋转图像而不是删除 exif,结果具有相同的效果。因此,我检查 exif 方向值(如果有)是多少,然后根据该值,我只需使用 imagerotate,然后调整图像大小。结果是完美的,不需要额外的安装和库。

    function checkExif($filename) {
            if (function_exists('exif_read_data')) {
              $exif = exif_read_data($filename);
              if($exif && isset($exif['Orientation'])) {
                $orientation = $exif['Orientation'];
                if ($exif['Orientation']==3 OR $exif['Orientation']==6 OR $exif['Orientation']==8) {
                    $imageResource = imagecreatefromjpeg($filename); 
                    switch ($exif['Orientation']) { 
                    case 3:
                    $image = imagerotate($imageResource, 180, 0);
                    break;
                    case 6:
                    $image = imagerotate($imageResource, -90, 0);
                    break;
                    case 8:
                    $image = imagerotate($imageResource, 90, 0);
                    break;
                } 
                imagejpeg($image, $filename);
                imagedestroy($imageResource);
                imagedestroy($image);
                }
              } 
            } 
          }

    回复
    0
  • 取消回复