2012年7月24日 星期二

Filter4Cam 實作: 22. 影像方向調整之三

since: 2012/07/24
update: 2012/07/24

reference:
1. The iOS 5 Developer's Cookbook, 3/e

轉換原始影像的方向

A. 說明:
     1. 將原本的 orientationTransform: 方法, 整個內容全部重寫. 在設備不同的
         擺放情形中, 增加前後鏡頭切換的判斷. 

     2. 調整當 "設備水平向右擺放" 時, 原本 "按鈕功能" 會靠近相機鏡頭位置,
         改成 "按鈕功能" 遠離相機鏡頭位置.

     3. 當 "設備面朝上",  "設備面朝下" 或 "設備方向未知" 時, 加入依據 "上次設備
         的擺放方向" 來作調整的處理.

     4. 在這裡, 同時使用了 CGAffineTransform(仿射轉換) 與 CATransform3D(3D 轉換)
         來作影像方向的調整. 原本希望能只用 CATransform3D 來處理就好, 但沒有測試
         成功, 因此整個程式碼看起來瑣碎而複雜.

    5. 調整的要領是: 先利用 "仿射轉換的旋轉角度" 搭配 "GLKView 作 3D 旋轉",
        來使得螢幕上呈現的影像為正向(包含: 上下, 左右), 接著再來調整 "濾鏡表單"
        與 "功能按鈕" 的呈現.

-----------------------------------------------------------------------------

B. 開啟 ViewController.m 檔案, 修改如下:
....
// 轉換原始影像的方向
- (CIImage *)orientationTransform:(CIImage *)sourceImage
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    CGAffineTransform affineTransform = CGAffineTransformIdentity; // 仿射轉換
    CATransform3D transform3D = CATransform3DIdentity; // 3D 轉換
   
    // Debug: 由於在 shouldAutorotateToInterfaceOrientation:
    //               中無法偵測到這三個方向,

    //               & 當上一次設備的方向為此三種情況時, 不記錄
    if (orientation == UIDeviceOrientationFaceUp) {
        NSLog(@" -> FaceUp");
        //lastOrientation = FaceUp; // 記錄為上次: 面朝上
    }
    if (orientation == UIDeviceOrientationFaceDown) {
        NSLog(@" ---> FaceDown");
        //lastOrientation = FaceDown; // 記錄為上次: 面朝下
    }
    if (orientation == UIDeviceOrientationUnknown) {
        NSLog(@" -----> Unknown");
        //lastOrientation = Unknown; // 記錄為上次: 未知
    }
   
    // ############# //
    // A. 設備垂直擺放 //
    // ############## //
    if (orientation == UIDeviceOrientationPortrait)
    {        
        // 上次為前置鏡頭, 本次為前置鏡頭
        if (self.isLastFrontCamera && self.isUsingFrontCamera)
        {            
            // 將 GLKView, TableView 與 buttonView 對 Y 軸作 180 度旋轉
            transform3D = CATransform3DMakeRotation(M_PI, 0.0f, 1.0f, 0.0f);
            self.glView.layer.transform = transform3D;
            self.filterListTableView.layer.transform = transform3D;
            self.buttonView.layer.transform = transform3D;
        }
        // 上次為後置鏡頭, 本次為後置鏡頭
        else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
        {                    
            // 將 GLKView 對 Z 軸作 180 度旋轉
            transform3D = CATransform3DMakeRotation(M_PI, 0.0f, 0.0f, 1.0f);
            self.glView.layer.transform = transform3D;
           
            // 對 Z 軸作 180 度旋轉為基準, 將 GLKView 對 X 軸作 180 度旋轉
            transform3D = CATransform3DRotate(transform3D, M_PI, 1.0f, 0.0f, 0.0f);
            self.glView.layer.transform = transform3D;

            // 對 Z 軸作 180 度旋轉, 再對 X 軸作 180 度旋轉為基準,
            // 將 GLKView 對 Y 軸作 180 度旋轉
            self.glView.layer.transform = CATransform3DRotate(transform3D, M_PI, 0.0f, 1.0f, 0.0f);
           
            // 將 TableView 與 buttonView 轉成單位矩陣
            self.filterListTableView.layer.transform = CATransform3DIdentity;
            self.buttonView.layer.transform = CATransform3DIdentity;
        }
        // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
        else
        {
            self.isLastFrontCamera = !self.isLastFrontCamera;
        }
       
        // 仿射轉換, 並將輸入角度轉成弧度 (直接輸入 -M_PI /2 亦可)
        affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(-90.0));
    }
    // #################### //
    // B. 設備垂直 180 度擺放 //
    // #################### //
    else if (orientation == UIDeviceOrientationPortraitUpsideDown)
    {
        // 上次為前置鏡頭, 本次為前置鏡頭
        if (self.isLastFrontCamera && self.isUsingFrontCamera)
        {            
            // 將 GLKView, TableView 與 buttonView 對 Y 軸作 180 度旋轉
            transform3D = CATransform3DMakeRotation(M_PI, 0.0f, 1.0f, 0.0f);
            self.glView.layer.transform = transform3D;
            self.filterListTableView.layer.transform = transform3D;
            self.buttonView.layer.transform = transform3D;
           
            // 將 GLKView 對 X 軸作 180 度旋轉
            self.glView.layer.transform = CATransform3DMakeRotation(M_PI, 1.0f, 0.0f, 0.0f);
        }
        // 上次為後置鏡頭, 本次為後置鏡頭
        else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
        {                  
            // 將 TableView 與 buttonView 轉成單位矩陣
            self.filterListTableView.layer.transform = CATransform3DIdentity;
            self.buttonView.layer.transform = CATransform3DIdentity;
           
            // 將 GLKView 對 Z 軸作 180 度旋轉
            self.glView.layer.transform = CATransform3DMakeRotation(M_PI, 0.0f, 0.0f, 1.0f);
        }
        // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
        else
        {
            self.isLastFrontCamera = !self.isLastFrontCamera;
        }
       
        affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(90.0));
    }
    // ################# //
    // C. 設備水平向右擺放 //
    // ################# //
    else if (orientation == UIDeviceOrientationLandscapeRight)
    {
        // 上次為前置鏡頭, 本次為前置鏡頭
        if (self.isLastFrontCamera && self.isUsingFrontCamera)
        {                  
            // "按鈕功能" 靠近相機鏡頭(不採用)
            /*
            // 將 GLKView 對 Z 軸作 90 度旋轉
            transform3D = CATransform3DMakeRotation(M_PI/2, 0.0f, 0.0f, 1.0f);
            self.glView.layer.transform = transform3D;
           
            // 對 Z 軸作 90 度旋轉為基準, 將 GLKView 與 TableView 對 Y 軸作 180 度旋轉
            transform3D = CATransform3DRotate(transform3D, M_PI, 0.0f, 1.0f, 0.0f);
            self.glView.layer.transform = transform3D;
            self.filterListTableView.layer.transform = transform3D;
           
            // 以單位矩陣為基準, 將 buttonView 對 X 軸作 180 度旋轉
            self.buttonView.layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI, 1.0f, 0.0f, 0.0f);
            */
           
            // "按鈕功能" 遠離相機鏡頭(採用此方式)
            // a. 以單位矩陣為基準, 將 GLKView 對 Z 軸作 90 度旋轉
            transform3D = CATransform3DRotate(CATransform3DIdentity, M_PI/2, 0.0f, 0.0f, 1.0f);
            self.glView.layer.transform = transform3D;

            // 以 a. 為基準, 將 GLKView 對 X 軸作 180 度旋轉
            self.glView.layer.transform = CATransform3DRotate(transform3D, M_PI, 1.0f, 0.0f, 0.0f);
           
            // 以 a. 為基準, 將 TableView 對 X 軸作 180 度旋轉
            self.filterListTableView.layer.transform = CATransform3DRotate(transform3D, M_PI, 1.0f, 0.0f, 0.0f);

            // 以單位矩陣為基準, 將 buttonView 對 Y 軸作 180 度旋轉
            self.buttonView.layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI, 0.0f, 1.0f, 0.0f);
        }
        // 上次為後置鏡頭, 本次為後置鏡頭
        else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
        {      
            // "按鈕功能" 靠近相機鏡頭 (不採用)
            /*
            // 將 TableView 對 Z 軸作 90 度旋轉
            transform3D = CATransform3DMakeRotation(M_PI/2, 0.0f, 0.0f, 1.0f);
            self.filterListTableView.layer.transform = transform3D;
           
            // 對 Z 軸作 90 度旋轉為基準, 將 GLKView 對 X 軸作 180 度旋轉
            transform3D = CATransform3DRotate(transform3D, M_PI, 1.0f, 0.0f, 0.0f);
            self.glView.layer.transform = transform3D;
           
            // 對 Z 軸作 90 度旋轉, 再對 X 軸作 180 度旋轉為基準,
            // 將 GLKView 對 Y 軸作 180 度旋轉
            transform3D = CATransform3DRotate(transform3D, M_PI, 0.0f, 1.0f, 0.0f);
            self.glView.layer.transform = transform3D;
           
            // 以單位矩陣為基準, 將 buttonView 對 Z 軸作 90 度旋轉
            self.buttonView.layer.transform = CATransform3DRotate(transform3D, M_PI/2, 0.0f, 0.0f, 1.0f);
            */

            // "按鈕功能" 遠離相機鏡頭(採用此方式)
            // 以單位矩陣為基準, 將 GLKView 對 Z 軸作 90 度旋轉
            transform3D = CATransform3DRotate(CATransform3DIdentity, M_PI/2, 0.0f, 0.0f, 1.0f);
            self.glView.layer.transform = transform3D;
           
            // 以單位矩陣為基準, 將 TableView 對 Z 軸作 -90 度旋轉
            self.filterListTableView.layer.transform = CATransform3DRotate(CATransform3DIdentity, -M_PI/2, 0.0f, 0.0f, 1.0f);
           
            // 以單位矩陣為基準, 將 buttonView 對 Z 軸作 180 度旋轉
            self.buttonView.layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI, 0.0f, 0.0f, 1.0f);
        }
        // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
        else
        {
            self.isLastFrontCamera = !self.isLastFrontCamera;
        }
       
        // "按鈕功能" 靠近相機鏡頭(不採用)
        //affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(180.0));
        // "按鈕功能" 遠離相機鏡頭(採用此方式)
        affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(0.0));
    }
    // ################# //
    // D. 設備水平向左擺放 //
    // ################# //
    else if (orientation == UIDeviceOrientationLandscapeLeft)
    {  
        // 上次為前置鏡頭, 本次為前置鏡頭
        if (self.isLastFrontCamera && self.isUsingFrontCamera)
        {                       
            // 將 GLKView 對 Z 軸作 -90 度旋轉
            transform3D = CATransform3DMakeRotation(-M_PI/2, 0.0f, 0.0f, 1.0f); 
            self.glView.layer.transform = transform3D;
           
            // 對 Z 軸作 -90 度旋轉為基準, 將 GLKView 對 Y 軸作 -180 度旋轉
            transform3D = CATransform3DRotate(transform3D, -M_PI, 0.0f, 1.0f, 0.0f);
            self.glView.layer.transform = transform3D;
           
            // 對 Z 軸作 -90 度旋轉, 再對 Y 軸作 -180 度旋轉為基準,
            // 將 TableView 對 Z 軸作 -180 度旋轉
            transform3D = CATransform3DRotate(transform3D, -M_PI, 0.0f, 0.0f, 1.0f);
            self.filterListTableView.layer.transform = transform3D;

            // 以單位矩陣為基準, 將 buttonView 對 X 軸作 -180 度旋轉
            self.buttonView.layer.transform = CATransform3DRotate(CATransform3DIdentity, -M_PI, 1.0f, 0.0f, 0.0f);
        }
        // 上次為後置鏡頭, 本次為後置鏡頭
        else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
        {                         
            // 將 GLKView 對 Z 軸作 -90 度旋轉
            transform3D = CATransform3DMakeRotation(-M_PI/2, 0.0f, 0.0f, 1.0f);
            self.glView.layer.transform = transform3D;
           
            // 對 Z 軸作 -90 度旋轉為基準, 將 GLKView 對 X 軸作 -180 度旋轉
            transform3D = CATransform3DRotate(transform3D, -M_PI, 1.0f, 0.0f, 0.0f);
            self.glView.layer.transform = transform3D;
           
            // 對 Z 軸作 -90 度旋轉, 再對 X 軸作 -180 度旋轉為基準,
            // 將 GLKView 與 TableView 對 Y 軸作 -180 度旋轉
            transform3D = CATransform3DRotate(transform3D, -M_PI, 0.0f, 1.0f, 0.0f);
            self.glView.layer.transform = transform3D;
            self.filterListTableView.layer.transform = transform3D;
           
            // 將 buttonView 轉成單位矩陣
            self.buttonView.layer.transform = CATransform3DIdentity;
        }
        // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
        else
        {
            self.isLastFrontCamera = !self.isLastFrontCamera;
        }
       
        affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(0.0));
    }
    // ###################### //
    // E. 設備面朝上或設備面朝下 //
    // ###################### //
    else if (orientation == UIDeviceOrientationFaceUp ||
                orientation == UIDeviceOrientationFaceDown)
    {
        ////////////////////////////////////////
        // case 1: 上次為直擺
        //
        if (lastOrientation == Portrait)
        {
            // 上次為前置鏡頭, 本次為前置鏡頭
            if (self.isLastFrontCamera && self.isUsingFrontCamera)
            {
                // 將 GLKView 對 Z 軸作 -180 度旋轉
                transform3D = CATransform3DMakeRotation(-M_PI, 0.0f, 0.0f, 1.0f);
                self.glView.layer.transform = transform3D;
               
                // 對 Z 軸作 -180 度旋轉為基準,
                // 將 GLKView , TableView 與 buttonView 對 X 軸作 -180 度旋轉
                transform3D = CATransform3DRotate(transform3D, -M_PI, 1.0f, 0.0f, 0.0f);
                self.glView.layer.transform = transform3D;
                self.filterListTableView.layer.transform = transform3D;
                self.buttonView.layer.transform = transform3D;
            }
            // 上次為後置鏡頭, 本次為後置鏡頭
            else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
            {
                // 將 GLKView 對 Z 軸作 -180 度旋轉
                transform3D = CATransform3DMakeRotation(-M_PI, 0.0f, 0.0f, 1.0f);
                self.glView.layer.transform = transform3D;
               
                // 對 Z 軸作 -180 度旋轉為基準, 將 GLKView 對 X 軸作 -180 度旋轉
                transform3D = CATransform3DRotate(transform3D, -M_PI, 1.0f, 0.0f, 0.0f);
                self.glView.layer.transform = transform3D;
               
                // 對 Z 軸作 -180 度旋轉, 再對 X 軸作 -180 度旋轉為基準,
                // 將 GLKView, TableView 與 buttonView 對 Y 軸作 -180 度旋轉
                transform3D = CATransform3DRotate(transform3D, -M_PI, 0.0f, 1.0f, 0.0f);
                self.glView.layer.transform = transform3D;
                self.filterListTableView.layer.transform = transform3D;
                self.buttonView.layer.transform = transform3D;
            }
            // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
            else
            {
                self.isLastFrontCamera = !self.isLastFrontCamera;
            }
           
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(-90.0));
        }
       
        ////////////////////////////////////////
        // case 2: 上次為直擺且上下顛倒
        //
        else if (lastOrientation == PortraitUpsideDown)
        {
            // 上次為前置鏡頭, 本次為前置鏡頭
            if (self.isLastFrontCamera && self.isUsingFrontCamera)
            {               
                // 將 GLKView 對 Z 軸作 -180 度旋轉
                transform3D = CATransform3DMakeRotation(-M_PI, 0.0f, 0.0f, 1.0f);
                self.glView.layer.transform = transform3D;
               
                // 對 Z 軸作 -180 度旋轉為基準, 將 GLKView 對 Y 軸作 -180 度旋轉
                self.glView.layer.transform = CATransform3DRotate(transform3D, -M_PI, 0.0f, 1.0f, 0.0f);
               
                // 以單位矩陣為基準, 將 TableView 與 buttonView 對 Y 軸作 -180 度旋轉
                transform3D = CATransform3DRotate(CATransform3DIdentity, -M_PI, 0.0f, 1.0f, 0.0f);
                self.filterListTableView.layer.transform = transform3D;
                self.buttonView.layer.transform = transform3D;
            }
            // 上次為後置鏡頭, 本次為後置鏡頭
            else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
            {               
                // 將 GLKView, TableView 與 buttonView 轉成單位矩陣
                self.glView.layer.transform = CATransform3DIdentity;
                self.filterListTableView.layer.transform = CATransform3DIdentity;
                self.buttonView.layer.transform = CATransform3DIdentity;
               
                // 將 GLKView 對 X 軸作 -180 度旋轉
                transform3D = CATransform3DMakeRotation(-M_PI, 1.0f, 0.0f, 0.0f);
                self.glView.layer.transform = transform3D;
               
                // 對 X 軸作 -180 度旋轉為基準,
                // 將 GLKView 對 Y 軸作 -180 度旋轉
                self.glView.layer.transform = CATransform3DRotate(transform3D, -M_PI, 0.0f, 1.0f, 0.0f);
            }
            // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
            else
            {
                self.isLastFrontCamera = !self.isLastFrontCamera;
            }
           
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(90.0));
        }

        ////////////////////////////////////////
        // case 3: 上次為橫擺朝右
        //         (與 "設備水平向右擺放" 設定相同)
        else if (lastOrientation == LandscapeRight)
        {
            // 上次為前置鏡頭, 本次為前置鏡頭
            if (self.isLastFrontCamera && self.isUsingFrontCamera)
            {      
                // a. 以單位矩陣為基準, 將 GLKView 對 Z 軸作 90 度旋轉
                transform3D = CATransform3DRotate(CATransform3DIdentity, M_PI/2, 0.0f, 0.0f, 1.0f);
                self.glView.layer.transform = transform3D;
               
                // 以 a. 為基準, 將 GLKView 對 X 軸作 180 度旋轉
                self.glView.layer.transform = CATransform3DRotate(transform3D, M_PI, 1.0f, 0.0f, 0.0f);
               
                // 以 a. 為基準, 將 TableView 對 X 軸作 180 度旋轉
                self.filterListTableView.layer.transform = CATransform3DRotate(transform3D, M_PI, 1.0f, 0.0f, 0.0f);
               
                // 以單位矩陣為基準, 將 buttonView 對 Y 軸作 180 度旋轉
                self.buttonView.layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI, 0.0f, 1.0f, 0.0f);
            }
            // 上次為後置鏡頭, 本次為後置鏡頭
            else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
            {                        
                // 以單位矩陣為基準, 將 GLKView 對 Z 軸作 90 度旋轉
                transform3D = CATransform3DRotate(CATransform3DIdentity, M_PI/2, 0.0f, 0.0f, 1.0f);
                self.glView.layer.transform = transform3D;
               
                // 以單位矩陣為基準, 將 TableView 對 Z 軸作 -90 度旋轉
                self.filterListTableView.layer.transform = CATransform3DRotate(CATransform3DIdentity, -M_PI/2, 0.0f, 0.0f, 1.0f);
               
                // 以單位矩陣為基準, 將 buttonView 對 Z 軸作 180 度旋轉
                self.buttonView.layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI, 0.0f, 0.0f, 1.0f);
            }
            // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
            else
            {
                self.isLastFrontCamera = !self.isLastFrontCamera;
            }
           
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(0.0));
        }       
       
        ////////////////////////////////////////
        // case 4: 上次為橫擺朝左
        //
        else if (lastOrientation == LandscapeLeft)
        {
            // 上次為前置鏡頭, 本次為前置鏡頭
            if (self.isLastFrontCamera && self.isUsingFrontCamera)
            {  
                // a. 以單位矩陣為基準, 將 GLKView 對 Z 軸作 90 度旋轉
                transform3D = CATransform3DRotate(CATransform3DIdentity, M_PI/2, 0.0f, 0.0f, 1.0f);
                self.glView.layer.transform = transform3D;
               
                // 以 a. 為基準, 將 TableView 對 Y 軸作 180 度旋轉  
                self.filterListTableView.layer.transform = CATransform3DRotate(transform3D, M_PI, 0.0f, 1.0f, 0.0f);
               
                // 以 a. 為基準, 將 GLKView 對 X 軸作 -180 度旋轉
                self.glView.layer.transform = CATransform3DRotate(transform3D, -M_PI, 1.0f, 0.0f, 0.0f);
               
                // 以單位矩陣為基準, 將 buttonView 對 X 軸作 -180 度旋轉
                self.buttonView.layer.transform = CATransform3DRotate(CATransform3DIdentity, -M_PI, 1.0f, 0.0f, 0.0f);
            }
            // 上次為後置鏡頭, 本次為後置鏡頭
            else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
            {        
                // 以單位矩陣為基準, 將 GLKView 與 TableView 對 Z 軸作 90 度旋轉
                transform3D = CATransform3DRotate(CATransform3DIdentity, M_PI/2, 0.0f, 0.0f, 1.0f);
                self.glView.layer.transform = transform3D;
                self.filterListTableView.layer.transform = transform3D;
               
                // 將 buttonView 轉成單位矩陣
                self.buttonView.layer.transform = CATransform3DIdentity;
            }
            // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
            else
            {
                self.isLastFrontCamera = !self.isLastFrontCamera;
            }
           
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(0.0));
        }
        else
        {
            NSLog(@"orientationTransform: orientation = FaceUp/FaceDown, lastOrientation not defined!");
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(0.0));
        }
    }
    // ############## //
    // F. 設備方向未知 //
    // ############## //
    else if (orientation == UIDeviceOrientationUnknown)
    {
        ////////////////////////////////////////
        // case 1: 上次為直擺
        //
        if (lastOrientation == Portrait)
        {
            // 上次為前置鏡頭, 本次為前置鏡頭
            if (self.isLastFrontCamera && self.isUsingFrontCamera)
            {
                // Do Nothing
            }
            // 上次為後置鏡頭, 本次為後置鏡頭
            else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
            {
                // Do Nothing
            }
            // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
            else
            {
                self.isLastFrontCamera = !self.isLastFrontCamera;
            }
           
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(-90.0));
        }
       
        ////////////////////////////////////////
        // case 2: 上次為直擺且上下顛倒
        //
        else if (lastOrientation == PortraitUpsideDown)
        {
            // 上次為前置鏡頭, 本次為前置鏡頭
            if (self.isLastFrontCamera && self.isUsingFrontCamera)
            {               
                // Do Nothing
            }
            // 上次為後置鏡頭, 本次為後置鏡頭
            else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
            { 
                // Do Nothing
            }
            // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
            else
            {
                self.isLastFrontCamera = !self.isLastFrontCamera;
            }
           
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(90.0));
        }
       
        ////////////////////////////////////////
        // case 3: 上次為橫擺朝右
        //         (與 "設備水平向右擺放" 設定相同)
        else if (lastOrientation == LandscapeRight)
        {
            // 上次為前置鏡頭, 本次為前置鏡頭
            if (self.isLastFrontCamera && self.isUsingFrontCamera)
            {   
                // Do Nothing
            }
            // 上次為後置鏡頭, 本次為後置鏡頭
            else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
            {     
                // Do Nothing
            }
            // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
            else
            {
                self.isLastFrontCamera = !self.isLastFrontCamera;
            }
           
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(0.0));
        }       
       
        ////////////////////////////////////////
        // case 4: 上次為橫擺朝左
        //
        else if (lastOrientation == LandscapeLeft)
        {
            // 上次為前置鏡頭, 本次為前置鏡頭
            if (self.isLastFrontCamera && self.isUsingFrontCamera)
            {  
                // Do Nothing
            }
            // 上次為後置鏡頭, 本次為後置鏡頭
            else if (!self.isLastFrontCamera && !self.isUsingFrontCamera)
            {      
                // Do Nothing
            }
            // "前置切換成後置鏡頭" 或 "後置切換成前置鏡頭"
            else
            {
                self.isLastFrontCamera = !self.isLastFrontCamera;
            }
           
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(0.0));
        }
        else
        {
            NSLog(@"orientationTransform: orientation = Unknown, lastOrientation not defined!");
            affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(0.0));
        }
    }
    else
    {
        NSLog(@"orientationTransform: No orientation match!");
        affineTransform = CGAffineTransformMakeRotation(DegreesToRadians(0.0));
    }
   
    return [sourceImage imageByApplyingTransform:affineTransform];
}
....

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。