なりせなるてず

技術ブログにしたい

FuelPHPでEXIF情報を読み画像を回転させる

iPhoneで撮った画像をサーバーにあげて表示すると、全て横向きで表示されます。
これはEXIFの情報で縦にしてるからなんですね。知らなかったです。

ということでEXIF情報を読み込んでFuelPHPで角度にあった回転をさせます。

public static function exif_rotate($filepath)
{
  try
  {
    $exif = exif_read_data($filepath);
  }
  catch(Exception $e)
  {
    return 0;
  }

  if (isset($exif['Orientation']) && is_numeric($exif['Orientation']))
  {
    $rotate = 0;
    switch ($exif['Orientation'])
    {
      case 1:
      case 4:
      break;

      case 2:
      case 3:
        $rotate = 180;
      break;

      case 5:
      case 8:
        $rotate = 270;
      break;

      case 6:
      case 7:
        $rotate = 90;
      break;
    }

    return $rotate;
  }

  return 0;
}

こんな感じの関数を用意しました。
これにファイルパスを投げると画像に必要な回転の角度が返ってきます。

使い方はこんな感じ

$filepath = 'image.jpg';
Image::forge()->load($filepath)->rotate(self::exif_rotate($filepath))->output($filepath);


exif_read_dataでEXIF情報を読み込みます。
Orientationキーが回転を表す数値です。
詳しいことは下のURLを参考にさせてもらいました。
JPEGのExifタグ情報のOrientaionの定義の早見表 - DQNEO起業日記

EXIF情報はjpegTIFFとかいう画像にしか存在しないので、それ以外のファイルが指定された時は0を返すようになっています。

本当は左右反転、上下反転ていうのが定義されてるのですが、GDには反転するメソッドは用意されていないし、わざわざ反転する人も殆ど居ないので無視しちゃってます。

Imageクラスのでrotateメソッドを使って回転させます。
Image - クラス - FuelPHP ドキュメント



これでiPhoneで撮った画像も正しい角度で表示されます