4

ユーザーが画面を記録できる機能を iPhone アプリに追加しようとしています。これを行うために、メソッドを介してメイン ビューの一連のスクリーンショットをコンパイルするScreenCaptureViewというオープン ソース クラスを使用しました。renderInContext:ただし、このメソッドは、私のアプリにとって重要なマスクされた CALayers を無視します。

編集: マスクが含まれるように画面を記録する方法が必要です。この質問では、画像マスクの錯覚を作成する方法を明確に求めていますが、画面を正常に記録するために行うことができるその他の変更を受け入れます。

アプリの説明

アプリでは、写真を撮り、下に示すように、顎領域の位置をアニメーション化することで、口が動く効果を作成します。

ここに画像の説明を入力 ここに画像の説明を入力

現在、顔全体を 1 つの CALayer として、あごの領域を別の CALayer として持っています。あごのレイヤーを作成するために、CGPath を使用して顔全体からあごの領域をマスクします。(このパスは不規則な形状であり、動的でなければなりません)。

ここに画像の説明を入力

- (CALayer *)getChinLayerFromPic:(UIImage *)pic frame:(CGRect)frame {


    CGMutablePathRef mPath = CGPathCreateMutable();
    CGPathMoveToPoint(mPath, NULL, p0.x, p0.y);
    CGPoint midpt = CGPointMake( (p2.x + p0.x)/2, (p2.y+ p0.y)/2);
    CGPoint c1 = CGPointMake(2*v1.x - midpt.x, 2*v1.y - midpt.y); //control points
    CGPoint c2 = CGPointMake(2*v2.x - midpt.x, 2*v2.y - midpt.y);

    CGPathAddQuadCurveToPoint(mPath, NULL, c1.x, c1.y, p2.x, p2.y);
    CGPathAddQuadCurveToPoint(mPath, NULL, c2.x, c2.y, p0.x, p0.y);

    CALayer *chin = [CALayer layer];
    CAShapeLayer *chinMask = [CAShapeLayer layer];
    chin.frame = frame;
    chin.contents = (id)[pic CGImageWithProperOrientation];
    chinMask.path = mPath;
    chin.mask = chinMask;
    CGPathRelease(mPath);
    return chin;

}

次に、あごのレイヤーをパス アニメーションでアニメーション化します。

前述のように、このrenderInContext:メソッドはマスクを無視し、あごだけでなく顔全体の画像を返します。あごを隠しているような錯覚を作り出す方法はありますか? できればアニメーションには CALayers が便利なので使いたいと思っています。ただし、ビデオをキャプチャする他の方法を含め、あらゆるアイデアを受け入れます。ありがとう。

編集: トリミングされたあごを UIImage に変換し、レイヤーを直接マスクする代わりに、その新しい画像をレイヤーのコンテンツとして設定します。ただし、トリミングされた領域は、指定されたパスの逆です。

 CALayer *chin = [CALayer layer];
 chin.frame = frame;   
 CGImageRef imageRef = [pic CGImage];
 CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
 int targetWidth = frame.size.width;
 int targetHeight = frame.size.height;
 CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);

 CGContextRef bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
    CGContextAddPath(bitmap, mPath);
    CGContextClip(bitmap);
    CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);
    CGImageRef ref = CGBitmapContextCreateImage(bitmap);
    UIImage *chinPic = [UIImage imageWithCGImage:ref];
    chin.contents = (id)[chinPic CGImageWithProperOrientation];
4

4 に答える 4

0

layer.renderInContextを調べてみましたが、layer.mask は考慮されていませんか? ?

特に (座標反転に注意してください):

//Make the drawing right with coordinate switch
CGContextTranslateCTM(context, 0, cHeight);
CGContextScaleCTM(context, 1.0, -1.0);

CGContextClipToMask(context, CGRectMake(maskLayer.frame.origin.x * mod, maskLayer.frame.origin.y * modTwo, maskLayer.frame.size.width * mod,maskLayer.frame.size.height * modTwo), maskLayer.image.CGImage);

//Reverse the coordinate switch
CGAffineTransform ctm = CGContextGetCTM(context);
ctm = CGAffineTransformInvert(ctm);
CGContextConcatCTM(context, ctm);
于 2013-07-01T19:40:35.700 に答える
0

各パーツを単独で描画し (マスクは必要ありません)、あごのない顔とあごを両方ともアルファ ピクセルで描画してから、あごを描画してパス上に移動することをお勧めします..

これが役に立たなかった場合はお知らせください。

于 2013-06-14T01:58:31.830 に答える