CGContextDrawImage绘制的图像非常模糊

时间:2013-12-11 02:04:35

标签: ios objective-c image macos core-graphics

我正在尝试使用CGContextDrawImage(...)创建一个可以绘制大部分(例如2048 x 1537)图像的对象。它工作得很好,除了它非常模糊。我正在使用一个“drawingController”来覆盖drawLayer:inContext:喜欢这个

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
    CGImageRef drawImage = CGImageRetain(imageToDraw);
    if(drawImage) {
        CGRect drawRect = CGRectMake(0, 0, 1024, 748);//Just hard coded to my window size for now.
        CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
        CGContextDrawImage(ctx, drawRect, drawImage);
    }
    CGImageRelease(drawImage);
}

这就是我设置自定义图片托管视图的方式:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"large" ofType:@"jpg"];
        CGImageRef imageRef = [self createCGImageFromFilePath:filePath];


        drawingController = [[DrawingLayerController alloc] init];
        drawingController.imageToDraw = imageRef;

        [self setWantsLayer:YES];
        imageLayer = [[CALayer alloc] init];
        imageLayer.frame = self.bounds;
        imageLayer.drawsAsynchronously = YES;
        imageLayer.delegate = drawingController;
        [self.layer addSublayer:imageLayer];

        imageLayer.contentsRect = CGRectMake(0.5, 0.265452179, 0.5, 0.486662329); //Just an example contents rect.
        imageLayer.drawsAsynchronously = YES;

        [imageLayer setNeedsDisplay];
        [imageLayer displayIfNeeded];
    }
    return self;
}

以下是在预览中打开的类似缩放比例下沿源图像生成的图像的一部分,因此您可以看到图像与源图像相比的模糊程度。

Hopefully the image doesn't become blurry when I upload it haha

正如您所看到的,我的代码生成的图像看起来很可怕。这是怎么回事?

另外,为了完整起见,我尝试使用CATiledLayer作为我的imageLayer。生成的图像看起来非常糟糕。

最后一点:代码需要与iOS和OSX兼容,但我正在OSX上进行所有测试。

编辑:感谢@Andrea,我在上面添加了以下CGContextDrawImage(...)

CGFloat scale = MAX(1,MAX(CGImageGetWidth(drawImage)/drawRect.size.width,CGImageGetHeight(drawImage)/drawRect.size.height));

layer.contentsScale = scale;

1 个答案:

答案 0 :(得分:0)

我不完全知道osx,但我可以给你一些建议。

  • 按照纪念中的说明检查contentScale属性,我还写了一篇关于它的question,但我从未有过真正的答案
  • 大部分时间模糊是由于像素不匹配,这要求系统对图像应用抗锯齿,我看到你用contentsRect设置了contentsGravity,可能会改变比例并缩放图像,使其变得模糊。关于它,这是一个很好的answer
  • 您的contentGravity是哪个?
  • 第一次尝试时保持简单,你真的需要绘制异步吗?

希望这有帮助。