Подтвердить что ты не робот

Как определить угол съемки фотографии и автоматический поворот для отображения веб-сайта, например, на настольных приложениях?

Если я снимаю фотографию с камеры, она сохраняет ориентацию/угол устройства, поэтому, когда я просматриваю изображение на ПК с хорошим приложением, он показывает, что он автоматически поворачивается на 0.

Но когда я загружаюсь на сайт, он показывает исходный угол, поэтому изображение выглядит не очень хорошо.

Как я могу обнаружить это с помощью PHP и повернуть изображение, и очистить этот флаг угла от него метаинформацией.

4b9b3361

Ответ 1

Чтобы сделать это, вы должны прочитать информацию EXIF ​​из файла JPEG. Вы можете сделать это с помощью exif Расширение PHP или PEL.

В принципе, вы должны прочитать флаг Orientation в файле. Ниже приведен пример использования exif расширения PHP и WideImage для обработки изображений.

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

Если вы просто хотите использовать GD и расширение php EXIF, вы можете использовать это:

function _mirrorImage ( $imgsrc)
{
    $width = imagesx ( $imgsrc );
    $height = imagesy ( $imgsrc );

    $src_x = $width -1;
    $src_y = 0;
    $src_width = -$width;
    $src_height = $height;

    $imgdest = imagecreatetruecolor ( $width, $height );

    if ( imagecopyresampled ( $imgdest, $imgsrc, 0, 0, $src_x, $src_y, $width, $height, $src_width, $src_height ) )
    {
        return $imgdest;
    }

    return $imgsrc;
}

function adjustPicOrientation($full_filename){        
    $exif = exif_read_data($full_filename);
    if($exif && isset($exif['Orientation'])) {
        $orientation = $exif['Orientation'];
        if($orientation != 1){
            $img = imagecreatefromjpeg($full_filename);

            $mirror = false;
            $deg    = 0;

            switch ($orientation) {
              case 2:
                $mirror = true;
                break;
              case 3:
                $deg = 180;
                break;
              case 4:
                $deg = 180;
                $mirror = true;  
                break;
              case 5:
                $deg = 270;
                $mirror = true; 
                break;
              case 6:
                $deg = 270;
                break;
              case 7:
                $deg = 90;
                $mirror = true; 
                break;
              case 8:
                $deg = 90;
                break;
            }
            if ($deg) $img = imagerotate($img, $deg, 0); 
            if ($mirror) $img = _mirrorImage($img);
            $full_filename = str_replace('.jpg', "-O$orientation.jpg",  $full_filename); 
            imagejpeg($img, $full_filename, 95);
        }
    }
    return $full_filename;
}

Ответ 3

Я модифицировал пример Криса, чтобы добавить проверку для функции 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      
}

Ответ 4

Флаг вращения сохраняется как часть данных EXIF ​​(см. в этой статье для получения дополнительной информации).

Вам нужно будет прочитать флаг вращения из данных EXIF ​​в PHP и затем повернуть изображение в соответствии с ним. Существует множество библиотек PHP EXIF, если у вас установлен веб-сервер с установленным расширением, вы можете использовать предоставленную PHP библиотеку.

Я бы предложил повернуть изображение один раз при загрузке (например, используя GD-библиотеку - большинство установок PHP в эти дни, похоже, приходят с ней), так что вам не нужно беспокоиться об очистке данных вращения EXIF ​​(не уверен, насколько это просто с PHP, я никогда не пробовал).