ビューコントローラーに複数の UIImageView を持つ iPad アプリケーションを開発しています。各画像には透明な部分があります。ユーザーが画像をクリックしたときに、クリックした画像の領域が透明でないかどうかをテストしたい場合、何らかのアクションを実行したい
検索後、画像の生データにアクセスし、ユーザーがクリックしたポイントのアルファ値を確認する必要があるという結論に達しました
ここにあるソリューションを使用しましたが、非常に役立ちました。ユーザーがクリックしたポイントが透明 (アルファ <1) の場合は 0 を印刷し、そうでない場合は 1 を印刷するようにコードを変更しました。ただし、結果は実行時に正確ではありません。クリックしたポイントが透明でない場合は 0 になることがあります。byteIndex値に問題があると思います。ユーザーがクリックした時点のカラー データが返されるかどうかはわかりません。
ここに私のコードがあります
CGPoint touchPoint;
- (void)viewDidLoad
{
[super viewDidLoad];
[logo addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
touchPoint = [touch locationInView:self.view];
}
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
int x = touchPoint.x;
int y = touchPoint.y;
[self getRGBAsFromImage:img atX:x andY:y];
}
- (void)getRGBAsFromImage:(UIImage*)image atX:(int)xx andY:(int)yy {
// First get the image into your data buffer
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
// Now your rawData contains the image data in the RGBA8888 pixel format.
int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel;
CGFloat alpha = (rawData[byteIndex + 3] * 1.0) / 255.0;
byteIndex += 4;
if (alpha < 1) {
NSLog(@"0");
// here I should add the action I want
}
else NSLog(@"1");
free(rawData);
}
よろしくお願いします