数据到 UIImage 到 UIImageJPEGRepresentation 相等失败
Posted
技术标签:
【中文标题】数据到 UIImage 到 UIImageJPEGRepresentation 相等失败【英文标题】:Data to UIImage to UIImageJPEGRepresentation equality failure 【发布时间】:2018-11-23 11:51:01 【问题描述】:为什么这种转换无法产生相同的图像数据?
let path = Bundle(for: type(of: self)).url(forResource: "Image", withExtension: "jpg")
inputData = try! Data(contentsOf: path!)
let testImage = UIImage(data: inputData)
let testImageData = UIImageJPEGRepresentation(testImage!, 1.0)
expect(testImageData).to(equal(inputData))
据我了解UIImageJPEGRepresentation
和UIImagePNGRepresentation
can strip the image of meta data。是这个原因吗?
【问题讨论】:
我认为问题不在于UIImageJPEGRepresentation
函数,而在于UIImage
构造。很难推断UIImage
internals 的内容要提到它最有可能将 jpeg 解压缩为某种位图格式。因此,将其转换回 jpeg 并不能保证具有相同的数据。顺便说一句,你想用这段代码测试什么?
感谢@ilya。这只是我简化的测试目标的摘录,但总的来说,我想看看我是否能取回我在某个时候保存的相同图像。
此外,源文件可以有很多不同的特性,比如隔行扫描等。这种信息很可能在创建UIImage
对象时被删除。一般来说,无法保证此类转化链具有相同的数据。
对于您的任务,您需要找到另一种方法来识别图像对象,例如一些命名约定(使用 UUID 作为文件名)或更复杂的数据结构。此外,比较二进制数据对象的性能可能不如您的需要。
【参考方案1】:
显示相同图像的两个 JPEG 文件会相同并没有什么特别的原因。 JPEG 文件有很多标题信息、不同的压缩算法等。即使两个文件的压缩级别都是 1(是吗?)它们都是有损的,所以每次扩展和重新压缩时都会有所不同。你在这里的期望是错误的。但是听起来你也想测试一些一开始就不需要测试的东西。
【讨论】:
【参考方案2】:我遇到了同样的问题,并且能够使用UIImagePNGRepresentation
将UIImage
转换为Data
,然后比较以查看两个Data
是否相等。
【讨论】:
@Dharman 对此感到抱歉。我已经编辑以提供适当的解决方案。以上是关于数据到 UIImage 到 UIImageJPEGRepresentation 相等失败的主要内容,如果未能解决你的问题,请参考以下文章
Swift 核心数据 FetchRequest NSData 到 UIIMage
SwiftUI ImagePicker 保存(图像-> UIImage--> 数据)到核心数据