由CGImageCreateWithMask生成的CGImage在哪里保留alpha值



我有一个未屏蔽的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,这将是非常有意义的——但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))

如果其他人对此了解更多——我肯定很想知道!

最新更新