フィルターを使用してマスク付きの画像を作成しようとしています。私は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) で、残りの画像サイズは空 (アルファ) です。 = 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();
フィルターで img3 の代わりに anotherImage をマスクとして使用すると、出力画像は正しいサイズになります (img2 は 1/3 ではなく全領域に描画されます)。だから反対の状況。
私は何を間違っていますか?それを修正するにはどうすればよいので、画像とマスクの両方を全領域に描画しますか? 注意として-フィルターを使用する必要があり、 cgcontext でマスクを使用して描画できません。