FC2ブログ

頭と尻尾はくれてやる!

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


NSImage画像をRGBAのデータに展開する

カラー(※1)のNSImage画像(RGBAの4チャンネルのデータを持つ)をMetal Performance Shadersで使うためにデータ化する、というのをしたことがなかったのでデータ化するクラスメソッドを作った。

この手のメソッドは数ヶ月後か数年後かに参考にしたり使い回ししたくなるものなので可能ならクラスメソッドにして自分がすぐにわかるような置き場に置いておくようにしたい(自分への戒め)。

あらかじめその分のメモリは確保しておく必要がある。
// 呼び出し元
{
    unsigned char *toData = calloc(width*height*4, sizeof(unsigned char));
    [MyUtility storeColorImage:image to:toData];

    // (toDataを使う処理)

    free(toData);//—(1)
}

// MyUtilityクラスの実装ファイル
+(void)storeColorImage:(NSImage*)image to:(unsigned char *)toData
{
    size_t width = image.size.width;
    size_t height = image.size.height;
    size_t bitsPerComponent = 8;
    size_t bytesPerRow = width*4;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGImageAlphaInfo bitmapInfo = kCGImageAlphaNoneSkipLast;
    
    CGContextRef context = CGBitmapContextCreate(nil,
                                                 width,
                                                 height,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpace,
                                                 bitmapInfo);
    
    NSRect imageRect = NSMakeRect(0, 0, width,height);
    NSGraphicsContext *gctx = [NSGraphicsContext graphicsContextWithCGContext:context flipped:NO];
    [NSGraphicsContext setCurrentContext:gctx];
    [image drawInRect:imageRect];
    
    void *data = CGBitmapContextGetData (context);
    
    memcpy(toData, data, width*height*4);
    
    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);
}
(1)使用後はメモリの解放が必要。そういう事情もあるので
+(unsigned char *)getDataForImage:(NSImage *)image;
という形式にできない(※2)のが少し残念、というかコードの可読性が低下するが仕方ない。


※1 わざわざ”カラー”としているのは、白黒も扱うことがあるのであえてメソッド名などにColorと入れてるだけ
※2 できなくもないけどメモリ解放を忘れてしまう可能性大なので避けてる

<< 3チャンネル画像だとKerasとMPSの計算が合わない  TopPage  Game Centerの認証に成功してるのにお帰りなさい画面が出ない >>

コメント


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

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1261-48a7ad4c




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

FC2Ad