我遇到一些问题,我在CALayer中绘制UIImage,以显示它没有模糊性。我将400x300px图像放入123x89 CALayer中。这个尺度应该意味着得到的CALayer相对比较尖锐,但事实并非如此。
这是我用来绘制UIImage的代码:
CGSize s = image.size;
CGRect r = CGRectInset (bounds, 8, 8);
CGFloat scale = MIN (r.size.width / s.width, r.size.height / s.height);
s.width *= scale; s.height *= scale;
r.origin.x += (r.size.width - s.width) * .5;
r.size.width = s.width;
r.origin.y += (r.size.height - s.height) * .5;
r.size.height = s.height;
CGContextSaveGState (ctx);
CGContextTranslateCTM (ctx, 0, bounds.size.height);
CGContextScaleCTM (ctx, 1, -1);
if (image != nil) {
CGContextDrawImage (ctx, r, image.CGImage);
}
CGContextRestoreGState (ctx);
如果您遇到同样的问题或知道此问题的解决方案,我们将不胜感激。
谢谢,
Joshua Lee Tucker。
答案 0 :(得分:9)
为什么不将CALayer contents属性设置为CGImageRef并使用contentsGravity属性来定义缩放?您可以通过CALayer框架或边界控制大小。
myLayer.contentsGravity = kCAGravityResizeAspect;
myLayer.contents = (id) [myImage CGImage];
答案 1 :(得分:5)
不要忘记在CALayer上设置contentsScale值,否则您可能会发现CGImage在视网膜边界外延伸到视网膜设备的正常尺寸的2倍。出于某种原因,CALayers上的默认比例始终为1.0,即使在Retina设备上也是如此。
即
layer.contentsScale = [UIScreen mainScreen].scale;
另外,如果您使用CAShapeLayer绘制形状并想知道它的边缘在视网膜设备上看起来有点锯齿,请尝试:
shapeLayer.rasterizationScale = [UIScreen mainScreen].scale;
shapeLayer.shouldRasterize = YES;
答案 2 :(得分:0)
我希望它会被扭曲。
首先,这些数字并不是均匀分配的。
其次,源和目标尺寸的纵横比是不同的,因此会有一点拉伸/缩小。
如果你真的需要这样做 - 尝试使它成为宽高比相同,它们可以均匀划分 - 或者更好 - 你将图像渲染到正确的目标尺寸开始。
答案 3 :(得分:0)
如果您将它们放在非整数坐标处,或将宽度/高度设置为非整数值,则图像看起来会模糊。您(可能)在代码中执行这两项操作。
我认为给出的代码的修复方法是:
CGFloat scale = MIN (r.size.width / s.width, r.size.height / s.height);
s.width = trunc(s.width * scale);
s.height = trunc(s.height * scale);
r.origin.x += trunc((r.size.width - s.width) * .5);
r.size.width = s.width;
r.origin.y += trunc((r.size.height - s.height) * .5);
r.size.height = s.height;