2013-08-23 7 views
12

Ich versuche den Glaseffekt im Stil von iOS 7 in meinem Glas zu verwenden, indem ich Bildeffekte auf einen Screenshot von MKMapView anwende. This UIImage category, von Apple zur Verfügung gestellt, ist, was ich als Grundlinie verwende. Diese Methode entsättigt das Quellbild, gilt eine Tönung Farbe und verwischt mit stark dem Eingang vals:Verwenden von GPUImage zum Wiederherstellen von iOS 7 Glass Effect

[image applyBlurWithRadius:10.0 
       tintColor:[UIColor colorWithRed:229/255.0f green:246/255.0f blue:255/255.0f alpha:0.33] 
    saturationDeltaFactor:0.66 
       maskImage:nil]; 

Dies bewirkt produziert ich suche, aber dauere viel zu lang - zwischen .3 und .5 Sekunden machen auf ein iPhone 4.

enter image description here

ich mag würde die ausgezeichnete GPUImage als meine ersten Versuche verwenden, haben etwa 5-10 mal schneller gewesen, aber ich kann einfach nicht scheinen, richtig zu machen.

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:image]; 

GPUImageSaturationFilter *saturationFilter = [[GPUImageSaturationFilter alloc] init]; 
saturationFilter.saturation = 0.33; // 1.0 - 0.66; 
[stillImageSource addTarget:saturationFilter]; 

GPUImageMonochromeFilter *monochromeFilter = [[GPUImageMonochromeFilter alloc] init]; 
[monochromeFilter setColor:(GPUVector4){229/255.0f, 246/255.0f, 1.0f, 0.33f}]; 
[monochromeFilter setIntensity:0.2]; 
[saturationFilter addTarget:monochromeFilter]; 

GPUImageFastBlurFilter *blurFilter = [[GPUImageFastBlurFilter alloc] init]; 
blurFilter.blurSize = 2; 
blurFilter.blurPasses = 3; 
[monochromeFilter addTarget:blurFilter]; 

[saturationFilter prepareForImageCapture]; 
[monochromeFilter prepareForImageCapture]; 

[stillImageSource processImage]; 
image = [blurFilter imageFromCurrentlyProcessedOutput]; 

Dies erzeugt ein Bild, das nahe ist, aber nicht ganz da

enter image description here

Die Unschärfe scheint nicht tief genug zu sein, aber wenn ich versuche, über die blurSize zu erhöhen, wird gitterartig, fast wie ein Kaleidoskop. Sie können das Raster hier sehen, indem Sie das zweite Bild vergrößern. Die Tönungsfarbe, die ich nachzuahmen versuche, scheint nur das Bild auszuwaschen, anstatt zu überlagern und zu mischen, was ich denke, dass das Apple-Sample es tut.

Ich habe versucht, die Filter nach den Kommentaren von @BradLarson in another SO question einrichten. Verwende ich die falschen GPUImage Filter, um diesen Effekt zu reproduzieren, oder richte ich sie nur falsch ein?

+0

Haben Sie versucht https://github.com/JagCesar/iOS-blur? Es ist großartig, obwohl es nur unter iOS7 funktioniert. –

+0

iOS-Blur ist keine praktikable Lösung. Sie wissen nicht, was Apple unter der Haube tut, um dies zu machen, und es funktioniert nicht auf iOS 6. – coneybeare

Antwort

32

OK, ich habe für eine Weile an etwas gearbeitet, und ich habe es endlich funktional. Ich habe gerade eine Reihe von Änderungen an den Unschärfefiltern von GPUImage in das Framework eingefügt und als Ergebnis glaube ich, dass ich eine angemessene Replik von Apples Unschärfe-Effekt habe, den sie für Dinge wie die Control Center-Ansicht verwenden.

Zuvor verwendeten die Unschärfen, die ich im Rahmen hatte einen einzigen vorberechneten Radius, und die einzige Möglichkeit, ihre Intensität zu beeinflussen war, den Abstand, bei dem sie Pixel aus dem Eingangsbild abgetastet. Bei einer begrenzten Anzahl von Abtastwerten pro Pixel führte das Ändern des Vielfachen für den Abstand zwischen abgetasteten Pixeln viel über 1,5 zu dem Einführen ernsthafter Blockierungsartefakte, wenn Pixel übersprungen wurden.

Die neue Gaußsche Weichzeichnerimplementierung, die ich gebaut habe, kombiniert die Leistungsvorteile von vorberechneten Gaußgewichten mit der Fähigkeit, einen beliebigen Radius (Sigma) für die Gaußsche Weichzeichnung zu verwenden. Dazu werden Shader im laufenden Betrieb erzeugt, wie sie für verschiedene Radien benötigt werden. Es reduziert auch die Anzahl von Texturproben, die für einen gegebenen Unschärferadius erforderlich sind, indem eine Hardwareinterpolation zum Lesen von zwei Texeln gleichzeitig für jeden Abtastpunkt verwendet wird.

Der neue GPUImageiOSBlurFilter kombiniert diesen abgestimmten Gaußschen Unschärfefilter mit beliebigem Radius mit einem Farbkorrekturfilter, der die Anpassung von Apple an die Farben nach dem Verschwimmen reproduziert.Ich fügte hinzu, die unten Vergleich zu meiner Antwort here, aber es zeigt Apples eingebaute in auf der linke Seite von der Zentralen Ansicht verwischen, und meine neuen GPUImage Unschärfefilter auf dem rechte Seite:

Apple's blurGPUImage's blur

Als ein Weg, Um die Leistung zu verbessern (Apples Unschärfe scheint mit einem Sigma von 48 aufzutreten, was erfordert, dass für jeden Pixel eine ziemlich große Fläche abgetastet wird), verwende ich ein 4X-Downsampling vor der Gaußschen Unschärfe und dann eine 4X-Upsampling danach. Dies reduziert die Anzahl der Pixel, die verwackelt werden müssen, um das 16-fache und reduziert außerdem das Unschärfe-Sigma von 48 auf 12. Ein iPhone 4S kann den gesamten Bildschirm in ungefähr 30 ms mit diesem Filter verwischen.

Die Unschärfe richtig zu bekommen ist eine Sache. Apple bietet immer noch keine schnelle Möglichkeit, den Bildinhalt hinter Ihren Ansichten zu verbergen, so dass es hier wahrscheinlich zu Ihrem Engpass für schnell wechselnde Inhalte kommt.

+1

Also habe ich auf 'GPUImageiosBlurFilter' gewechselt und es hat zu viel schneller Rendering für mich geführt. Ich benutze es nicht für Live-Unschärfe, aber ich brauche es für die Unschärfe von Bildern, die in 'UITableViewCell's angezeigt werden, also muss es schnell gehen und es tut es auch. Vielen Dank! – runmad

+0

Brad, könnten Sie bitte die Pod-Spezifikationen für GPUImage aktualisieren? Die alte 0.1.1 Spezifikation enthält nicht 'GPUImageiOSBlurFilter'. Vielen Dank! –

+0

@KyrDunenkoff - Ich nehme an, Sie beziehen sich auf CocoaPods? Ich verwalte dort nichts und nutze CocoaPods nicht selbst. Es liegt also an jedem, der dafür verantwortlich ist, auf den neuesten Build im Repository zu verweisen. Ich pflege nur das GitHub-Repository. Wenn Sie den neuesten Code möchten, empfehle ich, direkt von GitHub zu ziehen. –