swift 判断/比较两张图片是否相同 - 感知哈希算法

前端之家收集整理的这篇文章主要介绍了swift 判断/比较两张图片是否相同 - 感知哈希算法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

首先是对图片进行处理:

  1. //1.缩小图片尺寸
  2. func scaleToSize(img: UIImage,size: CGSize) -> UIImage {
  3. UIGraphicsBeginImageContext(size)
  4. img.draw(in: CGRect(x: 0,y: 0,width: size.width,height: size.height))
  5. let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
  6. UIGraphicsEndImageContext()
  7. return scaledImage!
  8. }
  1. //2.简化色彩 将图片转换成灰度图片
  2. func getGrayImage(sourceImage: UIImage) -> UIImage {
  3. let imageRef: CGImage = sourceImage.cgImage!
  4. let width: Int = imageRef.width
  5. let height: Int = imageRef.height
  6.  
  7. let colorSpace = CGColorSpaceCreateDeviceGray()
  8. let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue)
  9. let context: CGContext = CGContext(data: nil,width: width,height: height,bitsPerComponent: 8,bytesPerRow: 0,space: colorSpace,bitmapInfo: bitmapInfo.rawValue)!
  10.  
  11. let rect: CGRect = CGRect.init(x: 0,height: height)
  12. context.draw(imageRef,in: rect)
  13.  
  14. let outPutImage: CGImage = context.makeImage()!
  15.  
  16. let newImage: UIImage = UIImage.init(cgImage: outPutImage)
  17.  
  18. return newImage
  19. }
  1. //3. 计算平均值,比较像素的灰度
  2. func pHashValueWithImage(image: UIImage) -> NSString {
  3. let pHashString = NSMutableString()
  4. let imageRef = image.cgImage!
  5. let width = imageRef.width
  6. let height = imageRef.height
  7. let pixelData = imageRef.dataProvider!.data
  8. let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
  9. var sum: Int = 0
  10. for i in 0..<width * height {
  11. if data[i] != 0 { sum = sum + Int(data[i]) }
  12. }
  13. let avr = sum / (width * height)
  14. for i in 0..<width * height {
  15. if Int(data[i]) >= avr { pHashString.append("1") } else { pHashString.append("0") }
  16. }
  17. return pHashString
  18. }
  1. //4.计算哈希值 如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片
  2. func getDifferentValueCountWithString(str1: NSString,str2: NSString) -> NSInteger {
  3. var diff: NSInteger = 0
  4. let s1 = str1.utf8String!
  5. let s2 = str2.utf8String!
  6. for i in 0..<str1.length {
  7. if s1[i] != s2[i] {
  8. diff += 1
  9. }
  10. }
  11. return diff
  12. }

写个共用方法来比较两个图片是否相同

  1. /// 比较两个图片是否相同,这里比较尺寸为20*20
  2. ///
  3. /// - Parameters:
  4. /// - imageOne: 图片1
  5. /// - imageTwo: 图片2
  6. /// - Returns: 是否相同的布尔值
  7. func isEqualImage(imageOne: UIImage,imageTwo: UIImage) -> Bool {
  8. var equalResult = false
  9. let mImageOne = self.getGrayImage(sourceImage: self.scaleToSize(img: imageOne,size: CGSize(width: 20,height: 20)))
  10. let mImageTwo = self.getGrayImage(sourceImage: self.scaleToSize(img: imageTwo,height: 20)))
  11. let diff = self.getDifferentValueCountWithString(str1: self.pHashValueWithImage(image: mImageOne),str2: self.pHashValueWithImage(image: mImageTwo))
  12. print(diff)
  13. if diff > 10 {
  14. equalResult = false
  15. } else {
  16. equalResult = true
  17. }
  18. return equalResult
  19. }

通过调用上面的共用方法,传入两个待比较的UIImage对象,得到返回的Bool,根据该布尔值进行相应的操作

猜你在找的Swift相关文章