2011-08-14 6 views
4

に失敗:のiOS:アンチエイリアスは私が画面上にこのイメージを描画しようとしています(CALayerの中PNG)

src_image

これはコードです:

 CALayer* dullLayer = [CALayer layer]; 
     {     
      dullLayer.frame = CGRectMake(0,0,BUTTON_SIZE,BUTTON_SIZE); 

      dullLayer.position = CGPointFromPoint2D(btnCenter); 

      dullLayer.opacity = topQuadrant ? 1.0 : 0.5; 


      [wheelLayer addSublayer: dullLayer]; 
     } 


     UIImage* test = [UIImage imageNamed: @"OuterButton_Dull.png"]; 

     dullLayer.contents = (id) [test CGImage]; 

これは私が得るものです:

render_fail

何が得られますか?なぜエッジがぎざぎざですか?これとまったく同じ方法でスクリーンに合成されたローマ数字の画像と対照をなしてください。

私は無駄に

  dullLayer.edgeAntialiasingMask = 0x0f; // binary 1111 

を試してみました。

EDIT:http://lists.apple.com/archives/cocoa-dev/2008/Feb/msg02070.html

答えて

6

それはあなたがあまりにも大きな画像を使用しているし、画面に表示されるあなたが投稿結果画像は、同じサイズである場合。 PNG画像はベクター画像ではないため、縮小すると常にエイリアシングが発生します。それがさらに悪化するほどスケールが小さくなります。アンチエイリアス処理は、このような場合には効果が制限されます。

数値画像では表示されないという事実は、他の画像のような細かいコントラストのない線が含まれていないことと、小さな画像を使用していることが原因です。

元画像をベクター画像として使用している場合は、元の画像を正しいサイズに縮小してからPNGに変換してみてください。アプリのどこかで高解像度のバージョンが必要な場合は、それぞれ異なる解像度で複数のPNGを作成することを検討してください。

元画像をベクター画像として使用していない場合は、代替画像を探してみる必要があります。 http://www.openclipart.org/http://www.clker.com/など、無料のクリップアートファイルをウェブ上で入手するには、いくつかの優れた情報源があります。

+0

感謝を!これはまさに起こっていたことです。私は以下の完全な答えを投稿します。 –

+1

PSはい数字は*たくさん*小さい画像でした –

2

デスモンドはそれを釘付けにしました。

Appleのフレームワークでのアンチエイリアスは、隣接するピクセルでのみ動作するようです。したがって、イメージを4倍縮小すると、ピクセル0,0はピクセル2,0に対して平均化されます。つまり、ピクセル1,0は完全に破棄されます。あなたが鋭いエッジを持っているなら、これはそれをハックするつもりはありません。

解決策は、所望のサイズの2倍の<になるまで、画像を50%繰り返して繰り返します。ここ

私は徐々にそれを毎回半分、元の600×600の画像を減らす場合に起こることであり、CALayerのX 256 256に結果を表示する:

progressive_reduction

第三の画像が実際スケーリングました目標サイズを下回っています。不思議なことに、実際にはさらに縮小(表示するために自動的に75 - > 256のサイズになる)というのは、実際には最高のものです。

実際、この場合、解決策は実際には希望のサイズよりも小さくなるまで減らしてから、必要に応じてAppleのグラフィカルフレームワークを展開させることでした。

4

私はこの上の記事でした:あなたはもう少しそれをクリーンアップすることができますいくつかのトリックと一緒にコードを経由して画像を追加した場合、あなたが行うことができますいくつかのものがありますhttp://kellenstyler.com/?p=1360

を。

次のコードで何ができますかどうかを確認してください:

UIImage * img =[UIImage imageWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle ] resourcePath ] stringByAppendingPathComponent:@"AliasImage.png" ] ] ]; 
CGRect imageRect = CGRectMake(0 , 0 , img.size.width + 4 , img.size.height + 4); 
UIGraphicsBeginImageContext(imageRect.size); 
[img drawInRect:CGRectMake(imageRect.origin.x + 2 , imageRect.origin.y + 2 , imageRect.size.width - 4 , imageRect.size.height - 4) ]; 
CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext() , kCGInterpolationHigh); 
img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
[aliasImage setImage:img ]; 

aliasImage.transform = CGAffineTransformScale(aliasImage.transform , 0.45 , 0.45); 
aliasImage.layer.shouldRasterize = YES; 
aliasImage.layer.rasterizationScale = 0.45; 
aliasImage.layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge; 
aliasImage.clipsToBounds = NO; 
aliasImage.layer.masksToBounds = NO; 
関連する問題