数据到 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))

据我了解UIImageJPEGRepresentationUIImagePNGRepresentation can strip the image of meta data。是这个原因吗?

【问题讨论】:

我认为问题不在于UIImageJPEGRepresentation 函数,而在于UIImage 构造。很难推断UIImage internals 的内容要提到它最有可能将 jpeg 解压缩为某种位图格式。因此,将其转换回 jpeg 并不能保证具有相同的数据。顺便说一句,你想用这段代码测试什么? 感谢@ilya。这只是我简化的测试目标的摘录,但总的来说,我想看看我是否能取回我在某个时候保存的相同图像。 此外,源文件可以有很多不同的特性,比如隔行扫描等。这种信息很可能在创建UIImage 对象时被删除。一般来说,无法保证此类转化链具有相同的数据。 对于您的任务,您需要找到另一种方法来识别图像对象,例如一些命名约定(使用 UUID 作为文件名)或更复杂的数据结构。此外,比较二进制数据对象的性能可能不如您的需要。 【参考方案1】:

显示相同图像的两个 JPEG 文件会相同并没有什么特别的原因。 JPEG 文件有很多标题信息、不同的压缩算法等。即使两个文件的压缩级别都是 1(是吗?)它们都是有损的,所以每次扩展和重新压缩时都会有所不同。你在这里的期望是错误的。但是听起来你也想测试一些一开始就不需要测试的东西。

【讨论】:

【参考方案2】:

我遇到了同样的问题,并且能够使用UIImagePNGRepresentationUIImage 转换为Data,然后比较以查看两个Data 是否相等。

【讨论】:

@Dharman 对此感到抱歉。我已经编辑以提供适当的解决方案。

以上是关于数据到 UIImage 到 UIImageJPEGRepresentation 相等失败的主要内容,如果未能解决你的问题,请参考以下文章

Swift 核心数据 FetchRequest NSData 到 UIIMage

SwiftUI ImagePicker 保存(图像-> UIImage--> 数据)到核心数据

将 UIImage 作为二进制数据保存到 CoreData 实体时出错

将 UIImage 数据保存到 iOS 中的照片库后取回

NSData/UIImage 到字符串

在后台 Swift 中循环并将 json 数据附加到 UIImage[] 中