如何提高从屏幕层获取的CGImageRef的质量?

时间:2012-03-14 11:21:34

标签: ios core-graphics calayer

使用下面的代码,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 :(得分:0)

为什么要首先打开图像上下文?直接绘制到作为第二个方法参数传递的层ctx上下文。

此外,您需要将图层的contentsScale属性设置为[UIScreen mainScreen].scale

要使用正确的设备比例绘制图像(在您的示例中不需要),请使用:

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

PS:截至目前,我真的看不出你想要用你的代码完成什么!