如何检测照片的拍摄角度,并像桌面应用程序在查看时那样自动旋转网站显示?

2022-08-30 18:05:13

如果我用相机拍照,它会存储设备的方向/角度,因此当我使用一个好的应用程序在PC上查看图像时,它会自动旋转到0。

但是当我上传到一个网站时,它显示了原始角度,所以图像看起来不好。

我如何使用PHP检测到这一点并旋转图像,并从其元信息中清除此角度标志。


答案 1

为此,您必须从JPEG文件中读取EXIF信息。您可以使用exif PHP扩展或PEL来执行此操作。

基本上,您必须读取文件中的标志。下面是一个使用 exif PHP 扩展和 WideImage 进行图像处理的示例。Orientation

<?php
$exif = exif_read_data($filename);
$ort = $exif['Orientation'];

$image = WideImage::load($filename);

// GD doesn't support EXIF, so all information is removed.
$image->exifOrient($ort)->saveToFile($filename);

class WideImage_Operation_ExifOrient
{
  /**
   * Rotates and mirrors and image properly based on current orientation value
   *
   * @param WideImage_Image $img
   * @param int $orientation
   * @return WideImage_Image
   */
  function execute($img, $orientation)
  {
    switch ($orientation) {
      case 2:
        return $img->mirror();
        break;

      case 3:
        return $img->rotate(180);
        break;

      case 4:
        return $img->rotate(180)->mirror();
        break;

      case 5:
        return $img->rotate(90)->mirror();
        break;

      case 6:
        return $img->rotate(90);
        break;

      case 7:
        return $img->rotate(-90)->mirror();
        break;

      case 8:
        return $img->rotate(-90);
        break;

      default: return $img->copy();
    }
  }
}

答案 2

我修改了Chris的示例,以添加对exif函数的检查,删除镜像,并使用相同的文件名将文件写回文件系统。这样,您可以在调用move_uploaded_file后立即调用此函数,如下所示:

move_uploaded_file($uploadedFile, $destinationFilename);
correctImageOrientation($destinationFilename);

function correctImageOrientation($filename) {
  if (function_exists('exif_read_data')) {
    $exif = exif_read_data($filename);
    if($exif && isset($exif['Orientation'])) {
      $orientation = $exif['Orientation'];
      if($orientation != 1){
        $img = imagecreatefromjpeg($filename);
        $deg = 0;
        switch ($orientation) {
          case 3:
            $deg = 180;
            break;
          case 6:
            $deg = 270;
            break;
          case 8:
            $deg = 90;
            break;
        }
        if ($deg) {
          $img = imagerotate($img, $deg, 0);        
        }
        // then rewrite the rotated image back to the disk as $filename 
        imagejpeg($img, $filename, 95);
      } // if there is some rotation necessary
    } // if have the exif orientation info
  } // if function exists      
}

推荐