我需要将图像绘制到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);
答案 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)