1

我正在尝试使用滤镜创建带有蒙版的图像。我有 3 张图片,所有图片都具有相同的大小:

(lldb) p img1.size
(CGSize) $33 = (width=369, height=370)
(lldb) p img2.size
(CGSize) $34 = (width=369, height=370)
(lldb) p img3.size
(CGSize) $36 = (width=369, height=370)

然后我为他们分配 CIImages:

CIImage *inputImage = [[CIImage alloc] initWithCGImage:img1.CGImage options:nil];
CIImage *bgImage = [[CIImage alloc] initWithCGImage:img2.CGImage options:nil];
CIImage *maskImage = [[CIImage alloc] initWithCGImage:img3.CGImage options:nil];

并使用给定的 CIImages 创建 CIFilter:

CIFilter *filter = [CIFilter filterWithName:@"CIBlendWithMask"];
[filter setValue:inputImage forKey:@"inputImage"];
[filter setValue:bgImage forKey:@"inputBackgroundImage"];
[filter setValue:maskImage forKey:@"inputMaskImage"];
CIImage *outputImage = [filter outputImage];

但是,当我试图像这样获得 outputImage 时:

CGImageRef outputRef = [_context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *result = [UIImage imageWithCGImage:outputRef];
CGImageRelease(outputRef);

结果图像有奇怪的大小:

(lldb) p outputImage.size
(CGSize) $37 = (width=738, height=740)

当我查看图像时,它位于左下角(CGContext 倒 Y 轴)并且具有这 3 个初始图像的大小(宽度 = 369,高度 = 370),其余图像大小为空(alpha = 0.0f)。面膜涂在整个区域,没关系。

可能很重要,一开始我会做这样的事情:

UIGraphicsBeginImageContextWithOptions(img2.size, NO, 0.0);
UIImage *img1 = UIGraphicsGetImageFromCurrentImageContext(); // transparent image
[anotherImg drawInRect:CGRectMake(0,0,img2.size.width,img2.size.height)];
UIImage *img3 = UIGraphicsGetImageFromCurrentImageContext(); // mask image with proper size
UIGraphicsEndImageContext();

当我在过滤器中使用 anotherImage 而不是 img3 作为遮罩时,输出图像的大小正确(img2 绘制在整个区域而不是 1/3 上)但是遮罩更小(大小的 1/3,而它应该是整个区域)。所以相反的情况。

我究竟做错了什么?如何修复它,所以我在整个区域上都绘制了图像和蒙版?注意 - 我必须使用过滤器,不能在 cgcontext 中使用蒙版绘制

4

1 回答 1

1

You forgot about scaling to retina. This should help:

UIGraphicsBeginImageContextWithOptions(img2.size, NO, img2.scale);
于 2013-08-28T12:45:07.253 回答