2017-08-07 101 views
1

试图用我的自定义遮罩遮罩图像。我认为我正确地按照the ideas,但由于某种原因,图像不被蒙上。取而代之的是,在蒙版后创建的蒙版图像包含原始裁剪图像,因为未应用蒙版。UIImage遮罩不起作用(Swift,iOS 10)

这里的哪一个可以为了用它来测试我的代码斯威夫特游乐场代码(图像和面罩连接,只需将它们拖放到资源文件夹):

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

回答

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)