2013-01-07 6 views
7

Ich stoße auf eine Inkonsistenz zwischen einem Screenshot (programmatisch mit dem Code unten) und was ist eigentlich auf dem Bildschirm, wenn ein Bild gezoomt (sehr weit in meinem Fall) und gerendert nächsten Nachbarn zu bewahren die harten Kanten. Ich habe den folgenden Screenshot-Code von diesen Foren erhalten, aber was gespeichert wird, ist ein (bilineares?) Rendering des Bildes anstelle des nächsten Nachbarn.programmatische screenshot falsche nächste Nachbarin

UIGraphicsBeginImageContextWithOptions([[UIScreen mainScreen] bounds].size, NO, 0.0); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *imageView = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(imageView, nil, nil, nil); 

die Art, wie ich nächste Nachbarn zu tun mit der folgenden Zeile in ViewDidLoad ist

automataView.layer.magnificationFilter = kCAFilterNearest; 

(automataView ist ein UIImageView mit einer GIF-Datei in ihm, und es ist als ein Subview zu einem UIScrollView hinzugefügt, handhabt das Zoomen)

Hier sind zwei Bilder, das erste ist, was auf dem Bildschirm ist, das zweite ist was mit dem obigen Screenshot Code gespeichert wird. (Sorry für die Links - "als Spam-Mechanismus zur Verhinderung, neue Benutzer nicht zu veröffentlichen Bilder erlaubt")

http://www.flickr.com/photos/[email protected]/8358662379/

http://www.flickr.com/photos/[email protected]/8358662715/

Vielen Dank für jede Hilfe!

+0

Haben Sie eine Lösung gefunden? –

Antwort

3

Falls die Frage noch relevant ist.

Ich hätte gedacht, dass Interpolation ist etwas, was Sie in dem Objekt, das sich im Kontext zeichnet, aber es scheint der Kontext selbst einige Interpolation hat, hat es das Attribut CGInterpolationQuality mit Getter und Setter. Die folgende Änderung an Ihrem Snippet funktioniert also für mich:

UIGraphicsBeginImageContextWithOptions([[UIApplication sharedApplication] keyWindow].bounds.size, NO, 0.0); 
CGContextRef cgr = UIGraphicsGetCurrentContext(); 
CGContextSetInterpolationQuality(cgr, kCGInterpolationNone); 
[self.view.layer renderInContext:cgr]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);