2013-10-14 4 views
7

私はPhotoshopモックアップを複製するUIImageでガウスのぼかしを実行しようとしています。範囲外のUIImageをぼかします(Photoshopスタイル)

所望の行動:Photoshopで 、Iは、ガウスぼかしフィルタを実行すると、画像層はぼやけたエッジの結果として大きくなります。

観測された動作: GPUImageを使用すると、UIImagesを正常にぼかすことができます。ただし、新しいイメージは元の境界で切り取られ、ハードエッジが残っています。

設定UIImageView.layer.masksToBounds = NO;は、画像がビューではなく切り取られるので、助けになりません。

また、ぼかし、サイズ変更する前に、UIImageをよりクリアな画像の中央に配置してみました。これも役に立たなかった。

この「Photoshopスタイル」のぼかしを実現する方法はありますか?

enter image description here

UPDATE作業溶液ブラッド・ラーソンの感謝:

UIImage sourceImage = ... 
GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:sourceImage]; 
GPUImageTransformFilter *transformFilter = [GPUImageTransformFilter new]; 
GPUImageFastBlurFilter *blurFilter = [GPUImageFastBlurFilter new]; 

//Force processing at scale factor 1.4 and affine scale with scale factor 1/1.4 = 0.7 
[transformFilter forceProcessingAtSize:CGSizeMake(SOURCE_WIDTH * 1.4, SOURCE_WIDTH * 1.4)]; 
[transformFilter setAffineTransform:CGAffineTransformMakeScale(0.7, 0.7)]; 

//Setup desired blur filter   
[blurFilter setBlurSize:3.0f]; 
[blurFilter setBlurPasses:20]; 

//Chain Image->Transform->Blur->Output   
[imageSource addTarget:transformFilter]; 
[transformFilter addTarget:blurFilter]; 
[imageSource processImage]; 

UIImage *blurredImage = [blurFilter imageFromCurrentlyProcessedOutputWithOrientation:UIImageOrientationUp]; 
+0

"ぼかしを行う前に大きな鮮明な画像の上にUIImageを配置しようとしました"ということは、元の画像を大きなUIImageにマージしたということですか?その場合は、鮮明な画像の代わりに白い画像を使用し、白い画像にアルファチャンネルが付いていることを確認してください。私は、鮮明な画像にはアルファがないと思われ、結果は切り取られて見えます。 – bobnoble

答えて

7

GPUImageは、画像の制限まで処理された結果のみを生成します。あなたのイメージを超えて拡大するには、それが動作するキャンバスを拡張する必要があります。

これを行うには、画像をGPUImageTransformFilterに送り、次に-forceProcessingAtSize:または-forceProcessingAtSizeRespectingAspectRatio:を使用して作業領域を拡大します。しかし、これはデフォルトでイメージを拡大するので、それに対処するために、GPUImageTransformFilterでスケール変換を使用して、より広い領域に相対的なイメージのサイズを縮小します。これにより、同じピクセル寸法で、より大きな全体像内に配置することができます。

この出力をぼかしフィルタに入力するだけで、ぼかしは元の画像のエッジを超えて拡大されます。画像を強制的に表示するサイズは、元の画像のエッジを越えてぼかしをどのくらい伸ばす必要があるかによって異なります。

+1

ありがとうブラッド!これはまさに私が必要としていたものです!参照する人のための作業コードで私の答えを更新します。 – nighthawk454

1

ぼかしに調整するUIImageViewの境界のサイズを変更してください。ビューは、その範囲外のものをクリップします。あなたの例では、Photoshopでぼかされたボックスは元の画像より約20%大きく見えます。

UIImageView *image; 
image.layer.bounds = CGRectMake(0, 
           0, 
           image.layer.bounds.size.width + 5, 
           image.layer.bounds.size.height + 5);