en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

5.25.2012

使用 CIFilter 對影像製作復古效果的褐色調

  

充滿褐色調的復古風相片,是相片處理軟體最常使用的特效,現在只要透過 CoreImage Framework 中的 CIFilter -- CISepiaTone,你也可以輕鬆達成此效果。有關 CoreImage Framework 的 CIFilter 資訊,可以參考查閱目前在 iOS 上 CIFilter 能使用的濾鏡效果方法一文,文中會教你查詢在目前 iOS SDK 環境下所有可以使用的影像濾鏡。另外你也可以在本站的索引式搜索頁面中,查詢 Framework 分類下的 CoreImage 獲得更多此類資訊。

若要使用 CoreImage Framework 必須以手動的方式替專案新增 CoreImage.framework,並且引用對應的標頭檔。

以手動的方式替專案新增 Framework

#import < CoreImage/CoreImage.h>
對於新增 Framework 有問題的讀者們,請參考 Xcode 4 新增 Framework 的方法一文。

在本示範中我們使用一個 UISlider 來對 CISepiaTone 的 Intensity 強度作設定,Intensity 的數值是介於 0 和 1 之間的浮點數,在我們在改變 UISlider 的數值時,才去呼叫自定的方法函式,將影像套用褐色調的濾鏡,其程式碼如下。
//改變UISlider的數值時會觸發的方法函式
- (IBAction)onChangedSepiaSlider:(UISlider *)sender {

    //自定套用褐色調的的方法函式
    [self setCISepiaToneWithIntensity:[sender value]];
}

- (void)setCISepiaToneWithIntensity:(CGFloat)intensity {

    //製作CoreImage的CIImage存放待處理的影像資料
    CIImage *inputImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"mountain-lion.jpeg"]];

    //製作CoreImage的CIFilter定義使用的影像濾鏡
    CIFilter *sepiaFilter = [CIFilter filterWithName:@"CISepiaTone"
                                        keysAndValues:kCIInputImageKey, inputImage,
                                                      @"inputIntensity", [NSNumber numberWithFloat:intensity],
                                                      nil];

    //取得處理結果並且將CIImage轉換成UIImage
    CIImage * coreImage = [sepiaFilter outputImage];
    CIContext *context = [CIContext contextWithOptions:nil];
    [imageView setImage:[UIImage imageWithCGImage:[context createCGImage:coreImage fromRect:coreImage.extent]]];
}

上述程式碼和大部分的 CIFilter 使用方法一樣,在宣告一個 CIFilter 之後就將待處理的 CIImage 餵給 CIFilter ,並且使用 Key Value 的方式來設定它的各項參數值,在參數設定方面,你可以參考上述程式碼直接使用 filterWithName: keysAndValues: 的方式來一次性的設定多種參數,或是直接使用 setValue: forKey: 針對單一參數做設定。






沒有留言:

張貼留言