【问题标题】:UIImage masking doesn't work (Swift, iOS 10)UIImage 屏蔽不起作用(Swift、iOS 10)
【发布时间】:2017-08-07 02:14:14
【问题描述】:

尝试使用我的自定义蒙版屏蔽图像。我想我正确地遵循了the ideas,但由于某种原因,图像没有被掩盖。相反,蒙版后创建的蒙版图像包含原始裁剪图像,因为未应用蒙版。

这是一个可以用来测试我的代码的 Swift Playground 代码(附加了图像和掩码,只需将它们放到资源文件夹中):

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)

【问题讨论】:

    标签: ios swift uiimage image-masking


    【解决方案1】:

    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)
    

    【讨论】:

    • 除了这个之外,没有其他解决方案对我有用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2023-03-28
    • 1970-01-01
    • 2015-02-26
    • 2019-07-13
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多