Как улучшить качество CGImageRef, взятого с экранного слоя? - PullRequest
2 голосов
/ 14 марта 2012

С кодом ниже, нарисованный слой CGContextDrawImage () имеет более низкое качество, чем исходный отображаемый слой.Некоторые строки на изображении совмещены.

Вот мой код

- (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

нарисованный слой: enter image description here

1 Ответ

0 голосов
/ 14 марта 2012

Почему вы открываете контекст изображения в первую очередь? Нарисуйте непосредственно в слои ctx контекст, переданный в качестве второго аргумента метода.

Далее вам нужно установить свойство contentsScale слоя на [UIScreen mainScreen].scale.

Чтобы нарисовать изображение с правильным масштабом устройства (не требуется в вашем примере), используйте это:

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

PS: На данный момент я действительно не вижу, чего вы хотите достичь с помощью своего кода!

...