在CALayer中绘制的UIImage太模糊了

时间:2010-11-04 18:32:24

标签: iphone uiview uiimage calayer

我遇到一些问题,我在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。

4 个答案:

答案 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;