2017-08-07 1 views
1

Essayer de masquer une image avec mon masque personnalisé. Je pense que je suis correctement the ideas, mais pour une raison quelconque, l'image n'est pas masquée. Au lieu de cela, l'image masquée, créée après le masquage, contient l'image recadrée originale car le masque n'a pas été appliqué.masquage UIImage ne fonctionne pas (Swift, iOS 10)

Voici le code de jeu Swift que l'on peut utiliser pour tester mon code (l'image et le masque sont attachés, il suffit de les déposer dans le dossier des ressources):

import UIKit 

extension UIImage { 
    static func resizeImage(image: UIImage, width: CGFloat) -> UIImage { 
     let scale = width/image.size.width 
     let newHeight = round(image.size.height * scale) 
     UIGraphicsBeginImageContextWithOptions(CGSize(width:width, height:newHeight), false, image.scale) 

     image.draw(in: CGRect(origin: CGPoint(x:0, y:0), size: CGSize(width: width, height: newHeight))) 
     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return newImage! 
    } 

    static func resizeImage(image: UIImage, height: CGFloat) -> UIImage { 
     let scale = height/image.size.height 
     let newWidth = round(image.size.width * scale) 
     UIGraphicsBeginImageContextWithOptions(CGSize(width:newWidth, height:height), false, image.scale) 
     image.draw(in: CGRect(origin: CGPoint(x:0, y:0), size: CGSize(width: newWidth, height: height))) 
     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return newImage! 
    } 
} 

let image = UIImage(named: "image.jpg")! 
var mask = UIImage(named: "mask.jpg")! 

let k1 = image.size.width/image.size.height 
let k2 = mask.size.width/mask.size.height 

if k1 >= k2 
{ 
    mask = UIImage.resizeImage(image: mask, height: image.size.height) 
} 
else 
{ 
    mask = UIImage.resizeImage(image: mask, width: image.size.width) 
} 

image 
mask 

let center = CGPoint(x: image.size.width/2, y: image.size.height/2) 
let croppingRect = CGRect(x: abs(image.size.width-mask.size.width)/2*image.scale, 
            y: abs(image.size.height-mask.size.height)/2*image.scale, 
            width: mask.size.width*image.scale, 
            height: mask.size.height*image.scale).integral 
let maskReference = mask.cgImage! 
let imageReference = image.cgImage!.cropping(to: croppingRect)! 
let imageMask = CGImage(maskWidth: maskReference.width, 
         height: maskReference.height, 
         bitsPerComponent: maskReference.bitsPerComponent, 
         bitsPerPixel: maskReference.bitsPerPixel, 
         bytesPerRow: maskReference.bytesPerRow, 
         provider: maskReference.dataProvider!, decode: nil, shouldInterpolate: true) 

imageMask?.colorSpace 
imageMask?.alphaInfo 

let maskedReference = imageReference.masking(imageMask!) 
let maskedImage = UIImage(cgImage:maskedReference!, scale: image.scale, orientation: image.imageOrientation) 

mask image

Répondre

0

Swift 4+

let icon = UIImageView(image: YOURIMAGE) 
icon.frame = CGRect(x:100, y: 100, width: 100, height: 100) 
icon.layer.masksToBounds = true 
let maskView = UIImageView() 
maskView.image = YOURMASKIMAGE 
maskView.frame = icon.bounds 
icon.mask = maskView 
icon.contentMode = .scaleToFill 
icon.clipsToBounds = true 
view.addSubview(icon)