Swift UIImage .jpegData() 和 .pngData() 更改图像大小
Swift UIImage .jpegData() and .pngData() changes image size
我正在使用 Swift 的深度学习视觉框架,并希望使用 REST API 将输入图像上传到后端 - 为此,我正在将我的 UIImage
转换为 MultipartFormData
使用 jpegData()
和 pngData()
函数 swift 原生提供。
我在我的应用程序中使用 session.sessionPreset = .vga640x480
指定图像大小进行处理。
我在后端看到不同尺寸的图像 - 我能够在应用程序中确认这一点,因为从图像转换的 UIImage(imageData)
尺寸不同。
这就是我将图像转换为 multipartData
-
的方式
let multipartData = MultipartFormData()
if let imageData = self.image?.jpegData(compressionQuality: 1.0) {
multipartData.append(imageData, withName: "image", fileName: "image.jpeg", mimeType: "image/jpeg")
}
这是我在 Xcode 调试器中看到的 -
以下内容看起来很直观,但体现了您所描述的行为,因此最终得到的图像 Data
表示 scale
和像素大小不正确:
let ciImage = CIImage(cvImageBuffer: pixelBuffer) // 640×480
let image = UIImage(ciImage: ciImage) // says it is 640×480 with scale of 1
guard let data = image.pngData() else { ... } // but if you extract `Data` and then recreate image from that, the size will be off by a multiple of your device’s scale
但是,如果您通过 CGImage
创建它,您将得到正确的结果:
let ciImage = CIImage(cvImageBuffer: pixelBuffer)
let ciContext = CIContext()
guard let cgImage = ciContext.createCGImage(ciImage, from: ciImage.extent) else { return }
let image = UIImage(cgImage: cgImage)
您问的是:
If my image is 640×480 points with scale 2, does my deep learning model would still take the same to process as for a 1280×960 points with scale 1?
就模型而言,640×480pt @ 2× 与 1280×960pt @ 1× 没有区别。
问题是 640×480pt @ 2× 是否优于 640×480pt @ 1×:在这种情况下,模型无疑会产生更好的结果,尽管可能更慢,图像分辨率更高(虽然在 2× ,资产大约是 larger/slower 上传的四倍;在 3× 设备上,它将大约大九倍)。
但是如果您查看直接 CIImage
» UIImage
过程生成的较大资产,您会发现它并没有真正捕获 1280×960 快照,而是捕获了 640× 480 和放大(有一些平滑),所以你真的没有更详细的资产来处理,也不太可能产生更好的结果。因此,您将支付较大资产的罚款,但可能没有任何好处。
如果您需要使用更大的图像获得更好的效果,我会将预设更改为更高分辨率,但仍然可以通过使用基于 CIContext
/CGImage
的 scale
来避免基于 scale
的调整上面分享的片段。
我正在使用 Swift 的深度学习视觉框架,并希望使用 REST API 将输入图像上传到后端 - 为此,我正在将我的 UIImage
转换为 MultipartFormData
使用 jpegData()
和 pngData()
函数 swift 原生提供。
我在我的应用程序中使用 session.sessionPreset = .vga640x480
指定图像大小进行处理。
我在后端看到不同尺寸的图像 - 我能够在应用程序中确认这一点,因为从图像转换的 UIImage(imageData)
尺寸不同。
这就是我将图像转换为 multipartData
-
let multipartData = MultipartFormData()
if let imageData = self.image?.jpegData(compressionQuality: 1.0) {
multipartData.append(imageData, withName: "image", fileName: "image.jpeg", mimeType: "image/jpeg")
}
这是我在 Xcode 调试器中看到的 -
以下内容看起来很直观,但体现了您所描述的行为,因此最终得到的图像 Data
表示 scale
和像素大小不正确:
let ciImage = CIImage(cvImageBuffer: pixelBuffer) // 640×480
let image = UIImage(ciImage: ciImage) // says it is 640×480 with scale of 1
guard let data = image.pngData() else { ... } // but if you extract `Data` and then recreate image from that, the size will be off by a multiple of your device’s scale
但是,如果您通过 CGImage
创建它,您将得到正确的结果:
let ciImage = CIImage(cvImageBuffer: pixelBuffer)
let ciContext = CIContext()
guard let cgImage = ciContext.createCGImage(ciImage, from: ciImage.extent) else { return }
let image = UIImage(cgImage: cgImage)
您问的是:
If my image is 640×480 points with scale 2, does my deep learning model would still take the same to process as for a 1280×960 points with scale 1?
就模型而言,640×480pt @ 2× 与 1280×960pt @ 1× 没有区别。
问题是 640×480pt @ 2× 是否优于 640×480pt @ 1×:在这种情况下,模型无疑会产生更好的结果,尽管可能更慢,图像分辨率更高(虽然在 2× ,资产大约是 larger/slower 上传的四倍;在 3× 设备上,它将大约大九倍)。
但是如果您查看直接 CIImage
» UIImage
过程生成的较大资产,您会发现它并没有真正捕获 1280×960 快照,而是捕获了 640× 480 和放大(有一些平滑),所以你真的没有更详细的资产来处理,也不太可能产生更好的结果。因此,您将支付较大资产的罚款,但可能没有任何好处。
如果您需要使用更大的图像获得更好的效果,我会将预设更改为更高分辨率,但仍然可以通过使用基于 CIContext
/CGImage
的 scale
来避免基于 scale
的调整上面分享的片段。