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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:24:34