0

Blender のマスク機能と同様に、iOS で 2 つの画像間で選択的なマスキングを行いたいと考えています。2 つの画像 1 と 2 があります (同じサイズにリサイズ)。最初は画像 1 のみが表示されますが、ユーザーが画像 1 の任意の領域に触れると、画像は透明になり、それらの領域で画像 2 が表示されます。

タッチムーブでコアグラフィックスを使ってマスク風画像を作成しました。それは基本的に、私が触れたところに白い部分がある完全な黒のイメージです. アルファは全体で 1.0 に設定されています。この画像をマスクとして使用し、独自の画像処理メソッドを実装して必要なことを行います。このメソッドは、各ピクセルを反復処理し、チェックして、それに応じた値を設定します。現在、このメソッドはタッチ ムーブ内で呼び出されるため、私のメソッドはプロセス全体を遅くする可能性があります (特に 8MP カメラ画像の場合)。

大きな画像で実行するのに十分効率的なQuartz CoreまたはCore Graphicsを使用して、これをどのように達成できるかを知りたいです。

私がこれまでに持っているコード:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    mouseSwiped = YES;

    UITouch *touch = [touches anyObject];
    CGPoint currentPoint = [touch locationInView:staticBG];

    UIGraphicsBeginImageContext(staticBG.frame.size);
    [maskView.image drawInRect:CGRectMake(0, 0, maskView.frame.size.width, maskView.frame.size.height)];

    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 20.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 1.0, 1.0, 0.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());

    maskView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    lastPoint = currentPoint;
    mouseMoved++;
    if (mouseMoved == 10)
        mouseMoved = 0;

    staticBG.image = [self maskImage:staticBG.image withMask:maskView.image];
    //maskView.hidden = NO;
}  

- (UIImage*) maskImage:(UIImage *)baseImage withMask:(UIImage *)maskImage
{
    CGImageRef imgRef = [baseImage CGImage];
    CGImageRef maskRef = [maskImage CGImage];
    CGImageRef actualMask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                          CGImageGetHeight(maskRef),
                                          CGImageGetBitsPerComponent(maskRef),
                                          CGImageGetBitsPerPixel(maskRef),
                                          CGImageGetBytesPerRow(maskRef),
                                          CGImageGetDataProvider(maskRef), NULL, false);
    CGImageRef masked = CGImageCreateWithMask(imgRef, actualMask);
    return [UIImage imageWithCGImage:masked];
}

maskImage メソッドは、アルファ値に応じてマスク イメージを作成するため、機能していません。私はこのリンクを通過しました:パスからマスクを作成していますが、答えがわかりません。

4

3 に答える 3