【问题标题】:Overlaying 2D paths on UIImage without scaling artifacts在 UIImage 上覆盖 2D 路径而不缩放伪影
【发布时间】:2010-12-03 11:16:31
【问题描述】:

我需要沿着图像的形状绘制一条路径,使其始终匹配其在图像上的位置,而与图像比例无关。可以将其想象为 Google 地图的混合视图,其中街道名称和道路叠加在航拍图片之上。

此外,这条路径将由用户的手指移动绘制,我需要能够检索图像像素坐标上的路径关键点。用户放大以便更精确地设置路径位置。

我设法使用这种方法使其工作:

-创建一个名为 CanvasView 的自定义 UIView,它处理触摸交互并根据标志传递缩放、旋转、平移值到 UIImageView 或 PathsView(见下文):deliverToImageOrPaths。

-创建一个 UIImageView 保存基本图像。这被设置为 CanvasView 的子项

-创建一个名为 PathsView 的自定义 UIView,它跟踪 2D 路径几何并使用自定义 drawRect 绘制自身。这被设置为 UIImageView 的子级。

所以层次结构:CanvasView -> UIImageView ->PathsView

以这种方式,当 DeliverToImageOrPaths 为 YES 时,手指手势会同时转换 UIImageView 及其子 PathsView。当 deliverToImageOrPaths 为 NO 时,手势仅影响 PathsView 更改其几何形状。到目前为止一切顺利。

问题: 我遇到的问题是,在缩放基本 UIImageView (通过其 .transform 属性)时,PathsView 会使用锯齿伪影进行缩放。仍然在 PathsView 上调用 drawRect,但我猜它正在使用原始缓冲区大小执行绘图,然后进行插值。

我该如何解决这个问题?有没有更好的方法来实现这些功能?

PS:我尝试将 PathsView 图层类更改为 CATiledLayer,levelsOfDetailBias 4 和 levelsOfDetail 4。它在一定程度上解决了锯齿问题,但渲染速度慢得让人无法接受。

【问题讨论】:

    标签: iphone uiimageview scaling path aliasing


    【解决方案1】:

    如果您的目标是 iPhone OS 3.0+,您可以使用 CAShapeLayer 作为您的路径。您将 CGPathRef 分配给图层,它将为您处理所有绘图和缩放。您只需设置图层的变换即可。

    【讨论】:

      【解决方案2】:

      如果您在绘制路径值时保留它们,则可以捕获底层图像的 % 缩放比例,然后重新定位路径值并在 PathsView 的 drawRect 方法中重新绘制它们。

      这将涉及一些数学运算(主要是沿着地图投影线),但不是缩放位图并获得伪影,而是缩放点距离并使用矢量重绘,这将使其在任何分辨率下都平滑(尤其是如果你用贝塞尔曲线连接点而不是像素或线)。

      如果您在用户绘制路径时沿路径绘制并丢弃点数据,那么唯一的解决方案是进行位图抗锯齿,这基本上是 CATiledLayer 为您所做的,正如您所发现的那样,可能会很慢。

      【讨论】:

        猜你喜欢
        • 2012-10-26
        • 2019-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多