2017-10-18 202 views
9

我有一个UIView子类,它呈现应用了蒙版的图像。它适用于所有设备(仅限iPad),除了具有宽色域显示屏(最新的iPad优点)的屏幕呈现完全透明(看起来像用户不喜欢的视图)的用户。有关初始化/ drawRect中的代码如下所示:CGImage蒙版在宽色域显示器上不起作用

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等都是必要的是由于,吸引到右键影响面膜类的其他代码)。

任何想法为什么广色域显示会影响这一点,或者可以做些什么来解决它?我认为这可能与色彩空间有关,但文档明确指出,面具必须使用CGColorSpaceCreateDeviceGray才能正常工作(的确如此)。

下面是一个示例项目演示该问题:讨论后http://d.pr/f/IS4SEF

+0

这是iPhoneX上的问题吗(它也有广泛的色域)?它可以在模拟器中复制吗? – paiv

+0

你能链接正确和错误的结果图像吗? – paiv

+0

@paiv这是一款仅限iPad的应用程序,我们也没有iPhone X,所以不太确定。我认为这是行不通的。它不能在模拟器中复制,只能在设备上复制。我刚刚通过链接到示例项目编辑了我的问题。谢谢你的帮助! – pwightman

回答

2

更新时间:

这个问题似乎是在CFData处理。

CFDataCreateMutable(CFAllocatorRef allocator, CFIndex capacity) 

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

CFDataSetLength(pixels, imageWidth * imageHeight) 

原来的答复:

尽量不要使用命名的颜色,如UIColor.black。改为使用组件组合颜色。 Core Graphics可能无法正确处理混合颜色空间。

+0

我已经尝试了所有颜色创作的变化,我知道,不幸的是没有骰子。有没有一种特定的创作形式可行? – pwightman

+0

嘿,@paiv。猜猜...你为我们工作。在示例项目的分支中,您添加了以下代码行:https://github.com/paiv/MaskBugWideColorDisplays/blob/1f133ce49b326de4ba3b4937a7d778ae60d442da/MaskBugWideColorDisplays/MaskView.swift#L31 –

+0

由于其他赏金过期,我打开了一个新的所以我可以奖励你。幸运的是,新的奖金必须超过最后一次,所以你得到了前一次奖金的两倍。感谢您的帮助!如果你不介意更新你的答案,所以它反映了正确的解决方案,我会奖励你的赏金! –