2016-07-22 21 views
1

Seit einiger Zeit verwenden wir den folgenden Code, um ein Graustufenbild ohne Transparenz zu einem farbigen Bild zu maskieren.Bildmaskierung schlägt auf iOS10 beta3 fehl

Dies funktionierte immer gut, bis Apple iOS 10 Beta 3 veröffentlichte. Plötzlich wurde die Maske nicht mehr angewendet, was dazu führte, dass nur eine quadratische Box mit der angegebenen Farbe zurückgegeben wurde.

Die Logik dahinter kann bei https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html

unter dem Kopf Maskierung ein Bild mit einer Bildmaske

Die Logik dieses Codes zu finden: * Es wurde ein Graustufenbild ohne alpha * Nehmen Erstellen Sie ein Volltonbild mit der angegebenen Farbe * Erstellen Sie eine Maske aus dem gegebenen Bild * Maskieren Sie das Volumenbild mit der erstellten Maske * Ausgabe ist ein maskiertes Bild mit Rücksicht auf Farben dazwischen (gr ay könnte hellrot sein, d. h.).

Hat jemand eine Idee, wie man diese Funktion reparieren kann? Wenn Sie XCode 8 Beta 3 besitzen, können Sie diesen Code und auf einem Simulator unter iOS 10 laufen wird dies richtig arbeiten und auf 10 iOS wird es nur einen viereckigen Kasten

Beispielbild erstellen: Example image

public static func image(maskedWith color: UIColor, imageNamed imageName: String) -> UIImage? { 

    guard let image = UIImage(named: imageName)?.withRenderingMode(.alwaysOriginal) else { 
     return nil 
    } 

    guard image.size != CGSize.zero else { 
     return nil 
    } 

    guard 
     let maskRef = image.cgImage, 
     let colorImage = self.image(with: color, size: image.size), 
     let cgColorImage = colorImage.cgImage, 
     let dataProvider = maskRef.dataProvider 
     else { 
     return nil 
    } 

    guard 
     let mask = CGImage(maskWidth: maskRef.width, height: maskRef.height, bitsPerComponent: maskRef.bitsPerComponent, bitsPerPixel: maskRef.bitsPerPixel, bytesPerRow: maskRef.bytesPerRow, provider: dataProvider, decode: nil, shouldInterpolate: true), 
     let masked = cgColorImage.masking(mask) 
     else { 
     return nil 
    } 

    let result = UIImage(cgImage: masked, scale: UIScreen.main().scale, orientation: image.imageOrientation) 

    return result 
} 

public static func image(with color: UIColor, size: CGSize) -> UIImage? { 

    guard size != CGSize.zero else { 
     return nil 
    } 

    let rect = CGRect(origin: CGPoint.zero, size: size) 

    UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main().scale) 

    defer { 
     UIGraphicsEndImageContext() 
    } 

    guard let context = UIGraphicsGetCurrentContext() else { 
     return nil 
    } 

    context.setFillColor(color.cgColor) 
    context.fill(rect) 

    let image = UIGraphicsGetImageFromCurrentImageContext() 

    return image; 
} 
+0

Irgendwelche Fortschritte dabei? Ich habe ein ähnliches Problem, wenn mehrere CALayers gestapelt und Masken verwendet werden. Hast du dich bei Apple angemeldet? –

+0

Ja, wir haben es bereits an Apple gemeldet. Wir hoffen, dass sie es in der nächsten Betaversion lösen oder andere Optionen ausprobieren (oder hoffen, dass jemand eine nette Lösung hat). –

+0

Ich habe noch keine Fortschritte bei meinem Problem gemacht. Ein Beispielprojekt, um das Problem zu reproduzieren, hat nicht das Problem :-(. Es ist wie der CALayer ist die Quantisierung der Bilddaten auf weniger Bits, da es mehr Kind Ebenen enthält. –

Antwort

0

Dieses Problem wurde in iOS10 Beta 4 gelöst.