FC2ブログ

頭と尻尾はくれてやる!

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


データ列からNSImageオブジェクトを作成する

NSImageから白黒画像のデータが欲しい(2)
↑ここでデータ列から白黒のNSImageを作成してるのでそのコードをメモ。

元データは白黒なので1ピクセルあたり8ビット (=1バイト)で縦x横のサイズ分ってことで
unsigned char *data = calloc(width*height , sizeof(unsigned char));
↑こういう感じでメモリを確保してそこに適当に輝度データが入ってる、とする。

そのデータとサイズからNSImageオブジェクトを返すメソッドがこちら↓
+(NSImage *)makeGrayNSImageFromData:(void *)data size:(NSSize)size
{
    size_t width = size.width;
    size_t height = size.height;
    size_t bitsPerComponent = 8;
    size_t bitsPerPixel = 8;
    size_t bytesPerRow = width;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    bool shouldInterpolate = 1;
    CGColorRenderingIntent intent = 0;
    
    NSUInteger nData = width * height;
    CFDataRef cfdata = CFDataCreate(NULL, data, nData);
    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData(cfdata);
    
    CGImageRef cgimage = CGImageCreate(
                            width, height,
                            bitsPerComponent, bitsPerPixel, bytesPerRow,
                            colorSpace, bitmapInfo, dataProvider,
                            NULL, shouldInterpolate, intent);
    
    NSImage *image = [[NSImage alloc] initWithCGImage:cgimage size:size];
    
    CGImageRelease(cgimage);
    CGDataProviderRelease(dataProvider);
    CGColorSpaceRelease(colorSpace);
    CFRelease(cfdata);
    
    return image;
}
メモリ解放を忘れるとどんどん使用してるメモリの量が増えていくので要注意。CoreGraphics周りはARCでも自分でメモリ解放処理を記述しなければならない。
{
    NSInteger cx = width/2.0;
    NSInteger cy = height/2.0;
    for (NSInteger yy=0;yy<height;yy++) {
        for (NSInteger xx=0;xx<width;xx++) {
            NSUInteger ite = yy*width+xx;
            unsigned char length = sqrtf(powf(xx-cx , 2)+powf(yy-cy, 2)) / cx *255;
            data[ite] = length;
        }
    }
}
↑確認用に画像の中心からの距離(横幅の半分で255になるように)を入れたデータを作成。
描画メソッドの確認画像
↑その結果の画像。

<< NSArrayControllerの中身を全部削除するカテゴリ  TopPage  NSImageから白黒画像のデータが欲しい(2) >>

コメント


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

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1222-25ce73c4




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

FC2Ad