Ios Swift:删除图像数组中的重复项

Posted

技术标签:

【中文标题】Ios Swift:删除图像数组中的重复项【英文标题】:Ios Swift : Remove duplicates in an array of images 【发布时间】:2017-01-02 19:44:17 【问题描述】:

我有一组图像。用户可以从照片库中将其他图像添加到该数组中。因此,当他们添加时,我想检查该图像是否已经存在,如果存在,我需要跳过添加。

我在下面尝试但不适用于图像数组

extension Array where Element : Equatable

    mutating func GetDifAryFnc()
    
        var DifAryVar:[Element] = []
        for IdxVal in self
        
            if !DifAryVar.contains( IdxVal )
            
                DifAryVar.append( IdxVal )
            
        
        self = DifAryVar
    

并尝试过

class func GetDifImjAryFnc(ImjAryPsgVar: [UIImage]) -> [UIImage]

    var DifAryVar = [UIImage]()
    for IdxVal in ImjAryPsgVar
    
        if !DifAryVar.contains( IdxVal )
        
            DifAryVar.append( IdxVal )
        
    

    return DifAryVar

【问题讨论】:

Swift 中的方法和变量名应该使用小写。 如何确定两个图像相等?它们来自同一个文件吗?它们有相同的像素吗? 删除重复项确实很常见。你先搜索了吗? 换行,大写驼峰式,无需将 Index 缩写为 Idx(保存了 2 个字符?)。 C# 程序员,很容易被发现。 【参考方案1】:

“图像已经存在”是什么意思?这些图像是“按原样”从磁盘加载的吗?如果您使用 Array contains 方法,则图像必须逐字节相同才能匹配。如果即使有 1 个像素不同,或者它们在不同时间被 JPEG 压缩,它们也可能不匹配。

Arraycontains 方法依赖于符合equatable 协议的对象,我相信它会检查图像数据上的字节大小散列。)

编辑:

实际上,Apple 的这篇文章暗示 UIImage 对象的等价比较可能无法正常工作:

https://developer.apple.com/reference/uikit/uiimage(参见标题为“比较图像”的部分)

【讨论】:

【参考方案2】:

假设你的平等衡量标准是Apple 实现UIImage 符合Equatable 协议所提供的,那么为什么不使用Set 而不是Array

let image1 = UIImage(imageLiteralResourceName: "stack_view")
let image2 = UIImage(imageLiteralResourceName: "stack_view")
let image3 = UIImage(imageLiteralResourceName: "stack_view2")

if image1.isEqual(image2) 
    print("We are the same!") // Prints We are the same!
 else 
    print("We are different!")


var images = Set<UIImage>()
images.insert(image1)
images.insert(image2) // No effect since the same image is already in the set
images.insert(image3)

images.count // The count is 2 (not 3)

如果您的平等衡量标准与 Apple 的实现方式不同(我们可以假设它是基于比较图像数据*),那么您必须指定这一点。

*Apple 的UIImage 文档显示了使用isEqual(_:) 方法而不是== 运算符比较UIImage 实例的正确方法。

编辑:

如果你必须使用数组,那么你可以像这样创建一个扩展:

extension Array where Element: UIImage 
    func unique() -> [UIImage] 
        var unique = [UIImage]()
        for image in self 
            if !unique.contains(image) 
                unique.append(image)
            
        
        return unique
    

这将返回一个包含唯一 UIImage 元素的数组。

【讨论】:

您对 UIImage 的 equatable 协议实现在内部使用什么有什么看法?如果它使用 isEqual 那么 contains: 函数应该可以正常工作。 @DuncanC 我认为Equatable 协议的实现与isEqual(_:) 在幕后是一样的。我同意contains(_:) 应该基于这种想法正常工作。因此,编写一个使用contains(_:) 检查数组是否已经包含UIImage 的方法应该是可行的。

以上是关于Ios Swift:删除图像数组中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

swift 删除排序数组中的重复项

从表中的多个重复项中删除特定记录

如何使用背景图像删除 > iOS 10 和 Swift 4 中的 Tab Bar 顶部边框(阴影)?

excel怎么样自动选择重复项中的唯一值

使用 getdatainbackground 从 Parse 检索多个图像(IOS - Swift)

检测图像中的莫尔条纹 - iOS Swift