【问题标题】:UIImage drawn in CALayer too blurryCALayer中绘制的UIImage太模糊
【发布时间】:2010-11-04 18:32:24
【问题描述】:

我在获取我在 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);

如果您遇到同样的问题或知道此问题的解决方案,我们将不胜感激。

谢谢,

约书亚·李·塔克。

【问题讨论】:

    标签: iphone uiview uiimage calayer


    【解决方案1】:

    为什么不直接将 CALayer 内容属性设置为 CGImageRef 并使用 contentsGravity 属性来定义缩放?您可以通过 CALayer 框架或边界来控制大小。

    myLayer.contentsGravity = kCAGravityResizeAspect;
    myLayer.contents = (id) [myImage CGImage];
    

    【讨论】:

    • 非常感谢 Ben,完美运行。答案也产生了更简单的代码!
    • 我想为我的回答提供一个模糊的原因,但这确实是更好的解决方案......
    【解决方案2】:

    不要忘记在 CALayer 上设置 contentsScale 值,否则您可能会发现 CGImage 在视网膜设备上拉伸到视图边界之外的正常大小的 2 倍。出于某种原因,CALayers 上的默认比例始终为 1.0,即使在 Retina 设备上也是如此。

    layer.contentsScale = [UIScreen mainScreen].scale;
    

    另外,如果您正在使用 CAShapeLayer 绘制一个形状并且想知道它的边缘在视网膜设备上看起来有点锯齿状,请尝试:

    shapeLayer.rasterizationScale = [UIScreen mainScreen].scale;
    shapeLayer.shouldRasterize = YES;
    

    【讨论】:

    • 最后两行帮助我修复了像素化图像。谢谢:)
    【解决方案3】:

    我希望它会被扭曲。

    首先,数字之间的划分并不均匀。

    其次,源尺寸和目标尺寸的纵横比不同,因此会有一点点拉伸/收缩。

    如果您确实需要这样做 - 尝试使纵横比相同,它们可以被平均分配 - 或者更好的是 - 您将图像渲染到正确的目标尺寸开始。

    【讨论】:

      【解决方案4】:

      如果您将图像放置在非整数坐标处,或者将宽度/高度设置为非整数值,图像会看起来很模糊。你(可能)在你的代码中做这两件事。

      我认为给定代码的修复方法是:

      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;
      

      【讨论】:

      • 嗨,我很好奇“模糊”如何与非整数坐标相关联?请解释一下好吗?
      • 如果坐标不是整数值,而不是一个具有单个值的像素,您将获得两个(或更多)两个(或更多)值,试图使最终结果看起来像所需的单个像素价值。
      猜你喜欢
      • 1970-01-01
      • 2018-07-20
      • 2019-05-23
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多