私は2つの画像を持っています 1.元の画像 2.マスク画像
元の画像をマスク画像でマスクしたいのですが、以下のコードを使用して行います。
- (UIImage *) maskImage:(UIImage *)originalImage : (NSString *)maskImageName
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
UIImage *maskImage = [UIImage imageNamed:maskImageName];
CGImageRef maskImageRef = [maskImage CGImage];
CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskImage.size.width, maskImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);//kCGImageAlphaPremultipliedLast
CGColorSpaceRelease(colorSpace);
if (mainViewContentContext == NULL)
{
return NULL;
}
CGFloat ratio = 0;
ratio = maskImage.size.width/ originalImage.size.width;
if(ratio * originalImage.size.height < maskImage.size.height)
{
ratio = maskImage.size.height/ originalImage.size.height;
}
CGRect rect1 = {{0, 0}, {maskImage.size.width, maskImage.size.height}};
CGRect rect2 = {{-((originalImage.size.width*ratio)-maskImage.size.width)/2 , -((originalImage.size.height*ratio)-maskImage.size.height)/2}, {originalImage.size.width*ratio, originalImage.size.height*ratio}};
CGContextClipToMask(mainViewContentContext, rect1, maskImageRef);//rect1
CGContextDrawImage(mainViewContentContext, rect2, originalImage.CGImage);//rect2
CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext);
CGContextRelease(mainViewContentContext);
UIImage *theImage = [UIImage imageWithCGImage:newImage];
CGImageRelease(newImage);
CGImageRelease(maskImageRef);
CGColorSpaceRelease(colorSpace);
return theImage;
}
ただし、この方法で元の画像よりも画像をマスキングすると、マスク形状でサイズが変更されます
私の要件は
元画像のズーム、移動、ジェスチャによる回転
マスキングしたい後
元の画像のサイズを変更せずにマスクする場合(変更されているか変更されていない場合)、マスクの形状とその他の透明部分のトリミングのみを配置します。
画像の色部分のみをマスクしたい他の部分は透明になるため、マスク画像の色付き部分のみを含む元の画像と他の部分はトリミングされず、元の画像がズームされた部分よりもズームされると、元の画像ではなくマスクで覆われます。