php iphone アップロード 画像向き

2013年7月31日更新 view: 47 view
photoBy: http://www.medister.info/wordpress/newsblog/wp-content/uploads/banana_stockx.jpg
スポンサードリンク

アップロードしたときに画像の向きがおかしくなる

アップロード時に向きを自動変換するには?

iphoneから直接画像アップロードをしようとすると、縦向きの写真が横に、横向きの写真が縦になったりと
バグる時がある。

これは exif 情報が イッテルかららしい。

条件

  • Attachmentonly model にメソッドをまとめる
  • cakephp2.x 使用
  • media plugin 使用
  • exif情報が無い場合はそのままアップロード

コード

・Attachmenonly.php model

<?php
App::uses('AppModel', 'Model');
class Attachmentonly extends AppModel {
    
    var $useTable = 'attachments';
    
    /*
        画像ファイルをチェック
    */
    function isImg($file)
    {
        if (!(file_exists($file) && ($type=exif_imagetype($file)))) return false;
    
        switch ($type) {
            case IMAGETYPE_GIF:
                return 'gif';
            case IMAGETYPE_JPEG:
                return 'jpg';
            case IMAGETYPE_PNG:
                return 'png';
            default:
                return false;
        }
    }
        
    /*
        iphone や android からの自動画像回転
        
        exif情報付きのjpgファイルの時は一時ファイルを作って返す
        return TMP.1343443432(rand).jpg
        
        ファイルがjpgでなかったり、exif情報がなければ
        return false
    */
    function autoLotate($img_data)
    {
        $exif = @exif_read_data($img_data, 'IFD0', true);//Exif情報読み込み
        $newfile = false;
        
        //exif情報があって、画像タイプが jpgの場合
        if(!empty($exif["IFD0"]["Orientation"]) && $this->isImg($img_data) == 'jpg'){
        $newfile = TMP.rand().'.jpg';
        $r_data = $exif["IFD0"]["Orientation"];
        
        
        $r_data = $exif["IFD0"]["Orientation"];    //画像の向き情報を取り出す
        
            switch($r_data){//値によって振り分け
        
                case 1:         //通常
                $degrees = 0;
                break;
        
                case 2:         //左右反転
                $degrees = 0;
                break;
        
                case 3:         //180°回転
                $degrees = 180;
                break;
        
                case 4:         //上下反転
                $degrees = 0;
                break;
        
                case 5:         //反時計回りに90°回転 上下反転
                $degrees = 270;
                break;
        
                case 6:         //反時計回りに90°回転
                $degrees = 270;
                break;
        
                case 7:         //時計回りに90°回転 上下反転
                $degrees = 90;
                break;
        
                case 8:         //時計回りに90°回転
                $degrees = 90;
                break;
        
            }
                    
        $source = imagecreatefromjpeg($img_data);
        $rotate = imagerotate($source, $degrees, 0);
                
        imagejpeg($rotate,$newfile,100);
        }
        
        return $newfile;
    }

}

・コントローラー

function upload()
{

    if($this->request->data){
        
        /*
        Array
        (
            [User] => Array
                (
                    [id] => 92
                )
        
            [Attachment] => Array
                (
                    [0] => Array
                        (
                            [model] => User
                            [file] => Array
                                (
                                    [name] => 写真.JPG
                                    [type] => image/jpeg
                                    [tmp_name] => /var/tmp/phpABmW5h
                                    [error] => 0
                                    [size] => 92910
                                )
        
                        )
        
                )

)
        */
    
        $this->loadModel('Attachmentonly');
        
        $tmp = $this->Attachmentonly->autoLotate($this->request->data['Attachment'][0]['file']['tmp_name']);
        
        if($tmp != false){
            $this->request->data['Attachment'][0]['file'] = $tmp;
        }
    
        
        if($this->User->saveAll($this->request->data)){
            if($tmp != false){
                unlink($tmp);
            }
        
            $this->Session->setFlash('追加完了');
            $this->redirect('/users/upload/');
        }
    }
}

こんな感じで自動的にアップロード時に画像の向きを補正してくれるようになります。

スポンサードリンク

関連記事

関連カテゴリ

コロ助

web関連の記事や制作系の記事をどんどんまとめていきます。 宜しくお願いします!

ピックアップ

パソコン・ソフトウェア ランキング

12月15日 ( 土 ) にアクセスが多かった記事はこちら!