【问题标题】:How to store a very large image on an iPhone/iPad如何在 iPhone/iPad 上存储非常大的图像
【发布时间】:2011-06-29 13:06:57
【问题描述】:

为 iOS 应用存储超大图像的最佳方式是什么?我希望一个应用程序能够查看可能是数百兆字节的图像,可能与 jpeg 一样多。我需要能够存储图像并检索选定区域进行显示。

目前,图像被切割成 512x512 像素的切片,并以 jpeg 文件的形式存储在包含数万个切片的目录树中(实际上是一个包含下采样的图像金字塔)。

忽略显示图像的问题,我对在设备上存储这些数据的最有效、最易于管理的方式感兴趣:文件,就像它们目前一样,在 sqlite 数据库或其他东西中?

问题的第二部分。应用程序可以存储的数据量是否有限制,或者应用程序是否可以继续导入数据,直至设备的存储限制。我在这里询问的是应用安装后导入的数据。

【问题讨论】:

    标签: iphone image ipad ios


    【解决方案1】:

    解决方案是预先平铺巨大的图像,以便可以根据需要从文件系统中快速检索平铺。非常大的图像的一个问题是,大多数解决方案都需要将整个图像渲染到上下文中,这会消耗大量内存。在像 iOS 这样内存有限的系统上,解决这个问题的方法是使用像 libjeglibjpegturbo 一次渲染一行图像,然后将像素保存到原始文件中。直接执行此操作的缺点是,当您需要一个图块时,您需要在整个文件系统中跳转以查找图块的每一行。因此,更好的解决方案不仅是增量扫描,而且也是增量平铺。您可以使用 mmap 将文件映射到您需要的区域,这样您就可以真正减少内存消耗。也就是说,您可能会严重破坏 iOS 上的统一缓冲区队列,导致应用程序崩溃,甚至整个系统!

    如果您对如何实现上述解决方案感到好奇,可以在 github 上免费提供一个项目 - PhotoScrollerNetwork - 完成上述所有工作。

    【讨论】:

    • 我想做的正是 PhotoScroller 所做的。唯一不同的是平铺图像文件(已经预先平铺)来自服务器。 PhotoScrollerNetwork 是一个很好的起点吗?
    • 不,如果您有预平铺图像,您可以使用 PhotoScroller。也就是说,您需要做的是在尝试显示图像之前下载所有 800 张左右的图像,或者如果您不这样做,网络延迟肯定会使渲染缓慢而笨拙。一个很好的方法是先下载分辨率最低的图像 - 最小的图像 - 并在下载其他图像之前显示该图像。
    【解决方案2】:

    来自 Apple 的示例:PhotoScroller

    【讨论】:

    • 谢谢,但问题是关于在 iOS 设备上存储大图像的最佳方式,而不是如何显示。
    • 这就是答案,看看他们如何存储他们用作样本的非常大的图像。基本上图像被分解成图块。
    • 样本有小图像 - 我问的是大 2-3 个数量级的图像。您是说我可以将 1GB 图像平铺为 100k 文件在单个目录中,不会有任何问题或性能问题?当 iTunes 备份它时,它可以正常工作并且不会出现性能问题吗?
    • 我不确定在一个目录中可以创建的最大文件数。如果需要,您可以创建更多目录。
    • @ohho 确定您可以创建更多目录。您是否曾经创建过包含 10-100k 个文件的应用程序?这有什么问题(尤其是性能)吗? iTune 是否可以备份包含大量文件的应用程序?
    【解决方案3】:

    拆分成几部分怎么样。然后,如果需要,您的应用程序可以收集它

    【讨论】:

    • 我的问题是在 iOS 设备上执行此操作的最佳方法是什么?作为文件存储在文件系统中的 100,000 个 100kb 切片,具有 100,000 行 blob 的 1GB sqlite 数据库,还是其他什么?目前我们在台式计算机上使用文件 - 这种方法在 iOS 上可以正常工作吗?
    • 文件比数据库好,数据库更容易被丢弃。您可以保留一个索引数据库,以记录您使用的文件。
    • 不能说我曾经遇到过损坏的 sqlite 数据库的问题 - 这是 iOS 实现的常见问题吗?
    猜你喜欢
    • 2011-04-05
    • 2011-09-15
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多