CGImageCreateWithMask产生的CGImage在哪里保留alpha值

时间:2016-04-14 13:53:56

标签: ios swift core-graphics

我有一个未屏蔽的CGImage,每个像素使用四个字节RGBA,其前几个像素是:

  

C5 D2 D4 FF
  C7 D4 D6 FF
  C8 D5 D6 FF
  C6 D4 D3 FF
  C7 D5 D4 FF

然后,我以灰度(即每像素一个字节)制作一个掩蔽图像

  

00
  00
  00
  00
  00

最后,我致电CGImageCreateWithMask申请面具。生成的蒙版图像的前几个像素是:

  

C5 D2 D4 FF
  C7 D4 D6 FF
  C8 D5 D6 FF
  C6 D4 D3 FF
  C7 D5 D4 FF

如果我将此CGImage转换为UIImage并将其添加到图像控件中,则前几个像素正确100%透明,但其底层像素不正确100%不透明。

这是我用来查看任何CGImage字节的模式。

let imageCGDataProvider:CGDataProvider? = CGImageGetDataProvider(imageCG)
let imageCGPixelData:CFData? = CGDataProviderCopyData(imageCGDataProvider!)
let imageCGData:UnsafePointer<UInt8> = CFDataGetBytePtr(imageCGPixelData!)

如何获取被屏蔽的CGImage中像素的字节值,即应用了掩码的字节值?

1 个答案:

答案 0 :(得分:1)

这非常有趣。看起来屏蔽仅在绘制时应用于图像。

如果在原始图像的数据提供程序和屏蔽图像的数据提供程序上进行指针比较,您将看到它们都具有相同的数据提供程序。我只能假设掩码信息存储在内部,并且仅在绘制实际图像时才被访问。

这对我来说没有多大意义,作为一个设计决定。如果必须多次绘制相同的蒙版图像,则必须多次重新屏蔽相同的数据(尽管CGImage可以在内部缓存结果)。如果你能够取消掩盖或重新掩盖已经蒙版的CGImage - 这是非常有意义的 - 但是你做不到AFAIK。

我最初希望CGImageCreateWithImageInRect()CGImageCreateCopy()强制CGImage将掩码应用于基础数据 - 但它似乎只是传递了相同的数据提供者,并假设内部面具信息。

我唯一能找到掩盖数据的方法是在位图上下文中实际绘制图像。例如:

let ctx = CGBitmapContextCreate(nil, CGImageGetWidth(img), CGImageGetHeight(img), 8, 0, CGColorSpaceCreateDeviceRGB(), bitmapInfo.rawValue)
CGContextDrawImage(ctx, CGRect(origin: CGPointZero, size: CGSize(width: CGImageGetWidth(img), height: CGImageGetHeight(img))), img)
let data = UnsafeMutablePointer<UInt8>(CGBitmapContextGetData(ctx))

如果其他人对此有更多了解 - 我肯定有兴趣知道!