IOS:在保留Retina比例因素的情况下对图像进行遮罩处理

6
我想通过传递另一张图片作为遮罩来掩盖一张图片。我能够掩盖图片,但结果图片看起来不好。边缘处有锯齿状。
我猜问题与视网膜图形有关。两个图像的比例属性不同,如下:
1. 我要掩盖的图像具有比例值 1。该图像通常具有大于 1000x1000 像素的分辨率。 2. 我想要基于其生成只有黑白颜色的结果图像(即带有遮罩效果)的图像具有比例值 2。该图像通常具有分辨率 300x300 像素。 结果图像的比例值为 1。
我正在使用的代码是:
+ (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

CGImageRef maskRef = maskImage.CGImage;

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGImageGetDataProvider(maskRef), NULL, false);


CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
CGImageRelease(mask);
UIImage *maskedImage = [UIImage imageWithCGImage:masked ];
CGImageRelease(masked);
return maskedImage;
}

如何获得一个遵循视网膜比例的遮罩图像?

如果有帮助到你,应该考虑验证一个答案。 - kokluch
我在2013年7月3日提出了这个问题,第一个答案是在1月8日。在此期间,我已经转移到其他项目,并且没有检查答案是否有帮助,如果我不确定,那么我怎么能接受任何答案呢?我只想关闭问题,但不知道如何做到这一点。 - Gaurav Singh
不难找到... - kokluch
2个回答

5
您可以做到

UIImage * maskedImage = [UIImage imageWithCGImage:masked scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp];

5

我也遇到了同样的问题。看起来这行代码忽略了比例因素。

UIImage *maskedImage = [UIImage imageWithCGImage:masked];

因此,您需要自己绘制图像。请用以下内容替换它:
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0);

CGContextRef context = UIGraphicsGetCurrentContext();

CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);

CGContextDrawImage(context, rect, masked);

UIImage * maskedImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

对我来说工作得很好。

编辑

或者

UIImage * maskedImage = [UIImage imageWithCGImage:masked 
                                            scale:[[UIScreen mainScreen] scale] 
                                      orientation:UIImageOrientationUp];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接