1

我有一段代码使用图像的 Alpha 通道创建蒙版。在升级到 Mavericks 之前,它运行良好,我从未在 Xcode 调试控制台中收到过任何警告或错误。自升级以来,我收到此警告:

从枚举类型“enum CGImageAlphaInfo”到不同枚举类型“CGBitmapInfo”的隐式转换(又名“enum CGBitmapInfo”)

标记为问题的行:

CGBitmapContextCreate(alphaData, width, height, 8, rowBytes, NULL, kCGImageAlphaOnly);

以下是文档对最后一个参数(aka kCGImageAlphaOnly)的说明:

bitmapInfo

指定位图是否应包含 Alpha 通道、Alpha 通道在像素中的相对位置以及有关像素组件是浮点值还是整数值的信息的常量。用于指定 alpha 通道信息的常量使用CGImageAlphaInfo类型声明,但可以安全地传递给此参数。您还可以传递与该CGBitmapInfo类型关联的其他常量。

奇怪的是,在文档(图像的 Alpha 信息)中,Apple 的 typedef 没有列出我正在使用的选项。但是,在下面的术语列表中,确实如此!它是这样说的:

kCGImageAlphaOnly
没有颜色数据,只有一个 Alpha 通道。在 OS X v10.3 及更高版本中可用。中宣布CGImage.h

考虑到我想创建一个 alpha 蒙版,我对任何颜色数据都不感兴趣,所以我使用的参数是唯一有意义的参数。我不确定它要我做什么。无论如何,该方法有效,并且在应用程序运行时一切正常。话虽如此,警告真的很烦人。是否有特殊的 CLANG 指令可以使其静音?任何帮助,将不胜感激。干杯。

4

1 回答 1

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值在技术上是合法的,它们仍然需要强制转换才能通过类型检查器。

于 2013-10-28T01:38:57.973 回答