在高分辨率 iOS 设备上拍摄时,屏幕截图太大

Posted

技术标签:

【中文标题】在高分辨率 iOS 设备上拍摄时,屏幕截图太大【英文标题】:ScreenShot is too large when taken in high resolution iOS devices 【发布时间】:2019-02-18 09:46:39 【问题描述】:

当我在高分辨率 ios 设备上截取全屏视图时,结果图像数据非常大。例如,iPhoneX 的分辨率为 812*375,屏幕比例为 3。因此,一张全屏 ARGB 图像大约需要 812*3*375*3*4 字节,即 10.4MB。所以当我在我的应用中使用这些截图图像时,内存使用会跳到一个高水平,并且可能会触发内存警告。

这是我的代码:

if (CGRectIsEmpty(self.bounds)) 
        return nil;

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [[UIScreen mainScreen] scale]);
[self drawViewHierarchyInRect:self.bounds
           afterScreenUpdates:NO];
UIImage *renderImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

即使我压缩了截图图像,内存使用量仍然存在一些脉冲。

所以我的问题是:有什么好的方法可以拍摄高分辨率的截图并避免内存压力?

【问题讨论】:

【参考方案1】:

我在处理图像时遇到了同样的问题 - 内存使用量可能会导致内存警告和崩溃,尤其是在旧设备 (iPhone 4) 上使用 UIImageJPEGRepresentation 方法时。所以我试图避免使用这种方法,将图片保存到图库并在之后获取它们,但这并没有多大帮助,内存跳跃仍然存在。

我想“脉冲”是由于在转换过程中将整个数据复制到内存而引起的。可能的解决方案是实现自定义磁盘缓存和解码机制,以便可以分块处理数据,但仍然不知道是否值得这样做。对我来说,这个问题仍然存在,也许following list 可能会有所帮助。

另请参阅this 问题。

如果可能,其他解决方案是在didReceiveMemoryWarning 方法中释放视图控制器资源。

【讨论】:

以上是关于在高分辨率 iOS 设备上拍摄时,屏幕截图太大的主要内容,如果未能解决你的问题,请参考以下文章

在未经用户授权的情况下删除在 iOS => 9 中拍摄的最后一个屏幕截图?

iPhone iOS 如何以不同的分辨率或比例渲染屏幕截图?

整个屏幕的 Swift iOS 屏幕截图,包括拆分视图

拍摄自动屏幕截图 [重复]

我需要我没有的设备的 iOS 屏幕截图

如何在 Kivy-iOS 上修改屏幕分辨率