7

スクリーンショット (以下のコードをプログラムで使用) と、画像を拡大 (私の場合は非常に遠い) し、ハード エッジを維持するために最近傍をレンダリングしたときに実際に画面に表示されるものとの間に矛盾が発生します。これらのフォーラムから次のスクリーンショット コードを取得しましたが、保存されるのは、最近傍ではなく画像の (バイリニア?) レンダリングです。

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

私が最近傍を行う方法は、ViewDidLoad の次の行を使用することです

automataView.layer.magnificationFilter = kCAFilterNearest;

(automataView は、GIF ファイルを含む UIImageView であり、ズームを処理する UIScrollView にサブビューとして追加されます)

ここに 2 つの画像があります。1 つ目は画面に表示されているもので、2 つ目は上記のスクリーンショット コードを使用して保存されたものです。(リンクはごめんなさい - 「スパム防止メカニズムとして、新しいユーザーは画像を投稿できません」)

http://www.flickr.com/photos/51983059@N08/8358662379/

http://www.flickr.com/photos/51983059@N08/8358662715/

助けてくれてありがとう!

4

1 に答える 1

3

質問がまだ関連している場合。

補間は、コンテキスト内で自分自身を描画するオブジェクトに設定するものだと思っていましたが、コンテキスト自体が何らかの補間を行っているようで、getter と setter を持つ属性 CGInterpolationQuality を持っています。したがって、スニペットへの次の変更は私にとってはうまくいきます:

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);
于 2013-03-27T14:14:36.250 に答える