2013-10-14 17 views
7

Ich versuche eine Gaußsche Unschärfe auf einem UIImage zu tun, das mein Photoshop-Modell repliziert.Blur UIIage außerhalb der Grenzen (Photoshop-Stil)

Gewünschtes Verhalten: In Photoshop, wenn ich eine Gaußsche Unschärfe-Filter laufen, die Bildschicht größer wird als Folge der unscharfen Kanten.

Beobachtetes Verhalten: Mit GPUImage kann ich meine UIImages erfolgreich verwischen. Das neue Bild wird jedoch an den ursprünglichen Grenzen abgeschnitten, sodass eine harte Kante entsteht.

Einstellung UIImageView.layer.masksToBounds = NO; hilft nicht, da das Bild nicht die Ansicht beschnitten wird.

Ich habe auch versucht, die UIImage zentriert auf ein größeres klares Bild vor Unschärfe und dann die Größe zu setzen. Das hat auch nicht geholfen.

Gibt es eine Möglichkeit, diese Unschärfe im "Photoshop-Stil" zu erzielen?

enter image description here

UPDATE Arbeitslösung dank 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

Wenn Sie "versucht haben, den UIImage vor dem Verwischen auf ein größeres, klares Bild zu zentrieren", meinen Sie, dass Sie das Originalbild in ein größeres UII-Bild eingemischt haben, also ein Bild? Verwenden Sie in diesem Fall ein weißes Bild anstelle eines klaren Bildes und stellen Sie sicher, dass das weiße Bild über einen Alpha-Kanal verfügt. Ich vermute, das klare Bild hat kein Alpha und somit sieht das Ergebnis abgeschnitten aus. – bobnoble

Antwort

7

GPUImage erzeugt nur ein Ergebnis, das bis zu den Grenzen Ihres Bildes verarbeitet wird. Um Ihr Bild zu erweitern, müssen Sie die Leinwand erweitern, auf der es ausgeführt wird.

Um dies zu erreichen, sollten Sie Ihr Bild in einen GPUImageTransformFilter einspeisen und dann den Arbeitsbereich mit -forceProcessingAtSize: oder -forceProcessingAtSizeRespectingAspectRatio: vergrößern. Dadurch wird jedoch auch das Bild standardmäßig vergrößert. Um dem entgegenzuwirken, verwenden Sie eine Skalierungstransformation mit Ihrem GPUImageTransformFilter, um die Größe des Bildes im Verhältnis zum größeren Bereich zu verringern. Dadurch bleibt die Pixelgröße erhalten und wird in ein größeres Gesamtbild eingefügt.

Dann müssen Sie nur diesen Ausgang in Ihren Unschärfefilter einspeisen und die Unschärfe wird nun über den Rand Ihres Originalbildes hinausreichen. Die Größe, die Sie für das Bild erzwingen, hängt davon ab, wie weit die Unschärfe über die Kanten des Originalbilds hinaus reichen muss.

+1

Danke Brad! Genau das habe ich gebraucht! Ich werde meine Antwort mit dem Arbeitscode aktualisieren, damit die Leute darauf verweisen können. – nighthawk454

1

Versuchen der Grenzen des UIImageView Ändern der Größe, um die Unschärfe einzustellen. Eine Ansicht wird abgeschnitten, was außerhalb ihrer Grenzen liegt. Beachten Sie, dass in Ihrem Beispiel die in photoshop verschwommene Box etwa 20% größer als das Originalbild aussieht.

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