2013-03-14 21 views
6

アンチエイリアスなしでUIBezierPathsをレンダリングし、完全なピクセル表現を保持するためにPNG形式で保存する必要があります(JPEGがイメージを上がらせないようにするなど)。私はUIBezierPathsを描画する直前にCG関数を呼び出そうとしましたが、レンダリングされたイメージには何も影響しません。パスは、アンチエイリアス(すなわち、平滑化)を用いてレンダリングされる。UIBezierPathのアンチエイリアスを無効にする

CGContextSetShouldAntialias(c, NO); 
CGContextSetAllowsAntialiasing(c, NO); 
CGContextSetInterpolationQuality(c, kCGInterpolationNone); 

すべてのヒットが非常に高く評価されます。

答えて

11

私はこれらのオプションを使用すると、アンチエイリアスをオフにします。左側にデフォルトオプションがあります。あなたのオプションで、右側に。

enter image description here

これは、あなたがUIViewサブクラスを使用している場合は制御が容易です。これは私のdrawRectです:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetShouldAntialias(context, NO); 

    [[UIColor redColor] setStroke]; 
    UIBezierPath *path = [self myPath]; 
    [path stroke]; 
} 

し、画面をキャプチャする、​​3210

- (void)captureScreen 
{ 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
     UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale); 
    else 
     UIGraphicsBeginImageContext(self.window.bounds.size); 
    [self.window.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    NSData *data = UIImagePNGRepresentation(image); 
    [data writeToFile:[self screenShotFilename] atomically:YES]; 
} 

からあなたがCAShapeLayerを使用している場合は、私はあなたがするので、画面上のアンチエイリアスを制御することができるとは思いませんas the documentation says

形状はアンチエイリアス描画される

、それがラスタライズされる前に、画面空間にマップされる可能な限り保存する解像度I独立性。しかし、CoreImageフィルタなどの特定の種類の画像処理操作は、レイヤーまたはその先祖に適用されて、ローカル座標空間でのラスタライズを強制することがあります。

しかし、あなたがアンチエイリアスされていない画面のあなたのスナップショットを持っているしたい場合にかかわらず、画面上のアンチエイリアスの、あなたは日常captureScreenにあなたのCGContextSetShouldAntialiasを挿入することができます。あなたの入力のための

- (void)captureScreen 
{ 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
     UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale); 
    else 
     UIGraphicsBeginImageContext(self.window.bounds.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetShouldAntialias(context, NO); 
    [self.window.layer renderInContext:context]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    NSData * data = UIImagePNGRepresentation(image); 
    [data writeToFile:[self screenShotFilename] atomically:YES]; 
} 
+0

そんな包括的な回答をいただきありがとうございます。私はラインに沿っていくつかの新しいことを学びました:) – alonjr

+0

@Rob、なぜアンチエイリアスがその灰色の背景(左の写真)をもたらすのかアドバイスできますか?ありがとう。 – berec

+1

@berec - これは、古い画像スナップショットをどのように作成したかのラン​​ダムなアーティファクトです。私はそれらの画像を再生成しました(上記の同じコードを使用しています)。ストロークを描くコンテキストで選択されたエイリアシングは、背景に影響しません。その古いイメージが混乱してしまった場合は、申し訳ありません。 – Rob

5

ここからcを取得していますか? cは、[UIBezierPath stroke]を使用している図面サイクルでUIGraphicsGetCurrentContext()と同じものを参照していますか?上記のサンプルから分かりにくいです。

あなたはあなたが設定している同じコンテキストに描画している、UIBezierPathからCGPathをフェッチすることを特定すること、およびそれを直接描画する場合:

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicGetCurrentContext(); 
    CGPathRef path = [self.bezier CGPath]; 
    CGContextSetShouldAntialias(context, NO); 
    CGContextAddPath(context, path); 
    CGContextStrokePath(context); 
} 
+0

感謝を。あなたは私の問題を解決しました! – alonjr

関連する問題