4

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

[array objectAtIndex:0]

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

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

无论如何,CATiledLayer给我的只是问题。我一直在对 PhotoScroller 项目进行逆向工程,但没有运气。有人有其他解决方案吗?

谢谢。

4

2 回答 2

14

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

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

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

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

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

于 2012-08-23T11:39:11.830 回答
5

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

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

于 2012-08-23T11:07:01.207 回答