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];