检查 UIImage 是否具有 alpha(透明)颜色的问题
Issue in checking UIImage have alpha (Transparent) color or not
我正在检查图像是否具有透明区域 (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 return 0;
对于以上 2 张图像,alpha 具有一定的价值。
所有 3 张图片都具有相同的白色背景。
对于第一张图片也应该有一些阿尔法。它不应该是 0。
请指导我解决这个问题?我的方法有代码错误还是什么?
首先,您对 CGDataProviderCopyData() 的调用在循环内,因此速度会非常慢。其次,您的代码不适用于不同的输入 PNG 图像类型。使其正常工作的唯一方法是将输入图像渲染到像素缓冲区中,然后在展平为普通像素后检查输出。
为了它的价值,我尝试下载您的图片,右键单击并选择 'get info'。信息说这些图像没有 alpha 通道,所以我会从获取这些图像的新版本开始,这些图像确实有 alpha。
运行 在图像 \ 层上的所有点上并检查是否存在 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;
}
我写了一个class检测某个像素是否透明,如果是的话UIButton
,例如,将Touch事件传递给它的父视图。你可能会发现它 useful.
终于找到问题当前显示的图像的解决方案。我想知道 UIImage 是否有 alpha 通道。
- (BOOL)hasAlpha : (UIImage*) img
{
CGImageAlphaInfo alpha = CGImageGetAlphaInfo(img.CGImage);
return (
alpha == kCGImageAlphaFirst ||
alpha == kCGImageAlphaLast ||
alpha == kCGImageAlphaPremultipliedFirst ||
alpha == kCGImageAlphaPremultipliedLast
);
}
这种 hasAlpha
方法在这种情况下工作正常。
更多信息:Check out this link
用 Swift4 重写@Hitarth 的回答:
extension UIImage {
public func isTransparent() -> Bool {
guard let alpha: CGImageAlphaInfo = self.cgImage?.alphaInfo else { return false }
return alpha == .first || alpha == .last || alpha == .premultipliedFirst || alpha == .premultipliedLast
}
}
我正在检查图像是否具有透明区域 (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 return 0;
对于以上 2 张图像,alpha 具有一定的价值。
所有 3 张图片都具有相同的白色背景。 对于第一张图片也应该有一些阿尔法。它不应该是 0。 请指导我解决这个问题?我的方法有代码错误还是什么?
首先,您对 CGDataProviderCopyData() 的调用在循环内,因此速度会非常慢。其次,您的代码不适用于不同的输入 PNG 图像类型。使其正常工作的唯一方法是将输入图像渲染到像素缓冲区中,然后在展平为普通像素后检查输出。
为了它的价值,我尝试下载您的图片,右键单击并选择 'get info'。信息说这些图像没有 alpha 通道,所以我会从获取这些图像的新版本开始,这些图像确实有 alpha。
运行 在图像 \ 层上的所有点上并检查是否存在 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;
}
我写了一个class检测某个像素是否透明,如果是的话UIButton
,例如,将Touch事件传递给它的父视图。你可能会发现它 useful.
终于找到问题当前显示的图像的解决方案。我想知道 UIImage 是否有 alpha 通道。
- (BOOL)hasAlpha : (UIImage*) img
{
CGImageAlphaInfo alpha = CGImageGetAlphaInfo(img.CGImage);
return (
alpha == kCGImageAlphaFirst ||
alpha == kCGImageAlphaLast ||
alpha == kCGImageAlphaPremultipliedFirst ||
alpha == kCGImageAlphaPremultipliedLast
);
}
这种 hasAlpha
方法在这种情况下工作正常。
更多信息:Check out this link
用 Swift4 重写@Hitarth 的回答:
extension UIImage {
public func isTransparent() -> Bool {
guard let alpha: CGImageAlphaInfo = self.cgImage?.alphaInfo else { return false }
return alpha == .first || alpha == .last || alpha == .premultipliedFirst || alpha == .premultipliedLast
}
}