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
相关产品推荐
相关产品推荐

