从 CGImageCreateWithMask 产生的 CGImage 在哪里保存 alpha 值

Where does a CGImage resulting from CGImageCreateWithMask keep the alpha values

我有一个未屏蔽的 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 中像素的字节值,即应用蒙版后的字节值?

这很有趣。似乎只有在 绘制 .

时才将遮罩应用于图像

如果您对原始图像的数据提供者和蒙版图像的数据提供者进行指针比较,您会发现它们都具有 相同的 数据提供者。我只能假设掩码信息存储在内部,并且只有在绘制实际图像时才会访问。

作为设计决定,这对我来说意义不大。如果您必须多次绘制相同的蒙版图像,那么您将不得不多次重新蒙版相同的数据(尽管 CGImage 可能会在内部缓存结果)。如果您能够取消屏蔽或重新屏蔽已经屏蔽的 CGImage,这将很有意义 – 但据我所知,您不能。

我最初希望 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))

如果其他人对此有更多了解 – 我绝对有兴趣知道!