处理超高分辨率图像的最佳方法是啥?

Posted

技术标签:

【中文标题】处理超高分辨率图像的最佳方法是啥?【英文标题】:What is the Best way to Handle Very High Resolution Images?处理超高分辨率图像的最佳方法是什么? 【发布时间】:2012-09-17 11:35:24 【问题描述】:

我正在开发一个应用程序,它需要使用分辨率高于 (2000 x 2000) 的图像来实现文本清晰度。

我有一个背景图像,我需要在其上显示具有相同分辨率的叠加图像。覆盖的数量是可变的,从 2 到 30。

由于使用 UIImage 加载图像,每个像素需要 4 字节,因此如果一张图像的分辨率为 3000x3000,则最多需要 34 MB 内存,2000 x 2000 需要 15 MB。

这就是问题所在,应用在 3GS 上加载 4-5 张图片后崩溃,在 iPhone 4 上加载 11-13 张图片后崩溃。

叠加层需要准确地放置在背景图像上。它们就像我们在谷歌地图交通叠加中看到的一样。这并不排除平铺,但会使任务相对复杂。

我应该如何处理这个问题?

【问题讨论】:

这个问题可以通过平铺或者重新考虑业务逻辑来解决。 是的,我想知道是否有一种方法可以在不平铺的情况下解决这个问题。 我假设您正在使用 MapKit,因为您同时提到了 Overlays 和 Google Maps。 MKOverlayView 一个平铺视图,因此您可能不应该排除平铺。 MK 框架将在您的叠加视图上调用 drawMapRect:zoomScale:inContext:,作为最佳实践,您应该根据提供的边界矩形渲染到内容。 试试苹果的this,它在不影响分辨率的情况下缩小图像。 查看 WWDC2010 的 Advanced Scrollview 演示文稿 - 其中包括使用 UIScrollView 平铺大图像。对于这种尺寸的图像,除了平铺之外真的别无选择。 【参考方案1】:

当然,您不能一次将整个图像集加载到内存中。 您只需要加载图像数据的可见部分,并应尽快卸载不可见部分。

如果你想在 QuartzCore 级别解决这个问题,CATiledLayer 类就是为了这个目的。

苹果参考:https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html

Apple 示例代码:https://developer.apple.com/library/mac/#samplecode/CALayerEssentials/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008029

其他信息:http://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/

要使用此层,您需要将源图像拆分为多个图块。并在层需要时提供它们。 (drawLayer:inContext: 方法。)该方法将在非主线程上调用,因此不会阻塞用户界面。不要忘记释放不可见磁贴的图像以节省内存。

此外,您可以使用后台线程动态加载资源的低级 OpenGL 代码来实现这一点。在这种情况下,您可以使用 PVRTC 有损内存压缩,这可以大大节省视频内存的使用,但这确实是一项痛苦且耗时的工作。我推荐使用CATiledLayer。这对于大多数情况来说已经足够了。

【讨论】:

以上是关于处理超高分辨率图像的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 ios 7 和 ios 7+ 中处理设备特定图像的最佳方法

高质量的超高分辨率图像分割(论文简读)

从时间戳中提取时间分辨率以获取列中特定值的最佳方法是啥?

武汉大学CVEO小组:一种基于卷积神经网络(CNN)的高分辨率遥感影像分类方法

使用 CreateML 训练图像分类器的最佳图像分辨率是多少?

在 android 上加载和播放超高分辨率视频