如何为 Apple 的大图像缩小 iOS 示例设置最大缩放限制?
Posted
技术标签:
【中文标题】如何为 Apple 的大图像缩小 iOS 示例设置最大缩放限制?【英文标题】:How to set a maximum zoom limit for Apple's Large Image Downsizing iOS example? 【发布时间】:2012-09-05 10:36:39 【问题描述】:我在我的项目中使用 Apple 的大图像缩小示例代码来加载可缩放的大图像。
示例项目可以在这里下载:Apple Large Image Downsizing
UIScrollView源码可以直接在这里查看: ImageScrollView.m
除了用户可以放大到无穷大之外,它运行良好。似乎当 Apple 使用 UIScrollView 的缩放功能时,实际缩放是通过重新缩放源图像而不是通过转换 UIView 来执行的。 (虽然我对它的工作原理的理解有点不稳定!)
我正在寻找将最大缩放限制为图像的全分辨率。
【问题讨论】:
【参考方案1】:我不知道那个项目,但它似乎没有做你真正想要的。它可以让您拍摄一个非常大的图像文件并缩小它。
有一个 github 项目 PhotoScrollerNetwork 可以让您下载巨大的 JPEG 图像(一个是 NASA 18,000 x 18,000)并在它们到达时逐步解码。然后它使用 CATiledLayers 以足够小的缩小显示图像以适合窗口,但可以缩小到完整的图像分辨率。这可能更符合您的目标。
该项目基于 Apple 的 PhotoScroller 项目,该项目仅适用于预先平铺的图像。
编辑:我下载了大图像缩小项目。它与 Apple 的PhotoScroller 有很多共同之处,如果您浏览后面的项目,您可能会弄清楚如何限制缩放。我怀疑这与以下几行有关:
self.maximumZoomScale = 5.0f;
self.minimumZoomScale = 0.25f;
也就是说,我将树叶图像粘贴到 PhotoScrollerNetwork 的捆绑包中,并在 iPhone 4 上进行了比较。Large Image Downsizing 项目需要一分钟来解码图像,您可以看到图像的增量视图虽然它渲染,但它(我相信)它需要磁盘上的整个图像才能继续。
PhotoScrollerNetwork 能够在 32 秒内解码图像 - 大约只有一半时间。如果你从网络下载,它会在接收到数据时解码图像,所以从最后一块数据到你看到图像的延迟很小。
PhotoScrollerNetwork 优惠:
并发图像下载和渲染
自动设置细节级别以优化全尺寸和全屏显示图像
非常平滑的缩放和平移(由于预渲染图块)
没有文件保存在磁盘上(但它使用磁盘缓存):这意味着如果应用程序崩溃不需要清理。
以下日志消息:
2012-09-05 11:46:11.784 LargeImage[2242:3107] 开始缩小尺寸。迭代次数:14,平铺高度:754.000000,剩余高度:425 2012-09-05 11:46:11.788 LargeImage[2242:3107] 迭代 1,共 14 2012-09-05 11:46:13.132 LargeImage[2242:3107] 迭代 2,共 14 2012-09-05 11:46:15.148 LargeImage[2242:3107] 迭代 3 of 14 2012-09-05 11:46:17.526 LargeImage[2242:3107] 迭代 4 of 14 2012-09-05 11:46:20.627 LargeImage[2242:3107] 迭代 5 of 14 2012-09-05 11:46:24.017 LargeImage[2242:3107] 迭代 6 of 14 2012-09-05 11:46:27.696 LargeImage[2242:3107] 迭代 7 of 14 2012-09-05 11:46:31.823 LargeImage[2242:3107] 迭代 8 of 14 2012-09-05 11:46:36.638 LargeImage[2242:3107] 迭代 9 of 14 2012-09-05 11:46:41.791 LargeImage[2242:3107] 迭代 10 次,共 14 次 2012-09-05 11:46:47.309 LargeImage[2242:3107] 迭代 11 of 14 2012-09-05 11:46:53.299 LargeImage[2242:3107] 迭代 12 次,共 14 次 2012-09-05 11:46:59.832 LargeImage[2242:3107] 迭代 13 of 14 2012-09-05 11:47:06.800 LargeImage[2242:3107] 迭代 14 次,共 14 次 2012-09-05 11:47:13.666 LargeImage[2242:3107] 缩小尺寸完成。
2012-09-05 11:57:24.465 PhotoScrollerNetworkTurbo[2262:1c03] 初始化:总计:270237696 已使用:163041280 免费:107196416 [驻留=6574080 虚拟=346882048] 2012-09-05 11:57:24.532 PhotoScrollerNetworkTurbo[2262:1c03] 方向=1 字符串=1 2012-09-05 11:57:24.535 PhotoScrollerNetworkTurbo[2262:1c03] ZLEVELS=5 2012-09-05 11:57:57.463 PhotoScrollerNetworkTurbo[2262:1c03] FINISH-I: 32974 毫秒 2012-09-05 11:57:57.946 PhotoScrollerNetworkTurbo[2262:1c03] 已完成:总计:260521984 已使用:219987968 免费:40534016 [resident=3469312 virtual=349683712]
【讨论】:
Large Image Downsizing 项目采用单个大图像并使用 CATiledLayers 对其进行增量解码,并且不需要先将图像切碎。 问题是我的应用程序要求将单个图像本地存储在应用程序中。我基本上是在构建各种离线地图。该图像文件的分辨率非常高,因此在被 ios 解压缩时最终为 49MB,由于实时内存使用量激增,导致设备崩溃。使用 LID 项目,我可以将图像解码为小块(图块),它可以完成我想要的一切,除了让我设置最大缩放级别。self.maximumZoomScale
似乎并没有限制图像大小,只是限制了图像视图矩形的大小。
看看PhotoScrollerNetwork
听起来很有希望。
我注意到 LID 设置了levelsOfDetailBias,这是一种额外的放大倍数(PSN 将其设置为 1 或 0)。如果您查看 PS 并与 LID 进行比较/对比,您可能可以解决这个问题。此外,使用 PhotoScroller,还有一些实用程序可以预先平铺您的图像,因此您的捆绑包中只有平铺,这对您的用户来说非常快 - 没有任何等待时间。
我无法让 PhotoScrollerNetwork 工作,每次我使用 EXC_BAD_EXCEPTION 运行时它都会崩溃。以上是关于如何为 Apple 的大图像缩小 iOS 示例设置最大缩放限制?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 iOS 版本 9 + 10(可能还有 8)实现 Apple 推送通知?