UIImage遮罩适配问题求助:不同尺寸图片遮罩失效
解决UIImage遮罩的尺寸适配问题
我太懂这种烦躁了——当遮蒙版和要处理的婴儿面部图尺寸不一样时,直接用CGImageMaskCreate就会罢工,毕竟这套API对尺寸一致性要求特别严格。你的问题核心就是先让两张图尺寸统一,再执行遮罩逻辑,下面给你调整后的完整实现方案:
核心思路
- 先获取蒙版图像的尺寸,将婴儿面部图缩放到和蒙版完全一致的尺寸(可根据需求选择填充/适应模式)
- 用尺寸统一后的婴儿图和蒙版执行标准遮罩操作
修正后的完整代码
- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage { // 1. 统一尺寸:把目标图缩放到蒙版的尺寸 CGSize maskSize = maskImage.size; UIGraphicsBeginImageContextWithOptions(maskSize, NO, image.scale); [image drawInRect:CGRectMake(0, 0, maskSize.width, maskSize.height) contentMode:UIViewContentModeScaleAspectFill clipsToBounds:YES]; UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // 2. 执行标准遮罩逻辑 CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef maskedImageRef = CGImageCreateWithMask(scaledImage.CGImage, mask); UIImage* maskedImage = [UIImage imageWithCGImage:maskedImageRef scale:image.scale orientation:image.imageOrientation]; // 手动释放Core Graphics资源,避免内存泄漏 CGImageRelease(mask); CGImageRelease(maskedImageRef); return maskedImage; }
关键细节说明
- 尺寸适配模式:代码里用了
UIViewContentModeScaleAspectFill(裁剪多余部分保证填满蒙版),如果需要婴儿面部完整显示(可能留空白),可以改成UIViewContentModeScaleAspectFit - Retina适配:用
UIGraphicsBeginImageContextWithOptions传入原图像的scale,避免生成模糊的低分辨率图片 - 内存管理:Core Graphics的
CGImageRef对象不会被ARC自动管理,必须手动调用CGImageRelease释放
这样不管两张图初始尺寸是否相同,都能稳定生成正确的遮罩效果啦。
内容的提问来源于stack exchange,提问作者Sohel L.
相关产品推荐
相关产品推荐

