检查UIImage的问题有alpha(透明)颜色与否

嗨检查图像有透明区域(阿尔法)与否。 巴基斯坦,我不得不改变UIImage的颜色

我已经实现了下面的方法来检查图像是否有alpha

 - (BOOL) checkAlpha : (UIImage*) image { for(int x = 0; x < image.size.width ; x++) { for(int y = 0; y < image.size. height; y++) { CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); const UInt8* data = CFDataGetBytePtr(pixelData); int pixelInfo = ((image.size.width * y) + x ) * 4; // The image is png UInt8 red = data[pixelInfo]; // If you need this info, enable it UInt8 green = data[(pixelInfo + 1)]; // If you need this info, enable it UInt8 blue = data[pixelInfo + 2]; // If you need this info, enable it UInt8 alpha = data[pixelInfo + 3]; // I need only this info for my maze game CFRelease(pixelData); UIColor* color = [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f]; DLog(@"color : %@",color); DLog(@"alpha : %hhu",alpha) if (alpha) return YES; // display original image from url. else return NO; // apply brand color here. } } return YES; } 

这种方法工作正常,但对于一些形象是创造问题。 看到下面的图片

在这里输入图像说明 对于这个图像alpha返回0;

在这里输入图像说明 在这里输入图像说明 而对于上面的2张图片alpha有一些价值。

所有3个图像具有相同的白色背景。 对于第一个图像也应该有一些阿尔法。 它不应该是0.请引导我出来呢? 有什么代码错误在我的方法或什么?

最后找出问题中显示的当前图像的解决scheme。 我想知道UIImage是否有alpha通道。

 - (BOOL) hasAlphaChannel : (UIImage*) image { if ([self hasAlpha:image]) return YES; return NO; } - (BOOL)hasAlpha : (UIImage*) img { CGImageAlphaInfo alpha = CGImageGetAlphaInfo(img.CGImage); return ( alpha == kCGImageAlphaFirst || alpha == kCGImageAlphaLast || alpha == kCGImageAlphaPremultipliedFirst || alpha == kCGImageAlphaPremultipliedLast ); } 

这有hasAlpha方法在这种情况下工作正常。

欲了解更多信息: 查看此链接

为了什么是值得的,我试着下载你的图片,右键点击并select“获取信息”。 该信息说,图像没有alpha通道,所以我会开始获得这些图像的alpha版的新版本。

运行image \图层上的所有点,并检查alpha通道是否存在,如下所示:

  UIColor *pixelColor = [SSAlphaPass colorOfPoint:point withLayer:self.layer]; if(CGColorGetAlpha(pixelColor.CGColor)) { return YES; } return NO; 

 + (UIColor *) colorOfPoint:(CGPoint)point withLayer:(CALayer*)layer { unsigned char pixel[4] = {0}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast); CGContextTranslateCTM(context, -point.x, -point.y); [layer renderInContext:context]; CGContextRelease(context); CGColorSpaceRelease(colorSpace); //NSLog(@"pixel: %d %d %d %d", pixel[0], pixel[1], pixel[2], pixel[3]); UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0]; return color; } 

我写了一个类来检测某个像素是否透明,如果是这种情况, UIButton会将Touch事件传递给它的超级视图。 你可能会觉得它很有用 。

首先,你对CGDataProviderCopyData()的调用在循环内部,所以会非常慢。 其次,您的代码不能使用不同的inputPNG图像types。 使其正常工作的唯一方法是将input图像渲染成像素缓冲区,然后检查输出一次变平的像素。

Interesting Posts