检查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图像渲染成像素缓冲区,然后检查输出一次变平的像素。