我有一段代码可以使用图像的alpha通道创建遮罩。在升级到Mavericks之前,它运行良好,我从未在Xcode调试控制台中收到任何警告或错误。自升级以来,我收到了这个警告:
从枚举类型'enum CGImageAlphaInfo'到不同的枚举类型'CGBitmapInfo'(又名'enum CGBitmapInfo')的隐式转换
标记为问题的行:
CGBitmapContextCreate(alphaData, width, height, 8, rowBytes, NULL, kCGImageAlphaOnly);
以下是文档针对最后一个参数(又名kCGImageAlphaOnly
)所说的内容:
bitmapInfo
指定位图是否应包含Alpha通道,Alpha通道在像素中的相对位置以及有关像素组件是浮点值还是整数值的信息的常量。用于指定alpha通道信息的常量使用
CGImageAlphaInfo
类型声明,但可以安全地传递给此参数。您还可以传递与CGBitmapInfo
类型相关联的其他常量。
奇怪的是,在文档(Alpha Information for Images)中,Apple的typedef没有列出我正在使用的选项。但是,在随后的术语列表中,确实如此!这就是它所说的:
中声明
kCGImageAlphaOnly
没有颜色数据,只有alpha通道。适用于OS X v10.3及更高版本。在CGImage.h
。
考虑到我想创建一个alpha蒙版,我对任何颜色数据都不感兴趣,所以我使用的参数是唯一有意义的参数。我不确定它要我做什么。无论如何,该方法有效,并且当应用程序运行时一切都很好。话虽如此,警告真的很烦人。是否有一个特殊的CLANG指令让它沉默?任何帮助,将不胜感激。欢呼声。
答案 0 :(得分:9)
问题在于您正在使编译器进行隐式转换。修复方法是通过强制转换进行转换显式。
CGBitmapContextCreate(alphaData, width, height, 8, rowBytes, NULL, (CGBitmapInfo)kCGImageAlphaOnly);
仅仅因为实现了一个函数来允许给定参数的多个类型的值(如文档中所述)并不意味着它可以定义,这样编译器就不会抱怨关于它。 C不允许您将参数定义为采用多种类型,您必须选择一种。在这种情况下,CGBitmapContextCreate
定义为:
CGContextRef CGBitmapContextCreate (
void *data,
size_t width,
size_t height,
size_t bitsPerComponent,
size_t bytesPerRow,
CGColorSpaceRef colorspace,
CGBitmapInfo bitmapInfo
);
请注意底部的CGBitmapInfo
类型。这意味着,即使CGImageAlphaInfo
值在技术上是合法的,它们仍然需要通过类型检查器进行转换。