没有 CATiledLayer 的 iOS 应用程序中的巨大图像?

Posted

技术标签:

【中文标题】没有 CATiledLayer 的 iOS 应用程序中的巨大图像?【英文标题】:Huge images in iOS app without CATiledLayer? 【发布时间】:2012-08-18 20:10:18 【问题描述】:

我有一张大约 7000x6000 像素的图片。我需要它在我的应用程序的滚动视图/图像视图中,但是这是一种巨大的显示方式。它应该是一种地图。我希望将应用程序的大小保持在最小,并且图像在 .jpg 中只有 13mb 左右。在 .png 中超过 100mb,这是不可接受的。许多人建议将CATiledLayer 作为一个选项,但我相信这会导致更大的文件大小。无论如何,我尝试使用CATiledLayer 来做,并在 TileCutter 中创建自己的图块(.jpg 中的图块),并且大小还不错。但是我到处都有错误。 CATiledLayerios版本对我来说是个谜,我找不到解决这个问题的方法。我收到一个错误,说明与 java 等效的“索引超出数组范围”,即使该数组在该特定索引处具有内容.. 它有一个返回数组的方法。该数组包含 .plist 的数据。在返回之前,我注销了数组的内容,给了我很好的数据。呼叫正在尝试访问

[array objectAtIndex:0]

并将其放入字典中,但会抛出 OutOfBounds。注销整个数组的时候,可以清楚的看到内容,但是注销的时候

NSLog("%@",[method objectAtIndex]); I get the same exception.

不管怎样,CATiledLayer 给我的只是问题。我一直在对 PhotoScroller 项目进行逆向工程,但没有运气。谁有其他解决方案?

谢谢。

【问题讨论】:

【参考方案1】:

Apple 有一个非常简洁的项目 PhotoScroller,它使用 CATiledLayer 并允许您滚动浏览多个图像并缩放它们。这看起来真的很整洁,直到我发现 Apple “作弊”并预先平铺了图像(大约 800 个图块保存为捆绑包中的文件!)

我需要类似的功能,但必须从网络下载图像。于是出现了PhotoScrollerNetwork。使用 TiledImageBuilder,您可以下载(或从磁盘读取)大量图像 - 我什至测试了 18000x18000 的图像 - 它可以工作。

这个类的作用是在下载时开始平铺图像(使用 libjpegturbo 时),或者可以保存文件然后平铺(需要更长的时间)。该类计算出需要多少级别的细节才能以全分辨率显示图像并调整大小以适合包含视图(滚动视图)。

该类使用磁盘缓存来保存切片,但使用旧的 Unix 技巧来创建文件,打开文件,然后取消链接,这样切片就永远不会真正保存 - 一旦类被释放(以及文件描述符关闭)图块被释放(或者如果您的应用崩溃,它们也被释放。

有人在内存非常有限的 iPad 1 上遇到问题,因此该类现在在同时加载多个图像时会限制其对文件系统的使用。今年我在 WWDC 上与 iOS 内核经理进行了讨论,在向他解释了节流技术后,他说算法(关于管理磁盘缓存使用量)可能是可以使用的最佳技术。

【讨论】:

我已经尝试了该课程,这确实是一项很棒的工作,但是以预先确定的缩放级别渲染图像是可能的吗? 当然它是可能的,但你必须探索——这就是代码是开源的原因——所以人们可以修改它。如果你做了一些工作并且喜欢你所做的,创建一个拉取请求将其合并到主项目中。【参考方案2】:

我认为建议 CATiledLayer 的人是对的。你真的应该使用它!如果您需要使用该技术显示巨大位图的示例项目,请查看此处:http://www.cimgf.com/2011/03/01/subduing-catiledlayer/

我们作为 Cocoa/Cocoa Touch 开发人员所使用的许多技术 不受胆小的人的影响,因为我们常常根本不 了解他们并雇用他们似乎是一项艰巨的任务。之一 这些技术可以在 Core Animation 中找到,被称为 CATiledLayer。这似乎是一种神奇的技术,因为 它的很多实现有点像黑匣子,这个事实 导致它被误解。 CATiledLayer 只是提供了一个 绘制非常大的图像而不会导致严重的内存命中的方法。 无论您在哪里部署,这一点都很重要,尤其是 在 iOS 设备上很重要,因为内存很宝贵,当操作系统告诉你时 要释放内存,您最好能够这样做,否则您的应用程序将 拿下来。这篇博文旨在证明 CATiledLayer 像宣传的那样工作,实现它并不像 它可能曾经看起来。

【讨论】:

以上是关于没有 CATiledLayer 的 iOS 应用程序中的巨大图像?的主要内容,如果未能解决你的问题,请参考以下文章

iOS CATiledLayer 崩溃

CATiledLayer 的背景图像

iOS之CATiledLayer的属性简介和使用

CATiledLayer

如何使用 UIScrollView 和 CATiledLayer 在可缩放的 UIView 上绘制标记

隐藏 CATiledLayer 平铺创建