はじめに
GPUImageFilterをビルドせずに書き換えたい!
申請せずにサーバーからフィルタを更新したい!
よし!jsonファイルから色んなGPUImageFilterを生成しよう!
参考
[Objective-C] 文字列からインスタンスの生成とメソッド呼び出し(プロパティの設定)をやってみる
GPUImageFilterDictionary
メインのメソッドです。
こいつににjsonファイルを渡すと指定されたフィルタが生成されます。
ヘッダ部と実装部
#import <GPUImage/GPUImage.h>
@interface GPUImageFilterDictionary : NSObject
@property(nonatomic, strong)NSString *version;
@property(nonatomic, strong)NSString *key;
@property(nonatomic, strong)NSString *type;
@property(nonatomic, strong)GPUImageOutput *gpuImage; /*キモになるプロパティ*/
-(instancetype)initWithJsonFilePath:(NSString*)jsonFilePath;/
@end
長いから省略 githubを見てください
GPUImageJson(Github)にあげています。
jsonからObjCを制御するキモになってるカテゴリはここ
使い方
@interface ViewController ()
@property (nonatomic, strong) GPUImageVideoCamera *videoCamera;
@property (nonatomic, strong) GPUImageView *previewView;
@property (nonatomic, strong) GPUImageFilterDictionary *filterDic;
@end
@implementation ViewController
/*
GPUImageVideoCameraのスタートや
GPUImageViewの配置は省略
*/
//フィルタの生成と連結
-(void)setupFilter{
//sample_filter.jsonから指定のGPUImageFilterをもったGPUImageFilterDictionaryのインスタンスをを生成
GPUImageFilterDictionary *filterDic = [[GPUImageFilterDictionary alloc] initWithJsonFilePath:@"sample_filter"];
_filterDic = filterDic;
//連結するフィルタの取得
GPUImageFilter *createFilter = (GPUImageFilter *)filterDic.gpuImage;
//連結
[_videoCamera addTarget:createFilter];
[createFilter addTarget:_previewView];
}
@end
仕様
今のところ生成できるのは
・ GPUImageFilter
・ GPUImageImagePicture
・ GPUImageImageFilterGroup
の3つとそのサブクラスです
プロパティやメソッドの引数で対応している型は
・ bool, char int, short, long, long long, float, double, NSInteger, あとそれぞれのunsigned
・ CGPoint, CGRect, CGVector, CGSize, CGAffineTransform, UIEdgeInsets, UIEdgeInsets
・ Objective-Cのクラス
です
その他の型を引数にとるメソッドは使えませんが、今のところ困ってないです。
jsonファイル
GPUImageFilterとGPUImagePictureの書き方
{
"ver": /*jsonのバージョン番号 任意の数*/,
"key": /*ソース内でフィルタを分類するkey 任意の一意な文字列*/,
"type": /*呼び出すクラス*/,
"property_list":/*呼び出すプロパティの配列*/
[
{"property": /*プロパティ名*/,
"type":/*代入する値の型 unsigned longなどのスペースがある場合はunsigned_longとする */,
"value":/*プロパティに代入する値*/
}
],
"method_list":/*呼び出すメソッドの配列 さらに別クラスのメソッドを入れ子で実行できる*/
[
{
"method_name":/*メソッド名*/,
"method_type_list":/*メソッドの種類を指定する配列 イニシャライザを意味する「init」かクラスメソッドを意味する「class」を指定する どちらでもないなら記載しなくてよい*/,
"param_list":/*メソッドに代入するパラメータの配列*/
[
{"type":/*パラメータの型*/,
"value":/*パラメータの値*/
}
]
}
例
例としてGPUImageBrightnessFilterを生成するjsonファイル
brightnessプロパティの値を0.5にしたインスタンスを生成します。
json
{
"ver": 1,
"key": "g1",
"type":"GPUImageBrightnessFilter",
"property_list":[{"property":"brightness", "type":"float", "value":0.5}],
}
出力
これで生成されるGPUImageFilterを通すとこんな感じの画像が出力されます。
GPUImageFilterGroupの書き方
{
"ver": /*jsonのバージョン番号 任意の数*/,
"key": /*ソース内でフィルタを分類するkey 任意の一意な文字列*/,
"type": GPUImageFilterGroup,
"create":[/*GPUImageFilterGroupで連結するフィルタの配列(中身はGPUImageFilterをつくるjsonと同じ)*/],
"add_targets":[/*add_targetでの連結を指定する配列 fromからtoへ連結する locationでtextureLocationを指定する*/
{"from":, /*createで生成したフィルタのkey*/
"to":,/*createで生成したフィルタのkey*/
"location":/*textureLocationの数値*/
},
],
/*GPUImageFilterGroupのinitialFiltersの配列 createで生成したフィルタのkey */
"initialFilters":[],
/*GPUImageFilterGroupのterminalFilter createで生成したフィルタのkey */
"terminalFilter":,
}
例
・GPUImageBrightnessFilterを通して
・test.pngをGPUImagePictureで読み込んで
・GPUImageAlphaBlendFilterで混ぜる
というfiltergroupを作ります
json
GPUImagePictureはinitWithImage:(UIImage*)メソッドで生成します
この引数のUIImageもimageNamed:メソッドをjsonで入れ子で指定して生成します
{
"ver": 1,
"key": "g1",
"type":"GPUImageFilterGroup",
"create":[
{
"key":"f1",
"type":"GPUImageBrightnessFilter",
"property_list":[{"property":"brightness", "type":"float", "value":0.5}],
},
{
"key":"f2",
"type":"GPUImageAlphaBlendFilter",
"property_list":[{"property":"mix", "type":"float", "value":0.5}],
},
{
"key":"p1",
"type":"GPUImagePicture",
"method_list":[
{
"method_name":"initWithImage:",
"method_type_list":["init"],
"param_list":[
{"type":"UIImage",
"method_list":[{
"method_name":"imageNamed:",
"method_type_list":["init","class"],
"param_list":[{"type":"NSString",
"value":"test.png"}],
}],
},
]
}
],
},
],
"add_targets":[
{"from":"f1", "to":"f2", "location":0},
{"from":"p1", "to":"f2", "location":1},
],
"initialFilters":["f1"],
"terminalFilter":"f2",
}
test.png
出力
サンプルソース
まとめ
これでサーバーからjsonを指定して自由にGPUImgageのフィルタが更新できる!
それにしても相変わらず俺得なことしかまとめてないな