ios 如何将蒙版应用于具有不同灰度值的图像?

qgzx9mmu  于 2023-07-01  发布在  iOS
关注(0)|答案(1)|浏览(134)

我正试着把这个蒙版应用到原始图像上

注意有一些灰色区域,我想保留除了纯黑色之外的所有内容。
我找到了这个密码

func maskImage(image: UIImage, mask: UIImage) -> UIImage {
    let imageReference = (image.cgImage)!
    let maskReference = (mask.cgImage)!

    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
    )

    return (UIImage(cgImage: (imageReference.masking(imageMask!))!))
}

但它做的恰恰相反,它删除了所有的白色像素。

ubbxdtey

ubbxdtey1#

func maskImage(image: UIImage, mask: UIImage) -> UIImage {
    let imageReference = image.cgImage!
    let maskReference = mask.cgImage!
    
    let width = maskReference.width
    let height = maskReference.height
    let bitsPerComponent = maskReference.bitsPerComponent
    let bitsPerPixel = maskReference.bitsPerPixel
    let bytesPerRow = maskReference.bytesPerRow
    
    let context = CGContext(
        data: nil,
        width: width,
        height: height,
        bitsPerComponent: bitsPerComponent,
        bytesPerRow: bytesPerRow,
        space: CGColorSpaceCreateDeviceGray(),
        bitmapInfo: CGImageAlphaInfo.none.rawValue
    )
    
    context!.draw(maskReference, in: CGRect(x: 0, y: 0, width: width, height: height))
    
    let maskImage = context!.makeImage()!
    
    let maskedReference = imageReference.masking(maskImage)!
    
    return UIImage(cgImage: maskedReference)
}

这段代码专门为蒙版图像创建了一个新的CGContext,并将颜色空间设置为灰度(CGColorSpaceCreateDeviceGray()),以确保只有黑色像素被视为不透明。CGImageAlphaInfo.none参数用于指定遮罩图像没有Alpha通道。
通过将maskReference绘制到context中,创建了具有保留所有非黑色像素的期望行为的遮罩。然后,使用maskImage来掩蔽imageReference,从而产生具有所需效果的图像。

相关问题