2012年7月25日 星期三

Filter4Cam 實作: 23. 影像方向調整之四

since: 2012/07/25
update: 2012/07/25

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

畫出 "濾鏡範圍" 內的影像

A. 說明:
     修改原本的 drawFilteredImage: 方法, 主要調整:
     1. "設備水平向右擺放" 時的, 繪製來源區塊(fromRect)與目的區塊(inRect)位置.

     2. 對 "設備朝上擺放", "設備朝下擺放" 或 "設備擺放方向未知" 的情況, 加入依據
         "上次設備的擺放方向" 來作調整的處理.

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

B. 開啟 ViewController.m 檔案, 修改如下:

....
// 畫出 "濾鏡範圍" 內的影像(含方向轉變的調整)
- (void)drawFilteredImage:(CIImage *)filteredImage
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
   
    // ############# //
    // A. 設備垂直擺放 //
    // ############# //
    if (orientation == UIDeviceOrientationPortrait)
    {       
        [self.coreImageContext drawImage:filteredImage inRect:CGRectMake(23.5, 83.5, 274, 274)
                                // x 越小, 濾鏡越向右; y 負越多, 濾鏡越向上
                                fromRect:CGRectMake(23.5, -557.5, 274, 274)];
    }
    // #################### //
    // B. 設備垂直 180 度擺放 //
    // #################### //
    else if (orientation == UIDeviceOrientationPortraitUpsideDown)
    {       
        [self.coreImageContext drawImage:filteredImage inRect:CGRectMake(23.5, 83.5, 274, 274)
                                // x 負越多, 濾鏡越向左; y 越多, 濾鏡越向上
                                fromRect:CGRectMake(-458.5, 83.5, 274, 274)];
    }
    // ####################################### //
    // C. "設備水平向右擺放" 或 "設備水平向左擺放" //
    // ####################################### //
    else if (orientation == UIDeviceOrientationLandscapeRight ||
             orientation == UIDeviceOrientationLandscapeLeft)
    {       
        [self.coreImageContext drawImage:filteredImage inRect:CGRectMake(123.5, 23.5, 274, 274)
                                // x 越大, 濾鏡越向左; y 越多, 濾鏡越向下
                                fromRect:CGRectMake(123.5, 23.5, 274, 274)];
    }
    // ################################################### //
    // D. "設備朝上擺放" 或 "設備朝下擺放" 或 "設備擺放方向未知" //
    // #################################################### //
    else if (orientation == UIDeviceOrientationFaceUp ||
             orientation == UIDeviceOrientationFaceDown ||
             orientation == UIDeviceOrientationUnknown)
    {       
        // case 1: 上次為直擺
        if (lastOrientation == Portrait)
        {
            [self.coreImageContext drawImage:filteredImage inRect:CGRectMake(23.5, 83.5, 274, 274)
                                    // x 越大, 濾鏡越向左; y 越多, 濾鏡越向上
                                    fromRect:CGRectMake(23.5, -557.5, 274, 274)];
        }
        // case 2: 上次為直擺且上下顛倒
        else if (lastOrientation == PortraitUpsideDown)
        {
             [self.coreImageContext drawImage:filteredImage inRect:CGRectMake(23.5, 83.5, 274, 274)
                                    // x 負越多, 濾鏡越向左; y 越多, 濾鏡越向上
                                    fromRect:CGRectMake(-458.5, 83.5, 274, 274)];
        }
        // case 3: 上次為 "橫擺朝右" 或 case 4: 上次為 "橫擺朝左"
        else if (lastOrientation == LandscapeRight || lastOrientation == LandscapeLeft)   
        {
            [self.coreImageContext drawImage:filteredImage inRect:CGRectMake(123.5, 23.5, 274, 274)
                                    // x 越大, 濾鏡越向左; y 越多, 濾鏡越向上
                                    fromRect:CGRectMake(123.5, 23.5, 274, 274)];
        }
        else
        {
            NSLog(@"drawFilteredImage: orientation = FaceUp/FaceDown/Unknown, lastOrientation not defined!");
        }
    }
    else
    {
        NSLog(@"drawFilteredImage: No orientation match!");
    }
}
....

沒有留言:

張貼留言

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