首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在用UIGraphicsImageRenderer绘制图像时使用大量内存?

为什么在用UIGraphicsImageRenderer绘制图像时使用大量内存?
EN

Stack Overflow用户
提问于 2020-04-17 02:27:52
回答 1查看 1.6K关注 0票数 7

我想在照片中添加一个白色边框,同时保持照片的质量,所以我使用UIGraphicsImageRenderer绘制一个白色的背景,然后画出照片,结果是内存使用量急剧增加,还有更好的方法吗?

原始图片的分辨率为4032 * 3024。

代码语言:javascript
复制
let renderer = UIGraphicsImageRenderer(size: CGSize(width: canvasSideLength, height: canvasSideLength))
let newImage = renderer.image { context in
    UIColor.white.setFill()
    context.fill(CGRect(x: 0, y: 0, width: canvasSideLength, height: canvasSideLength))
    image.draw(in: CGRect(x: photoCanvasX, y: photoCanvasY, width: photoCanvasWidth, height: photoCanvasHeight))
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-17 05:23:34

当考虑使用的内存时,不要被JPG或PNG文件的大小误导,因为这通常是压缩的。在内存中执行图像操作时,每个像素需要4个字节(例如宽度×高度×4,以像素为单位)。

更糟糕的是,默认情况下,UIGraphicsImageRenderer将生成屏幕分辨率为2×或3×的图像(这取决于您的设备)。例如,在3×装置上,考虑:

代码语言:javascript
复制
let rect = CGRect(origin: .zero, size: CGSize(width: 8_519, height: 8_519))
let image = UIGraphicsImageRenderer(bounds: rect).image { _ in
    UIColor.white.setFill()
    UIBezierPath(rect: rect).fill()
}
print(image.cgImage!.width, "×", image.cgImage!.height)

将印刷如下:

25557×25557

如果考虑到每像素需要4个字节,则等于2.6gb。即使图像只有4,032×3,024,正如您修改后的问题所建议的,每幅图像仍然是439 by。

您可能需要确保指定一个显式刻度为1:

代码语言:javascript
复制
let rect = CGRect(origin: .zero, size: CGSize(width: 8_519, height: 8_519))
let format = UIGraphicsImageRendererFormat()
format.scale = 1
let image = UIGraphicsImageRenderer(bounds: rect, format: format).image { _ in
    UIColor.white.setFill()
    UIBezierPath(rect: rect).fill()
}
print(image.cgImage!.width, "×", image.cgImage!.height)

如您所料,它将打印:

8519×8519

然后,您将只需要290 to的图像。这仍然是很多内存,但比你使用默认的比例(在视网膜设备上)要少得多。或者,考虑到您修改后的4,032×3,024图像,这个1×图像可能只需要49×,1/9的大小对应的3×图像,而您没有设置标度。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61263161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档