2017-10-18 21 views
9

Bir maskeyi uygulayarak bir görüntüyü işleyen bir UIView alt sınıfım var. Maskenin tamamen şeffaf olduğu Geniş Renk Gamı ekranına (en yeni iPad Artıları) sahip olanlar hariç tüm cihazlarda (yalnızca iPad'de) mükemmel çalışır (kullanıcı görünümünde olmadığı gibi görünür). İlgili init/drawRect kod şuna benzer:CGImage maskesi, Geniş Renk Gamı ekranlarında çalışmıyor

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

(vb bağlamda, nedeni pixels, alphaPixels için gerekli olan maske etkileyecek bağlam içine çekiyor sınıftaki diğer kod kaynaklanmaktadır).

Geniş renk gamı ​​ekranının bu durumu neden etkilediği veya düzeltmek için neler yapılabileceği hakkında bir fikriniz var mı? Renk alanıyla ilgili bir şey olabileceğini düşündüm, ancak dokümanlar açıkça maskenin CGColorSpaceCreateDeviceGray'u düzgün çalışması için kullanması gerektiğini açıkça belirtiyor (ki bu gerçekten doğrudur). http://d.pr/f/IS4SEF

+0

Bu, iPhoneX'te bir sorun mu (geniş renk gamına sahip)? Simülatörlerde yeniden üretilebilir mi? – paiv

+0

Doğru ve kötü sonuç görüntülerini bağlayabilir misiniz? – paiv

+0

@paiv Bu sadece bir iPad uygulaması ve iPhone X'in de bulunmadığından emin değiliz. Çalışmayacağını farz ediyorum. Simülatörde, sadece cihazda çoğaltılamaz. Soruma bir örnek projeyle bağlantı kurdum. Herhangi bir yardım için teşekkürler! – pwightman

cevap

2

tartışmadan sonra Güncelleme:

konu CFData işlenmesi gibi görünüyor

Burada konuyu gösteren bir örnek proje.

CFDataCreateMutable(CFAllocatorRef allocator, CFIndex capacity) 

capacity parametresi "CFData nesnesi ihtiva bayt sayısı" dir. Biz hala ya ekleyerek bayt tarafından, uzunluk özelliği işlemek zorunda ya

CFDataSetLength(pixels, imageWidth * imageHeight) 

Orjinal cevap:

UIColor.black gibi adlandırılmış renkleri kullanarak çalışın. Bunun yerine bileşenlerden renkleri oluşturun. Karışık grafik alanları, Çekirdek Grafikler tarafından doğru şekilde işlenemeyebilir.

+0

Her çeşit renk oluşumunu denedim, ne yazık ki zar yok. Çalışmakta olan belirli bir yaratım şekli var mı? – pwightman

+0

Hey, @paiv. Tahmin et, bizim için çalışıyorsun. Örnek projedeki çatala, şu kod satırını eklediniz: https://github.com/paiv/MaskBugWideColorDisplays/blob/1f133ce49b326de4ba3b4937a7d778ae60d442da/MaskBugWideColorDisplays/MaskView.swift#L31 –

+0

Diğer ödülün süresi dolduğundan yeni bir tane açtım. ben de sana ödül verebilirim. Şansın olacağı gibi, yeni ödülün en sondan daha fazla olması gerekiyor, yani bir öncekini ikiye katlıyorsun. Yardım için teşekkürler! Cevabınızı güncellemeyi düşünmüyorsanız, doğru çözümü yansıtırsa, size ödül vereceğim! –