歡迎來到小豬圈!

2008-09-14

依照片 EXIF 資訊 Orientation 自動旋轉

  • 有些相機支援偵測使用者是水平或垂直拍攝這項功能,並將這項資料寫入相片的 EXIF 資訊中, Orientation 這項目裡。

  • 在 EXIF 2.2 裡 Orientation 預先定義了八個可能的值,圖來自:ImpulseAdventure - JPEG / Exif Orientation and Rotation
  • 利用 exif_read_data() 讀取 EXIF 中 Orientation 的資料。
  • 因為 GD 沒有鏡像翻轉的函數,所以我改用 Imagick 的函數(Imagick::flipImage()Imagick::flopImage()Imagick::rotateImage())。
  • 我寫的版本在這裡下載: exif_auto_rotation.zip ,其中包括 1.JPG 到 8.JPG 八張圖(其實內容是同一張圖),利用 Quick EXIF editor 修改其 EXIF 的值,分別對應 Orientation 的 1 到 8 的值。
  • exif_auto_rotation.php:
    <?php
      // exif_auto_rotation.php?file=1.JPG
      if (!isset($_GET['file'])){
        exit;
      }
      $file = $_GET['file'];
      $image = new Imagick();
      if ( $image->readImage($file) !== false) {
        $exif = exif_read_data($file);
        switch ($exif['Orientation']) {
          case 1: // 水平(一般)
            break;
          case 2: // 水平鏡像
            $image->flopImage();
            break;
          case 3: // 翻轉180度
            $image->rotateImage(new ImagickPixel(), 180);
            break;
          case 4: // 垂直鏡像
            $image->flipImage();
            break;
          case 5: // 水平鏡像後,順時鐘翻轉270度
            $image->flopImage();
            $image->rotateImage(new ImagickPixel(), 270);
            break;
          case 6: // 順時鐘翻轉270度
            $image->rotateImage(new ImagickPixel(), 270);
            break;
          case 7: // 水平鏡像後,順時鐘翻轉90度
            $image->flopImage();
            $image->rotateImage(new ImagickPixel(), 90);
            break;
          case 8: // 順時鐘翻轉90度
            $image->rotateImage(new ImagickPixel(), 90);
            break;
          default: // 讀取 EXIF Orientation 錯誤
            exit;
            break;
        }
        header('Content-type: ' . image_type_to_mime_type(exif_imagetype($file)));
        echo $image;
      } else {
        // 圖檔讀取錯誤
      }
    ?>

2 comments:

Comment Form Message

Blog Archive

Labels

Google Analytics Tracking Code

About Me

My photo
Keelung, R.O.C, Taiwan
一個不學無術、混吃等死的傢伙…