2017-10-18 10 views
9

마스크가 적용된 이미지를 렌더링하는 UIView 하위 클래스가 있습니다. 그것은 마스크가 완전히 투명하게 렌더링되는 와이드 컬러 노출 영역 디스플레이 (최신 iPad Pro)가있는 경우를 제외하고 모든 장치 (iPad 전용)에서 완벽하게 작동합니다 (보기와 같이 사용자에게는 보이지 않습니다). 관련 초기화 /의 drawRect 코드는 다음과 같습니다CGImage 마스크가 Wide Color Gamut 디스플레이에서 작동하지 않습니다.

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() 
} 

(등 상황, 이유 pixels, alphaPixels의 경우, 필요한 마스크에 영향을 미치는 상황으로 그리는 수업 시간에 다른 코드로 인해)입니다.

왜 넓은 색 영역 표시가이 문제에 영향을 미치는지 또는 문제를 해결하기 위해 무엇을 할 수 있는지 생각해보십시오. 나는 그것이 색 공간과 관련이있을 것이라고 생각했지만, 문서는 정확히 마스크가 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 객체에 포함될 수있는 최대 바이트 수는"이다. 우리는 여전히 하나 추가 바이트, 길이 속성을 처리하기 위해, 또는

CFDataSetLength(pixels, imageWidth * imageHeight) 

원래 답 :

UIColor.black처럼라는 이름의 색상을 사용하지보십시오. 구성 요소에서 색상을 대신 작성하십시오. 혼합 된 색상 공간은 Core Graphics에서 제대로 처리하지 못할 수 있습니다.

+0

저는 불행히도 주사위가 없다는 것을 알고있는 모든 색상 변형을 시도했습니다. 특정 형식의 창조물이 효과가 있습니까? – pwightman

+0

안녕하세요, @paiv. 맞춰 ... 우리에게 일하게 해줄거야. 샘플 프로젝트 포크에서 다음 코드 줄을 추가했습니다. https://github.com/paiv/MaskBugWideColorDisplays/blob/1f133ce49b326de4ba3b4937a7d778ae60d442da/MaskBugWideColorDisplays/MaskView.swift#L31 –

+0

다른 현상금이 만료되었으므로 새 코드를 열었습니다 그래서 너를 수여 할 수있어. 운이 좋으면 새로운 현상금은 마지막 것보다 많아야합니다. 따라서 이전 현상의 두 배가됩니다. 도와 주셔서 감사합니다! 올바른 해결책을 반영하도록 답변을 업데이트해도 상관 없으면 현상금을 수여합니다! –