• 検索結果がありません。

) CoreImage 2013/5/25 iphone

N/A
N/A
Protected

Academic year: 2021

シェア ") CoreImage 2013/5/25 iphone"

Copied!
35
0
0

読み込み中.... (全文を見る)

全文

(1)

カメラアプリ開発入門

(第一回

)

まずは基本の基本から

CoreImageを使った画像加工まで

2013/5/25 名古屋iPhone開発者勉強会

(2)

大塚 崇(おおつか たかし)

DJ / フリーランスのエンジニア・プログラマ

ハンドル名

:

takatronix

Facebook/Twitter/Skype/LINE/Weibo ->

takatronix

http://takatronix.com

趣味興味:

旅行、語学、筋トレ、

LEGO、FX、心理学、 

脳科学、宇宙

自己紹介

(3)

リリースしたアプリ

デカ目ミラー、

SEXY SCAN、 放射能汚染地

図、和牛スキャン

...

デカ目ミラー(SexyMirror)2013/1リリース

イギリスの

iPhone総合で何故か10位に、

現在40万ダウンロード

(4)

iOSカメラAPI

UIImagePickerController

AVFoundation.framework

iOS4から、標準のカメラUIを使わない

アプリが作れる

よくあるカメラの

UI

非常に簡単だが自由がない

リアルタイムエフェクトはできない

実装は結構大変だがなんでもできる

(5)

iOS画像処理方法

CoreImage (CPU/GPU)

OpenGL (GPU)

ピクセル処理

(CPU)

OpenCV (CPU/GPU)

vImage (GPU)

(6)

UIImagePickerController

の使い方

(7)
(8)
(9)
(10)

ViewController.h に追加

#import <UIKit/UIKit.h>

(11)

ViewController.hに追加

#import

<UIKit/UIKit.h>

@interface

ViewController :

UIViewController

<

UIImagePickerControllerDelegate

,

UINavigationControllerDelegate

>

@property

IBOutlet

UIImageView

* imageView;

(12)

フォトライブラリを開く処理

ViewController.mに追加

// フォトライブラリを開く

- (IBAction)openPhotoLibrary:(id)sender {

// フォトライブラリが使えるかチェック

// カメラを開く場合

// UIImagePickerControllerSourceTypePhotoLibrary を

// UIImagePickerControllerSourceTypeCamera に変更

! if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) ! {

// UIImagePickerControllerを作成し初期化 new = alloc + init

! ! UIImagePickerController* imagePicker = [UIImagePickerController new]; // カメラを開く場合 sourceType = UIImagePickerControllerSourceTypeCamera;

imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; // 編集可能にする場合はYES

imagePicker.allowsEditing = YES; // 自分への通知設定

imagePicker.delegate = self;

// フォトライブラリを開く

[self presentViewController:imagePicker animated:YES

completion:^{ // 開いたタイミングに呼ばれる NSLog(@"(1)フォトライブラリを開いた"); }]; } }

(13)

ViewController.mに追加

撮影後

orサムネイル選択後に呼ばれる処理

テキスト

// 写真撮影後orサムネイル選択後に呼ばれる処理

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

! // オリジナル画像

! UIImage* originalImage = (UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage]; ! // 編集画像

! UIImage* editedImage = (UIImage *)[info objectForKey:UIImagePickerControllerEditedImage]; UIImage* savedImage; if(editedImage){ savedImage = editedImage; } else{ savedImage = originalImage; } // 選択された画像を表示

_imageView.image = savedImage;

// 開いているカメラ・フォトライブラリを閉じる

[self dismissViewControllerAnimated:YES completion:^{

}]; }

(14)
(15)
(16)
(17)
(18)

シミュレータに画像がない場合

(19)
(20)
(21)

フィルタがないカメラアプリ

とか小学生までだよねー?

(22)
(23)
(24)

ViewController.mに追加

#import

"ViewController.h"

#import

<CoreImage/CoreImage.h>

@interface

ViewController ()

(25)

モノクロフィルタを作る

ViewController.mに追加

// グレースケール画像を作成する

-(UIImage*)monochromeFilter:(UIImage*)image{

// UIImageをCoreImageに変換する

CIImage* ciImage = [[CIImage alloc] initWithImage:image];

// CoreImageフィルタを作成する

CIFilter* ciFilter = [CIFilter filterWithName:@"CIColorMonochrome"

keysAndValues:kCIInputImageKey, ciImage, // パラメータ:入力色(RGBのフィルタ係数)

// セピア色にするなら [CIColor colorWithRed:1.0 green:0.7 blue:0.4]

@"inputColor", [CIColor colorWithRed:1.0 green:1.0 blue:1.0], // パラメータ(度合い)

// 0.5にすれば半分の適用度になります

@"inputIntensity", [NSNumber numberWithFloat:1.0], nil];

// CoreImageのコンテクストを作成

CIContext* ciContext = [CIContext contextWithOptions:nil]; // フィルタを適用

CGImageRef cgImage = [ciContext createCGImage:ciFilter.outputImage fromRect:[ciFilter.outputImage extent]]; // CGImageRefをUIImageに変換

UIImage* retImage = [UIImage imageWithCGImage:cgImage scale:image.scale orientation:UIImageOrientationUp]; // CGImage開放

(26)

フィルタを適用する

ViewController.mを修正

// 写真撮影後orサムネイル選択後に呼ばれる処理

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary

*)info {

! // オリジナル画像

! UIImage* originalImage = (UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage]; ! // 編集画像

! UIImage* editedImage = (UIImage *)[info objectForKey:UIImagePickerControllerEditedImage]; UIImage* savedImage; if(editedImage){ savedImage = editedImage; } else{ savedImage = originalImage; } // モノクロフィルタを適用してから // 選択された画像を表示

_imageView.image = [self monochromeFilter:savedImage]; // 開いているカメラ・フォトライブラリを閉じる

[self dismissViewControllerAnimated:YES completion:^{

}]; }

(27)

パラメータを変えてみよう

@"inputColor", [CIColor colorWithRed:1.0 green:0.7 blue:0.4],

@"inputColor", [CIColor colorWithRed:1.0 green:1 blue:0],

(28)

ケラレフィルタ(カメラの周辺光量落ち)

(29)

ケラレフィルタを作る

// ケラレフィルタ(カメラの周辺光量落ち)

-(UIImage*)vignetteFilter:(UIImage*) image{

// UIImageをCoreImageに変換する

CIImage* ciImage = [[CIImage alloc] initWithImage:image];

// CoreImageフィルタを作成する

CIFilter* ciFilter = [CIFilter filterWithName:@"CIVignette"

keysAndValues:kCIInputImageKey, ciImage, //

@"inputRadius", [NSNumber numberWithFloat:2.0], // パラメータ(度合い)

// 0.5にすれば半分の適用度になります

@"inputIntensity", [NSNumber numberWithFloat:1.0], nil];

// CoreImageのコンテクストを作成

CIContext* ciContext = [CIContext contextWithOptions:nil]; // フィルタを適用

CGImageRef cgImage = [ciContext createCGImage:ciFilter.outputImage fromRect:[ciFilter.outputImage extent]]; // CGImageRefをUIImageに変換

UIImage* retImage = [UIImage imageWithCGImage:cgImage scale:image.scale orientation:UIImageOrientationUp]; // CGImage開放

CGImageRelease(cgImage);

(30)

// 写真撮影後orサムネイル選択後に呼ばれる処理

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

! // オリジナル画像

! UIImage* originalImage = (UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage]; ! // 編集画像

! UIImage* editedImage = (UIImage *)[info objectForKey:UIImagePickerControllerEditedImage]; UIImage* savedImage; if(editedImage){ savedImage = editedImage; } else{ savedImage = originalImage; } // モノクロフィルタ+ケラレフィルタを適用し、画面に表示

_imageView.image = [self vignetteFilter:[self monochromeFilter:savedImage]]; // 開いているカメラ・フォトライブラリを閉じる

[self dismissViewControllerAnimated:YES completion:^{

}]; }

(31)
(32)

カメラロールへ保存

-(void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{ if(error){ NSLog(@"Error"); }else{ NSLog(@"保存した"); } }

ViewController.mへ追加

// 写真撮影後orサムネイル選択後に呼ばれる処理

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

! // オリジナル画像

! UIImage* originalImage = (UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage]; ! // 編集画像

! UIImage* editedImage = (UIImage *)[info objectForKey:UIImagePickerControllerEditedImage]; UIImage* savedImage; if(editedImage){ savedImage = editedImage; } else{ savedImage = originalImage; } // モノクロフィルタ+ケラレフィルタを適用し、画面に表示

_imageView.image = [self vignetteFilter:[self monochromeFilter:savedImage]]; // カメラロールへ保存する

UIImageWriteToSavedPhotosAlbum(_imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

// 開いているカメラ・フォトライブラリを閉じる

[self dismissViewControllerAnimated:YES completion:^{

}]; }

(33)

プロジェクトとこのスライドはここから

落とせますよ。

http://takatronix.com/tutorial/20130525.zip

次回から実機転送が必須(予定

)になりますの

で、興味がある人は、

Appleに開発者登録と実

機転送まで、済ましておいてください。

(34)

takatronix

検索

(35)

ありがとうございました

takatronix

検索

参照

関連したドキュメント

ともわからず,この世のものともあの世のものとも鼠り知れないwitchesの出

ところで,このテクストには,「真理を作品のうちへもたらすこと(daslnsaWakPBrinWl

化し、次期の需給関係が逆転する。 宇野学派の 「労働力価値上昇による利潤率低下」

731 部隊とはということで,簡単にお話しします。そこに載せてありますのは,

(注 3):必修上位 17 単位の成績上位から数えて 17 単位目が 2 単位の授業科目だった場合は,1 単位と

[r]

しかし私の理解と違うのは、寿岳章子が京都の「よろこび」を残さず読者に見せてくれる

これからはしっかりかもうと 思います。かむことは、そこ まで大事じゃないと思って いたけど、毒消し効果があ