回転した画像に鋭いエッジがない
-
07-07-2019 - |
質問
次のコードで画像を回転しています:
CGAffineTransform rotate = CGAffineTransformMakeRotation( [ratio floatValue] );
[imageView setTransform:rotate];
しかし、それは鋭いエッジを持っていません、誰かがこれに対する解決策を知っていますか?
私が取得する画像は次のとおりです。
解決
画像自体のエッジは、ピクセルグリッドに直接配置されており、補間されていないため、ギザギザに見えます。 最近傍補間は、ピクセルグリッドAと画像をピクセルグリッドBに移動すると、グリッドBのピクセルは、グリッドAから最も近いピクセルを選択するだけで選択されます。他の補間形式では、最も近いピクセルの加重平均を選択してグリッドBのピクセル値に到達します。
エッジがギザギザになっている画像は、最近接補間を使用しているように見えます。これは、iPhoneのアフィン変換でのデフォルトの補間タイプです。
最近傍以外の補間スキームを使用すると、エイリアスが取得されますあるピクセルグリッドから別のピクセルグリッドに転送するときにサブサンプリングが完全ではないエフェクト。この効果により、画像自体のエッジが、他の場合よりもぼやけて見えるようになります。
他のヒント
UIImageViewのCALayerを使用して画像をラスタライズすると、最高のアンチエイリアスが提供されます。
imageView.layer.shouldRasterize = YES;
画像に1pxの透明な境界線を追加するだけ
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContext( imageRect.size );
[image drawInRect:CGRectMake(1,1,image.size.width-2,image.size.height-2)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
画像を変換するときはいつでも(90°増分を除く)、ピクセル補間によりわずかにソフトなエッジが発生します。
Info.plistで設定できる、エッジのアンチエイリアスを有効にするキーがあります:UIViewEdgeAntialiasing。
次の回答で説明されているとおり: transformプロパティでUIImageViewを回転させると、エッジがピクセル化されます
最も簡単な解決策:
このKey-ValueペアをInfo.plistに追加するだけです: UIViewEdgeAntialiasingをYESに設定します。