第7回iPhoneアプリ勉強会 画像処理クラスの作成 縣 禎輝 はじめに 画像処理クラスの作成及び動作 画像処理の流れ iPhone上で画像選択 画像情報の取得 画像処理 画像の描画 Pickerの作成 Interfaceの作成 Interfaceと接続 選択画像の取得 グラフィックスコンテキストの作成 画像の縮小・拡大 ビットマップデータの取得 RGB値の取得 画像処理操作 処理画像の表示 作成データの解放 オフスクリーン描画 直接画面に描写せず、 イメージクラスのインスタンスに描画 しておいて、処理後に画面に転送する という方法 メリット:再描画の際、処理時間が減る 画像の選択 -(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingImage:(UIImage*)image editingInfo:(NSDictionary*)editingInfo UIImageというクラスのオブジェクトがわたってくる 選択画像のクラス 画像サイズ320×320 第三の引数であるeditingInfo キーとしてUIImagePickerControllerOriginalImageを指定す る事でオリジナルデータのUIImageオブジェクトを取り 出す事ができる(画像サイズ1200×1600) 画像情報の取得① // オリジナル画像を取得する UIImage* originalImage; originalImage = [editingInfo objectForKey:UIImagePickerControllerOriginalImage]; // グラフィックスコンテキストを作る(画像表示領域) CGSize size = { 300, 400 }; UIGraphicsBeginImageContext(size); グラフィックスコンテキスト グラフィックスを描画するための情報(描画属性)を格納 しておくためのもので,これがないと画像の描画が行え ない 画像情報の取得② // 画像を縮小して描画する CGRect rect; rect.origin = CGPointZero; rect.size = size; [originalImage drawInRect:rect]; drawInRect(メソッド) 現在のコンテキストに対して、指定した大きさで 画像の描画を行うもの // 描画した画像を取得する UIImage* shrinkedImage; shrinkedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 画像情報の取得③ CGImage ・画像の詳細な情報を取得する事ができる(画像の幅、 高さ、ピクセルの要素毎のビット数、ピクセル毎の ビット数、画像1行のバイト数) ・UIImageオブジェクトから取り出す事ができる // CGImageを取得する CGImageRef cgImage; cgImage = shrinkedImage.CGImage; // 画像情報を取得する size_t width; size_t height; size_t bitsPerComponent; : ビットマップデータの取得 CGDataProvider(オブジェクト) 画像の元データを取得する CGImageGetDataProviderで CGImageからCGDataProviderを取り出し CGDataProviderCopyData(API)で ビットマップデータを取得 // データプロバイダを取得する CGDataProviderRef dataProvider; dataProvider = CGImageGetDataProvider(cgImage); // ビットマップデータを取得する CFDataRef data; UInt8* buffer; data = CGDataProviderCopyData(dataProvider); buffer = (UInt8*)CFDataGetBytePtr(data); ビットマップデータの取得 CFDataからポインタを取り出す NSUInteger i, j; for (j = 0; j < height; j++) { for (i = 0; i < width; i++) { // ピクセルのポインタを取得する UInt8* tmp; tmp = buffer + j * bytesPerRow + i * 4; // RGBの値を取得する UInt8 r, g, b; r = *(tmp + 3); g = *(tmp + 2); b = *(tmp + 1); 画像処理 // 輝度値を計算する UInt8 y; y = (77 * r + 28 * g + 151 * b) / 256; //2値化 if(y < 118) y=0; else y=255; // 輝度の値をRGB値として設定する *(tmp + 1) = y; *(tmp + 2) = y; *(tmp + 3) = y; 画像の描画 // 効果を与えたデータを作成する CFDataRef effectedData; effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data)); // 画像を作成する CGImageRef effectedCgImage; UIImage* effectedImage; effectedCgImage = CGImageCreate( width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitmapInfo, effectedDataProvider, NULL, shouldInterpolate, intent); effectedImage = [[UIImage alloc] initWithCGImage:effectedCgImage]; [effectedImage autorelease]; // 画像を表示する _imageView.image = effectedImage; おわりに 画像処理クラスの作成及び動作
© Copyright 2024 ExpyDoc