私は何らかの検閲アプリを構築しています。私は今まで私のiPhoneで撮った画像をピクセル化することができます。CALayersからの画像を描画
は、しかし、私は最終的にこのような画像を実現したい:
http://images-mediawiki-sites.thefullwiki.org/11/4/8/8/8328511755287292.jpgは、だから私の考えは完全に私の画像をピクセル化して、所望の効果を達成するために、その上にマスクを追加することでした。レイヤーの面では、originalImage + maskedPixelatedVersionOfImage ..のようになります。イメージに触れるときにマスクをアニメートし、マスクを目的のサイズに合わせることを考えていました。画像上に指を置くほど、マスクは大きくなります。
一部の検索の後、これはCALayersとCAAnimationを使用して行うことができます。しかし、どのようにしてそれらのレイヤーを画像に合成して、iPhoneの写真集に保存することができますか?
私はここに正しいアプローチをとっていますか?
EDIT:
さて、私は私はまだ私が欲しいもの届かないものの、オレのソリューションが正しいものであると思います。私が使用したコードは次のとおりです。私のImageViewの中のSO
CALayer *maskLayer = [CALayer layer];
CALayer *mosaicLayer = [CALayer layer];
// Mask image ends with 0.15 opacity on both sides. Set the background color of the layer
// to the same value so the layer can extend the mask image.
mosaicLayer.contents = (id)[img CGImage];
mosaicLayer.frame = CGRectMake(0,0, img.size.width, img.size.height);
UIImage *maskImg = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"mask" ofType:@"png"]];
maskLayer.contents = (id)[maskImg CGImage];
maskLayer.frame = CGRectMake(100,150, maskImg.size.width, maskImg.size.height);
mosaicLayer.mask = maskLayer;
[imageView.layer addSublayer:mosaicLayer];
UIGraphicsBeginImageContext(imageView.layer.bounds.size);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *saver = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Iした:setImage、写真の元の(未編集)バージョンがあります。その上にサブレイヤーmosaicLayerを追加します。サブレイヤーにはマスクプロパティーmaskLayerがあります。私はimageViewのルートレイヤをレンダリングすることですべてがOKになると思っていました。それは間違っていますか?
また、私は何かを考え出しました。私のマスクは伸びて回転していますが、私は想像するとimageOrientationと何か関係がありますか?誤って私の図書館にmosaicLayerを保存したことに気がつきました。マスクが私のイメージの間違った部分を隠すように見えるという問題も説明しています...
ありがとう、私はこれを試してみます。私は残りの部分に正しいアプローチをしていると思いますか? – ThomasM
この方法は、バックグラウンドスレッドでレンダリングを行うことを妨げることに注意する価値があります。スレッドセーフティが必要な場合は、 'UI'関数を避け、独自の' CGBitmapContext'を作成してください:http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CGBitmapContext/Reference/reference.html –
これはライブカメラフレームを表示するためにAVCaptureVideoPreviewLayerを使用していた場合、AVCaptureVideoPreviewLayerからその画像をキャプチャできないことがあります。 –