7

UIView私はいくつかの黒と白を含む非常に単純なものを持っていUIImageViewます。デバイスの物理ボタンを使用してスクリーンショットを撮ると、結果として得られる画像は、(予想どおり) 私が見ているものとまったく同じに見えます。画像をピクセル レベルで調べると、白黒だけになります。

ただし、次のコード スニペットを使用して同じアクションをプログラムで実行すると、結果の画像にアンチエイリアシングが適用されたように見えます。すべての黒いピクセルがかすかな灰色のハローに囲まれています。元のシーンにはグレーはありません。純粋な白黒で、「スクリーンショット」画像の寸法はプログラムで生成したものと同じですが、グレーのハローがどこから来ているのかわかりません。

UIView *printView = fullView;

UIGraphicsBeginImageContextWithOptions(printView.bounds.size, NO, 0.0);

CGContextRef ctx = UIGraphicsGetCurrentContext();
[printView.layer renderInContext:ctx];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
UIGraphicsEndImageContext();

renderInContextアンチエイリアシングを防ぐために、呼び出しの前に次を追加しようとしましたが、目立った効果はありません。

CGContextSetShouldAntialias(ctx, NO);
CGContextSetAllowsAntialiasing(ctx, NO);
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);

2 つの異なる出力のサンプルを次に示します。左側は私のコードが生成するもので、右側は通常の iOS スクリーンショットです。

ここに画像の説明を入力

私の出力をrenderInContextモノクロプリンターに送信しようとしているので、灰色のピクセルがあると、プリンターのディザリングアルゴリズムが原因で、見苦しいアーティファクトが発生します。

では、実際のデバイスのスクリーンショットと同じピクセル レベルのビューの出力を生成するにはどうすればよいrenderInContextでしょうか? つまり、元のシーンと同じように白黒だけで表示されるのでしょうか?

4

2 に答える 2

3

問題はUIImageUIImageView. は、データ プロバイダーを使用しUIImageて作成されました。寸法は親と同じ単位で指定されましたがCGImage、Retina ディスプレイを備えた iOS デバイスを使用しています。 CGImageUIImageView

CGImage寸法は網膜以外のサイズで指定されていたため、renderInContextCGImage をアップスケーリングしていましたが、このアップスケーリングは実際の画面レンダリングとは異なる動作をしているようです。(何らかの理由で、グレーのピクセルを追加せずに実際の画面レンダリングを拡大しました。)

これを修正するために、CGImageの 2 倍の次元で を作成し、 をUIImageView呼び出すとrenderInContext、はるかに優れた白黒画像が生成されます。白い領域の一部にまだいくつかの灰色のピクセルがありますが、元の問題から大幅に改善されています。

への呼び出しを強制的に 1.0 のスケーリングを行うように変更することで、最終的にこれを理解し、黒いピクセルのレンダリングに灰色のハローがなくなっUIGraphicsBeginImageContextWithOptions()たことに気付きました。UIImageView強制的UIGraphicsBeginImageContextWithOptions()に 2.0 のスケール ファクター (Retina ディスプレイのためにデフォルトで設定されていたもの) にすると、グレーのハローが現れました。

于 2013-01-14T19:18:18.673 に答える
1

私は設定しようとします

 printView.layer.magnificationFilter

 printView.layer.minificationFilter

 kCAFilterNearest

UIImageView画像はインスタンスで表示されますか? printView彼らのスーパービューですか?

于 2013-01-14T14:53:46.363 に答える