1

私はこのようなマスキングを達成することができます:

CGAffineTransform t = self.imageForEditing.transform;

    NSLog(@"x offset: %f, y offset: %f", self.imageForEditing.frame.origin.x, self.imageForEditing.frame.origin.y);
    NSLog(@"scale: %f", sqrt(t.a * t.a + t.c * t.c));

    UIImage *maskImage = [UIImage imageNamed:@"faceMask"];
    UIImage *colorsImage = [self.imageForEditing.image imageRotatedByDegrees:180];

    CGImageRef maskRef = maskImage.CGImage;
    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                             CGImageGetHeight(maskRef),
                                             CGImageGetBitsPerComponent(maskRef),
                                             CGImageGetBitsPerPixel(maskRef),
                                             CGImageGetBytesPerRow(maskRef),
                                             CGImageGetDataProvider(maskRef), NULL, false);

    CGImageRef maskedRef = CGImageCreateWithMask(colorsImage.CGImage, imageMask);
    UIImage *maskedImage = [UIImage imageWithCGImage:maskedRef];

ログステートメントで、元の画像が移動および/または拡大縮小された量にアクセスできることがわかります。新しいマスクされた画像がそれを考慮に入れるように、この情報をどのように適用できますか?マスクが画面の中央にある円形の切り欠きであると想像してください。self.imageForEditing(UIImageView)は移動できます。新しい画像が作成されるとき、それは切り欠きを通して見える部分だけでなければなりません。上記のコードは機能しますが、基になる画像の移動/スケーリングは考慮されていません。

編集:画像ビューの現在の状態(self.imageForEditing)に基づいて新しい画像を作成する方が簡単かもしれないと思います。コンテナself.editContainer内にあります。では、self.editContainerに含まれている現在のピクセルに基づいて新しい画像を作成するにはどうすればよいですか?

4

1 に答える 1

0

最後に、コンテナー ビューを画像としてレンダリングし、見つけた UIImage カテゴリを使用して透明なピクセルをトリミングすることで、これを解決しました。それが誰かを助ける場合:

コンテナーの uiview で:

    UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);

    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
于 2013-02-26T20:55:11.863 に答える