在高分辨率 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 中拍摄的最后一个屏幕截图?