gpt4 book ai didi

ios - CGImage 蒙版不适用于宽色域显示器

转载 作者:可可西里 更新时间:2023-11-01 03:33:23 27 4
gpt4 key购买 nike

我有一个 UIView 子类,它呈现应用了 mask 的图像。它在所有设备(仅限 iPad)上都能完美运行,除了那些具有宽色域显示屏(最新的 iPad Pro)的设备,在这些设备上, mask 呈现完全透明(在用户看来, View 不存在)。相关的 init/drawRect 代码如下所示:

init(image: UIImage) {
scratchable = image.cgImage!
imageWidth = scratchable.width
imageHeight = scratchable.height

let colorspace = CGColorSpaceCreateDeviceGray()

let pixels = CFDataCreateMutable(nil, imageWidth * imageHeight)!

alphaPixels = CGContext(
data: CFDataGetMutableBytePtr(pixels),
width: imageWidth,
height: imageHeight,
bitsPerComponent: 8,
bytesPerRow: imageWidth,
space: colorspace,
bitmapInfo: CGImageAlphaInfo.none.rawValue
)!
provider = CGDataProvider(data: pixels)!

alphaPixels.setFillColor(UIColor.black.cgColor)

let mask = CGImage(
maskWidth: imageWidth,
height: imageHeight,
bitsPerComponent: 8,
bitsPerPixel: 8,
bytesPerRow: imageWidth,
provider: provider,
decode: nil,
shouldInterpolate: false
)!

scratched = scratchable.masking(mask)!

super.init(frame: CGRect(x: 0, y: 0, width: imageWidth/2, height: imageHeight/2))

alphaPixels.fill(imageRect)

isOpaque = false
}

override func draw(_ rect: CGRect) {
let context = UIGraphicsGetCurrentContext()!
context.saveGState()
context.translateBy(x: 0, y: bounds.size.height)
context.scaleBy(x: 1.0, y: -1.0)
context.draw(scratched, in: rect)
context.restoreGState()
}

(对于上下文,之所以需要 pixelsalphaPixels 等是因为类中的其他代码会绘制到上下文中以影响 mask )。

知道为什么宽色域显示会影响这个,或者可以做些什么来解决这个问题?我认为这可能与颜色空间有关,但文档明确指出 mask 必须使用 CGColorSpaceCreateDeviceGray 才能正常工作(确实如此)。

这是一个演示该问题的示例项目:http://d.pr/f/IS4SEF

最佳答案

讨论后更新:

问题似乎出在处理 CFData 上。

CFDataCreateMutable(CFAllocatorRef allocator, CFIndex capacity)

capacity 参数是“CFData 对象可以包含的最大字节数”。我们仍然必须通过附加字节来处理长度属性,或者

CFDataSetLength(pixels, imageWidth * imageHeight)

原答案:

尽量不要使用命名颜色,例如 UIColor.black。而是从组件中组合颜色。 Core Graphics 可能无法正确处理混合色彩空间。

关于ios - CGImage 蒙版不适用于宽色域显示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46817864/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com