Retina中的CGContextDrawImage绘制图像像素化?

时间:2012-02-25 16:41:28

标签: iphone ios core-graphics iphone-4

我需要将图像绘制到CALayer中,因为我需要对其执行各种效果,动画和过滤器。当我简单地绘制CGContext时,无论我做什么,总是得到像素化的... 什么是在视网膜上绘制背景的正确方法?

这就是我现在正在做的事情:

CGImageRef plateImage = [[UIImage imageNamed:@"someImage"] CGImage];
CGFloat width = CGImageGetWidth(plateImage), height = CGImageGetHeight(plateImage);
CGFloat scale = [[UIScreen mainScreen] scale];

NSLog(@"Scale: %f\nWidth: %f\nHeight: %f", scale, width, height);
CGContextTranslateCTM(_context, 0, height / scale);
CGContextScaleCTM(_context, 1.0, -1.0);

CGContextDrawImage(_context, CGRectMake(0, 0, width / scale, height / scale), plateImage);

3 个答案:

答案 0 :(得分:25)

我遇到了同样的问题,但解决方案似乎没有用。

UIGraphicsBeginImageContext()原来导致了我的问题。我在这里发布我的解决方案,为未来的用户提出同样的问题。

从iOS 4.0开始,你应该使用:

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);

而不是

UIGraphicsBeginImageContext(size);

如果您不想要像素化图像。

答案 1 :(得分:19)

您需要适当地设置图层的内容比例。

myLayer.contentsScale = [UIScreen mainScreen].scale

答案 2 :(得分:0)

更新了@Tieme的Swift 4解决方案

$(window).on('load', handleScaleFactors)

function handleScaleFactors() {
  $('scale-factor').each(function(i, e) {
    const iframe = $('iframe', e);
    if (iframe.is('iframe')) {
      const w = iframe.attr('width') ? parseInt(iframe.attr('width')) : iframe.width(),
        h = iframe.attr('height') ? parseInt(iframe.attr('height')) : iframe.height(),
        scale = $(e).data('scale') || 0;
      iframe.css({
        transform: 'scale(' + scale + ')'
      });
      $(e).css({
        width: (w * scale) + 'px',
        height: (h * scale) + 'px',
        opacity: 1
      })
    }
  });
}

而不是

UIGraphicsBeginImageContextWithOptions(size, false, 0.0)