2012-03-14 6 views
2

以下のコードでは、CGContextDrawImage()ペイントレイヤーの品質が元の表示レイヤーよりも低くなっています。イメージの一部の行にエイリアスがあります。画面レイヤーから取ったCGImageRefの品質を改善するにはどうすればいいですか?

は、ここに私のコード

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    CGContextSaveGState(ctx); 

    UIGraphicsBeginImageContext(layer.bounds.size); 
    CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetShouldAntialias(c, YES); 
    CGContextSetAllowsAntialiasing(c, YES); 
    CGContextSetInterpolationQuality(c, kCGInterpolationHigh); 
    [self.view.layer renderInContext:c]; 
    CGImageRef image = CGBitmapContextCreateImage(c); 
    UIGraphicsEndImageContext(); 

    CGImageRef flipImage = CGImageCreateWithImageInRect(image, layer.bounds); 

    CGContextTranslateCTM(ctx, 0, layer.bounds.size.height); 
    CGContextScaleCTM(ctx, 1.0f, -1.0f); 
    CGContextSetShouldAntialias(ctx, YES); 
    CGContextSetAllowsAntialiasing(ctx, YES); 
    CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 
    CGContextDrawImage(ctx, layer.bounds, flipImage); 
    CGContextRestoreGState(ctx); 
    LogMessage(@"drawLayer", 1, @"draw layer content"); 
} 

アップデート1

drawLayer:で塗装層の画面と異なるサイズを持っています。 画面を分割してアニメーションを適用したいと思っています。あなたが最初の場所での画像のコンテキストを開くのはなぜ enter image description here

答えて

0

元のレイヤー: enter image description here

層をdrawed? 2番目のメソッド引数として渡されたコンテキストに直接描画します。ctx

さらに、レイヤのcontentsScaleプロパティを[UIScreen mainScreen].scaleに設定する必要があります。

(あなたの例では必要ありません)正しいデバイススケールで画像を描画するためには、この使用:

void UIGraphicsBeginImageContextWithOptions(
    CGSize size, 
    BOOL opaque, 
    CGFloat scale // pass 0 to use screen scale 
); 

PS:今の時点で、私は本当にあなたが達成したいものを見ることができないあなたコード!

+0

新しいレイヤーのスケールは正しいです、私はいくつかの小さなレイヤーに画面をスライスする必要があります。 – changx

+0

さて、私はすでにあなたに答えを与えました。 'UIGraphicsBeginImageContextWithOptions'を使用してください。あなたのアプローチはまだ意味をなさない。スクリーンをスライスするために別のレイヤーが必要なのはなぜですか? –

+0

はい、あなたは正しいです!直接 '[self.view.layer renderInContext:ctx]'は、作成、作物、描画タスクを完了することができますが、品質はまだ悪い、任意のアイデア?私はいくつかのサブレイヤが必要な理由は、各サブレイヤはその下のレイヤを公開するために下にフリップされます。 – changx

関連する問題