頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


iOSデバイスのカメラで得る画像データのサイズを知る方法

iPhoneやiPadのカメラを使って画像を得る時にそのデータのサイズはどうやって取得するのってお話だよ。

ここでのサイズってのはいくつの点で画像を表現してるのって意味でのサイズであって画像の幅が何ピクセルとかじゃないよ。例えばAVCaptureSessionPreset1280x720なら1280x720個の点で作られるデータを取得するんだ。一つの点はRGBとアルファ値で4つあって、それぞれがunsigned char(1バイト)になるよ。だから1280x720x4x1 で約3.5MBにもなるからテキトウなメモリ処理だと簡単にスタックオーバーフローしちゃうよ(経験談)。

AVCaptureSessionクラスのsessionPresetプロパティで画質とかを設定できるんだけど、リファレンスにはこういうのを設定できるとあるよね。
{
    NSString *const AVCaptureSessionPresetPhoto;
    NSString *const AVCaptureSessionPresetHigh;
    NSString *const AVCaptureSessionPresetMedium;
    NSString *const AVCaptureSessionPresetLow;
    NSString *const AVCaptureSessionPreset352x288;
    NSString *const AVCaptureSessionPreset640x480;
    NSString *const AVCaptureSessionPreset1280x720;
    NSString *const AVCaptureSessionPreset1920x1080;
    NSString *const AVCaptureSessionPresetiFrame960x540;
    NSString *const AVCaptureSessionPresetiFrame1280x720;
}
AVCaptureSessionPresetHighのようにデバイスの性能次第みたいなのもあるし、AVCaptureSessionPreset1280x720のように数字を指定してても縦長か横長かって話もあるしさ。
どうすればサイズを取得できるのよ?って調べるとこういう記事が見つかったんだ。

ios - Knowing resolution of AVCaptureSession's session presets - Stack Overflow
{
    //captureSessionはAVCaptureSessionオブジェクト
    AVCaptureInput *input = [captureSession.inputs objectAtIndex:0];
    AVCaptureInputPort *port = [input.ports objectAtIndex:0];
    CMFormatDescriptionRef formatDescription = port.formatDescription;
    CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);
}
↑うん、確かに取得できる。とりあえずこれ使ってみるかな。せっかくだからカテゴリにしてまとめておこうっと。
@implementation AVCaptureSession (GetDimensions)
-(CMVideoDimensions)dimensions
{
    AVCaptureInput *input = [self.inputs objectAtIndex:0];
    AVCaptureInputPort *port = [input.ports objectAtIndex:0];
    CMFormatDescriptionRef formatDescription = port.formatDescription;
    CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);
    return dimensions;
}
こうしておけば今後使う時には
{
    CMVideoDimensions dimensions = [captureSession dimensions];
    NSLog(@"dimensions : %dw , %dh",dimensions.width,dimensions.height);
}
ってな感じで一撃だもんね。
ちなみにCMVideoDimensionsはどういう構造体か見てみると
typedef struct {
    int32_t width;
    int32_t height;
} CMVideoDimensions;
↑このように整数型でwidth、heightを持ってるのでNSLogで確認するときは%dでOK。

<< ナビゲーションバーの色(png画像)を即時変える  TopPage  iPhoneのお休みモードがオンだとリマインダーは通知してくれない >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/786-099d5673




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad