2013-10-14 13 views
7

Sto provando a eseguire una sfocatura gaussiana su una UIImage che replica il mio mockup di photoshop.Sfocatura UIImmagine fuori dai limiti (stile Photoshop)

comportamento desiderato: In Photoshop, quando si esegue un filtro sfocatura gaussiana, il livello dell'immagine diventa più grande a causa dei bordi sfocati.

Comportamento osservato: Utilizzo di GPUImage, riesco a sfocare correttamente i miei UIImages. Tuttavia, la nuova immagine viene ritagliata ai limiti originali, lasciando un bordo duro tutto intorno.

L'impostazione UIImageView.layer.masksToBounds = NO; non aiuta, poiché l'immagine è ritagliata non vista.

Ho anche provato a mettere l'UIImage centrato su un'immagine più grande e trasparente prima di sfocare e quindi ridimensionare. Anche questo non ha aiutato.

C'è un modo per ottenere questa sfocatura in stile "Photoshop"?

enter image description here

UPDATE soluzione di lavoro grazie a Brad Larson:

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

Quando "hai provato a mettere l'UIImage centrato su un'immagine chiara più grande prima di sfocare", vuoi dire che hai unito l'immagine originale a una UII più grande, quindi è un'immagine? Se è così, prova a usare un'immagine bianca invece di un'immagine chiara e assicurati che l'immagine bianca abbia un canale alfa. Sospetto che l'immagine chiara non abbia alfa e quindi il risultato sembra tagliato. – bobnoble

risposta

7

GPU L'immagine produrrà solo un risultato elaborato fino ai limiti dell'immagine. Per estendere la tua immagine, devi espandere la tela su cui opera.

Per fare ciò, è necessario alimentare l'immagine in un GPUImageTransformFilter, quindi utilizzare -forceProcessingAtSize: o -forceProcessingAtSizeRespectingAspectRatio: per ingrandire l'area di lavoro. Tuttavia, questo ingrandirà anche l'immagine per impostazione predefinita, quindi per contrastare ciò, usa una trasformazione di scala con il tuo GPUImageTransformFilter per ridurre la dimensione dell'immagine rispetto all'area più grande. Questo lo manterrà con le stesse dimensioni in pixel, pur collocandolo all'interno di un'immagine complessiva più grande.

Quindi tutto ciò che dovete fare è alimentare questa uscita nel vostro filtro sfocatura e la sfocatura ora si estenderà oltre il bordo dell'immagine originale. La dimensione che imponi l'immagine dipenderà da quanto la sfocatura deve estendersi oltre i bordi dell'immagine originale.

+1

Grazie Brad! Questo è esattamente ciò di cui avevo bisogno! Aggiornerò la mia risposta con il codice di lavoro per le persone a cui fare riferimento. – nighthawk454

1

provare a ridimensionare i limiti del UIImageView per regolare la sfocatura. Una vista ritaglia ciò che è al di fuori dei suoi limiti. Nota che nel tuo esempio, la casella sfocata in Photoshop sembra essere circa il 20% più grande dell'immagine originale.

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