画像の変形のアンチギザギザ処理方法

4403 ワード

この記事を転載します http://adad184.com/2015/08/31/image-rotate-with-antialiasing/
週末にツイッターで@周楷雯KevinさんがCALayerの鋸歯対策について話しています.
具体的なやり方は:
1
layer.allowsEdgeAntialiasing = true
 
昔にも似たような問題がありました.このようなシールの応用は当然、シールの拡大と回転の問題があります.鋸歯の問題も解決しなければなりませんでしたが、その時はiOS 4,5の時代で、上に述べたallowsEdgeAntialiasingという東西はまったくありませんでした.(このものはiOS 7で公開されていますが、iOS 6でも使えると聞きましたが、黒テクノロジですよ.わかりました)
だから、当時は万能のスタッフを助けてくれました. 非常にシンプルで簡単ではない方法を得ました.ツイッターで話しました. 表示する画像をピクセルの透明な辺に残してください. もういいです
方法
方法は比較的簡単です.UImageのCategory方法を書きました.それからずっと私の工具庫に閉じこめられています.何年も(この問題に遭遇してやっと思い出しました.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (UIImage *)antiAlias
{
CGFloat border = 1.0f;
CGRect rect = CGRectMake(border, border, self.size.width-2*border, self.size.height-2*border);

UIImage *img = nil;

UIGraphicsBeginImageContext(CGSizeMake(rect.size.width,rect.size.height));
[self drawInRect:CGRectMake(-1, -1, self.size.width, self.size.height)];
img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIGraphicsBeginImageContext(self.size);
[img drawInRect:rect];
UIImage* antiImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return antiImage;
}
 
まず実際の効果を見てみます.
回転が見られますが、何もしない場合には、明確なギザギザがあり、透明なエッジを使用する方法または設定allowsEdgeAntialiasingがあります. のこぎりの歯を消すことができます.
次にこの2つの方法の性能比較テスト方法を見ますと、iPhone 5 SでUImageView 500個を連続して回転させて比較したフレーム数の結果は以下の通りです.
結果は  allowsEdgeAntialiasingの性能はやはり透明側の方式より劣るので…
  • iOS 6をサポートするアプリケーションがあれば、透明側の方法を参照することができる唯一の欠点は、元のものより少し小さいということです.
  • もしあなたのアプリケーションがiOS 7だけをサポートしているなら、allowsEdgeAntialiasingを使って簡単に設定することを推奨します.性能的に難しいなら、透明側の方法を再検討してもいいです.
    結び目
    文の中のデモはここで見つけられます.
    テストの方法はあまり厳密ではないかもしれません.(仮初めに書きましたので、あまり時間がかかりませんでした.)もし間違いがあったら、教えてください.
    転載先:https://www.cnblogs.com/Camier-myNiuer/p/4806984.html