comment get la valeur RGBA de UIImage dans le point cliqué spécifique

Je développe une application iPad qui a plusieurs UIImageViews dans un viewcontoller. chaque image a des parties transparentes. lorsque l'user clique sur l'image que je veux tester si la zone de l'image sur laquelle il a cliqué n'est PAS transparente alors je veux faire une action

après la search, j'ai conclu que je dois accéder aux données brutes de l'image et vérifier la valeur alpha du point sur lequel l'user a cliqué

J'ai utilisé la solution trouvée ici et cela m'a beaucoup aidé. J'ai modifié le code de sorte que si le point sur lequel l'user a cliqué était transparent (alpha <1), alors prent 0 sinon imprimer 1. cependant, le résultat n'est pas précis en exécution. J'ai parfois 0 où le point cliqué n'est pas transparent et viseversa. Je pense qu'il y a un problème avec la valeur byteIndex Je ne suis pas sûr qu'il returnne datatables de couleur au point où l'user a cliqué

voici mon code

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); } 

Merci à l'avance

Cette méthode est mauvaise car elle dessine l'image complète à chaque fois et repose également sur la disposition exacte des octets.

Je propose de dessiner uniquement dans un context 1×1 et get alpha de cette


 - (void)handleSingleTap:(UITapGestureRecognizer *)recognizer { int x = touchPoint.x; int y = touchPoint.y; CGFloat alpha = [self getAlphaFromImage:img atX:x andY:y]; if(alpha<1) … } - (CGFloat)getAlphaFromImage:(UIImage*)image atX:(NSInteger)xx andY:(NSInteger)yy { // Cancel if point is outside image coordinates if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), CGPointMake(xx,yy))) {    return 0; } // Create a 1x1 pixel byte array and bitmap context to draw the pixel into. // Reference: http://stackoverflow.com/questions/1042830/resortingeving-a-pixel-alpha-value-for-a-uiimage NSInteger pointX = xx; NSInteger pointY = yy; CGImageRef cgImage = self.CGImage; NSUInteger width = self.size.width; NSUInteger height = self.size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * 1; NSUInteger bitsPerComponent = 8; unsigned char pixelData[4] = { 0, 0, 0, 0 }; CGContextRef context = CGBitmapContextCreate(pixelData,                                             1,                                             1,                                             bitsPerComponent,                                             bytesPerRow,                                             colorSpace,                                             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace); CGContextSetBlendMode(context, kCGBlendModeCopy); // Draw the pixel we are interestd in onto the bitmap context CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height); CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage); CGContextRelease(context); CGFloat alpha = (CGFloat)pixelData[3] / 255.0f; return alpha; }