2012-03-14 2 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? 두 번째 메서드 인수로 전달 된 문맥에 직접 문을 그립니다. 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

관련 문제