You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何使用遮罩图片?实现UIImageView遮罩时黑色区域透明

解决UIImageView遮罩图片黑色转透明的问题

嘿,这个问题我刚好处理过!首先得先搞清楚UIView遮罩的核心逻辑:遮罩视图的alpha通道才是控制原视图显示/隐藏的关键,RGB颜色本身不影响——alpha为1的区域会让原视图对应位置显示,alpha为0的区域会让原视图对应位置隐藏。

你想要把遮罩图的黑色部分变成透明,本质是要让黑色区域的alpha值变为0(如果要隐藏原视图)或者变为1(如果要显示原视图),下面分两种常见场景给你代码:

场景1:遮罩图黑色区域隐藏原视图,白色区域显示

这种情况直接把黑色转为透明(alpha=0),白色保留不透明(alpha=1),用CIMaskToAlpha滤镜就能快速实现:

import UIKit
import CoreImage

func convertBlackToTransparentForMask(image: UIImage) -> UIImage? {
    guard let ciImage = CIImage(image: image) else { return nil }
    
    // 使用CIMaskToAlpha将黑白图转为alpha通道:黑→透明(alpha=0),白→不透明(alpha=1)
    guard let maskFilter = CIFilter(name: "CIMaskToAlpha") else { return nil }
    maskFilter.setValue(ciImage, forKey: kCIInputImageKey)
    
    guard let outputCI = maskFilter.outputImage else { return nil }
    let context = CIContext(options: [.useSoftwareRenderer: false])
    guard let outputCG = context.createCGImage(outputCI, from: outputCI.extent) else { return nil }
    
    return UIImage(cgImage: outputCG)
}

// 使用示例
if let processedMaskImage = convertBlackToTransparentForMask(image: MASKIMAGE),
   let maskView = UIImageView(image: processedMaskImage) {
    // 务必让遮罩视图尺寸和原视图一致
    maskView.frame = profileImageView.bounds
    profileImageView.mask = maskView
}

场景2:遮罩图黑色区域显示原视图,白色区域隐藏

如果你的需求是反过来(黑色地方要透出原视图,白色地方遮挡),那就先反转颜色,再转alpha通道:

import UIKit
import CoreImage

func convertBlackToVisibleForMask(image: UIImage) -> UIImage? {
    guard let ciImage = CIImage(image: image) else { return nil }
    
    // 第一步:反转颜色,黑变白,白变黑
    guard let invertFilter = CIFilter(name: "CIColorInvert") else { return nil }
    invertFilter.setValue(ciImage, forKey: kCIInputImageKey)
    guard let invertedCI = invertFilter.outputImage else { return nil }
    
    // 第二步:转为alpha通道,此时原黑色(现在是白色)→alpha=1,原白色(现在是黑色)→alpha=0
    guard let maskFilter = CIFilter(name: "CIMaskToAlpha") else { return nil }
    maskFilter.setValue(invertedCI, forKey: kCIInputImageKey)
    
    guard let outputCI = maskFilter.outputImage else { return nil }
    let context = CIContext(options: [.useSoftwareRenderer: false])
    guard let outputCG = context.createCGImage(outputCI, from: outputCI.extent) else { return nil }
    
    return UIImage(cgImage: outputCG)
}

// 使用示例
if let processedMaskImage = convertBlackToVisibleForMask(image: MASKIMAGE),
   let maskView = UIImageView(image: processedMaskImage) {
    maskView.frame = profileImageView.bounds
    profileImageView.mask = maskView
}

注意事项

  • 确保遮罩视图的frame和profileImageView完全一致,不然遮罩会错位;
  • 如果你的遮罩图不是纯黑白,带有灰色过渡,滤镜也会处理成对应的半透明alpha值,实现渐变遮罩效果;
  • 导入CoreImage框架才能使用这些滤镜。

内容的提问来源于stack exchange,提问作者13thang08

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:52:27