読者です 読者をやめる 読者になる 読者になる

iOSアプリ開発の逆引き辞典

iPhone/iPadで使えるアプリ開発のTipsをまとめてみました

UIImageオブジェクトからアルファ値(alpha channel)の配列を取得する

iOSではビットマップは32bitのRGBAで扱われます。

重なりあった複雑な描画やUIViewのヒットテストでhitTest:withEvent:メソッドの判定などでUIImageに設定されている画像のアルファ値(alpha channel)を使いたいシーンがあります。

本記事ではUIImageオブジェクトからアルファ値の配列を取得する方法をご紹介します。

- (NSData *)alphaDataWithImage:(UIImage *)image
{
    CGImageRef imageRef = image.CGImage;
    
    CFDataRef dataRef = CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
    NSData *pixelData = (__bridge NSData*) dataRef;
    unsigned char *buffer = (unsigned char *)[pixelData bytes];
    
    size_t width = CGImageGetWidth(imageRef);
    size_t height = CGImageGetHeight(imageRef);
    size_t pixelSize = CGImageGetBitsPerPixel(imageRef) / 8;
    
    // Get alpha data.
    size_t size = width * height;
    unsigned char array[size];
    for (int i = 0; i < size; i++) {
        unsigned char alpha = * (buffer + (i * pixelSize + 3));
        array[i] = alpha;
    }
    
    NSData* data = [NSData dataWithBytes:(const void *)array
                                  length:sizeof(unsigned char) * size];
    
    CFRelease(dataRef);
    return data;
}

上記のalphaDataWithImage:メソッドを以下のように使用してアルファ値を取得します。

UIImage *image = [UIImage imageNamed:@"test_image"];
NSData *alphaData = [self alphaDataWithImage:image];