如何在将图片保存到Core Data前调整为75×75像素?
图片存入Core Data前调整尺寸的常规流程及实现方案
常规流程
- 获取原始图片(来自系统相册或相机)
- 按目标尺寸(75×75)重绘图片:优先保持图片比例,通过裁剪或缩放适配目标尺寸,避免拉伸变形
- 将重绘后的图片转换为压缩格式的二进制数据(如JPEG)
- 将处理后的二进制数据写入Core Data的
Binary Data属性
代码实现
1. 给UIImage添加尺寸调整扩展
这个扩展会保持图片比例,裁剪并缩放到目标正方形尺寸:
extension UIImage { func resized(to targetSize: CGSize) -> UIImage? { let originalSize = self.size // 计算缩放比例,取较大值保证图片覆盖目标尺寸 let widthRatio = targetSize.width / originalSize.width let heightRatio = targetSize.height / originalSize.height let scaleRatio = max(widthRatio, heightRatio) let scaledImageSize = CGSize(width: originalSize.width * scaleRatio, height: originalSize.height * scaleRatio) // 使用图形渲染器绘制调整后的图片 let renderer = UIGraphicsImageRenderer(size: targetSize) return renderer.image { context in // 计算偏移量,让图片居中裁剪 let xOffset = (targetSize.width - scaledImageSize.width) / 2 let yOffset = (targetSize.height - scaledImageSize.height) / 2 self.draw(in: CGRect(x: xOffset, y: yOffset, width: scaledImageSize.width, height: scaledImageSize.height)) } } }
2. 修改保存Core Data的函数
在保存前调用尺寸调整方法,再转换为二进制数据:
func addItem(name: String, image: UIImage?) { var imageData: Data? if let originalImage = image { // 调整图片到75×75像素 if let resizedImage = originalImage.resized(to: CGSize(width: 75, height: 75)) { // 转换为JPEG数据,0.7的压缩质量兼顾画质和体积 imageData = resizedImage.jpegData(compressionQuality: 0.7) } } item.name = name item.image = imageData self.manager.save() }
额外优化建议
- 压缩质量调整:0.7的压缩质量比原代码的0.1画质提升明显,同时因为图片尺寸已缩小,最终文件体积会远小于原始方案
- 线程处理:如果批量处理图片,建议将尺寸调整逻辑放到后台线程执行,避免阻塞主线程导致界面卡顿
- Core Data属性配置:给
image的Binary Data属性勾选「Allows External Storage」,当数据超过阈值(默认1MB)时,Core Data会自动将图片存到外部文件,减小数据库本身的体积
内容的提问来源于stack exchange,提问作者fs_tigre
相关产品推荐
相关产品推荐

