2016-01-28 50 views
12

我有2張圖片,我想比較,如果像素顏色是相同的保存它。 我檢測像素的顏色由該UIImage擴展功能:斯威夫特 - 在CGPoint比較顏色

func getPixelColor(pos: CGPoint) -> ??? { 

    let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage)) 
    let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) 

    let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4 

    let r = CGFloat(data[pixelInfo])/CGFloat(255.0) 
    let g = CGFloat(data[pixelInfo+1])/CGFloat(255.0) 
    let b = CGFloat(data[pixelInfo+2])/CGFloat(255.0) 
    let a = CGFloat(data[pixelInfo+3])/CGFloat(255.0) 

    return ??? 
} 

例如,我運行圖片1的掃描器,並將其保存在一個數組?還是字典?之後,我在圖片2上運行掃描儀,當我從2張圖片中獲得信息並將其與哪種功能進行比較?

我想看到在其上CGPoint的像素的顏色是從2倍相同的圖像?

更新: 我更新getPixelColor回到我「(POS)(R)(G)(B)(a)條」之後,我創造了這個功能,只留下了副本(使用此功能一定要未雨綢繆。排序()陣列)

extension Array where Element : Equatable { 
    var duplicates: [Element] { 
     var arr:[Element] = [] 
     var start = 0 
     var start2 = 1 
     for _ in 0...self.count{ 
      if(start2<self.count){ 
       if(self[start] == self[start2]){ 
        if(arr.contains(self[start])==false){ 
         arr.append(self[start]) 
        } 
       } 
       start+=1 
       start2+=1 
      } 
     } 
     return arr 
    } 
} 

這將返回我是這樣的: 「(609.0,47.0)1.01.01.01.0」我知道,顏色爲黑色,在這一點上我做X 536適合iPhone 5屏幕,當我試圖再次繪製它會畫出錯誤的東西......也許我不能正確地做..幫助?

+0

回報'UIColor',並檢查它們是否平等?請注意,顏色之間的差異是一個討論的主題,有很多不同的方法。 – Larme

+0

也 - 你檢查每一個像素?如果您正在掃描這些照片,我認爲您甚至在您開始擔心掃描每個維度中的每種顏色的正確率爲1/255之前,都沒有太多機會讓它們排列在像素完美的位置。 – Russell

+0

的UIColor不符合協議可哈希... 一些像素是100%相同,我希望看到在其上CGPoint是相同的... –

回答

3

有UIImage擴展返回一個UIColor。使用此方法比較兩個圖像的每個像素。如果兩個像素匹配,則將該顏色添加到數組數組中。

extension UIImage { 
    func getPixelColor(pos: CGPoint) -> UIColor { 

     let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage)) 
     let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) 

     let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4 

     let r = CGFloat(data[pixelInfo])/CGFloat(255.0) 
     let g = CGFloat(data[pixelInfo+1])/CGFloat(255.0) 
     let b = CGFloat(data[pixelInfo+2])/CGFloat(255.0) 
     let a = CGFloat(data[pixelInfo+3])/CGFloat(255.0) 

     return UIColor(red: r, green: g, blue: b, alpha: a) 
    } 
} 


func findMatchingPixels(aImage: UIImage, _ bImage: UIImage) -> [[UIColor?]] { 
    guard aImage.size == bImage.size else { fatalError("images must be the same size") } 

    var matchingColors: [[UIColor?]] = [] 
    for y in 0..<Int(aImage.size.height) { 
     var currentRow = [UIColor?]() 
     for x in 0..<Int(aImage.size.width) { 
      let aColor = aImage.getPixelColor(CGPoint(x: x, y: y)) 
      let colorsMatch = bImage.getPixelColor(CGPoint(x: x, y: y)) == aColor 
      currentRow.append(colorsMatch ? aColor : nil) 
     } 
     matchingColors.append(currentRow) 
    } 
    return matchingColors 
} 

像這樣使用:

let matchingPixels = findMatchingPixels(UIImage(named: "imageA.png")!, UIImage(named: "imageB.png")!) 
if let colorForOrigin = matchingPixels[0][0] { 
    print("the images have the same color, it is: \(colorForOrigin)") 
} else { 
    print("the images do not have the same color at (0,0)") 
} 

爲簡單起見,我做出findMatchingPixels()需要的圖像是相同的大小,但它不會花費太多,讓不同大小的圖像。

UPDATE如果你想只有比賽,我會返回這樣的元組的像素

func findMatchingPixels(aImage: UIImage, _ bImage: UIImage) -> [(CGPoint, UIColor)] { 
    guard aImage.size == bImage.size else { fatalError("images must be the same size") } 

    var matchingColors = [(CGPoint, UIColor)]() 
    for y in 0..<Int(aImage.size.height) { 
     for x in 0..<Int(aImage.size.width) { 
      let aColor = aImage.getPixelColor(CGPoint(x: x, y: y)) 
      guard bImage.getPixelColor(CGPoint(x: x, y: y)) == aColor else { continue } 

      matchingColors.append((CGPoint(x: x, y: y), aColor)) 
     } 
    } 
    return matchingColors 
} 
0

爲什麼不嘗試不同的方法?如果通過兩個相同的圖像以及圖像與其中兩個圖像不同的非黑色的區域

核心映像濾波器CIDifferenceBlendMode將返回全黑圖像。將其傳遞到CIAreaMaximum,它將返回包含最大像素的1x1圖像:如果最大值爲0,則知道您有兩個相同的圖像,如果最大值大於零,則兩個圖像不同。

給定兩個CIImage情況下,imageAimageB,下面的代碼:

let ciContext = CIContext() 

let difference = imageA 
    .imageByApplyingFilter("CIDifferenceBlendMode", 
     withInputParameters: [ 
      kCIInputBackgroundImageKey: imageB]) 
    .imageByApplyingFilter("CIAreaMaximum", 
     withInputParameters: [ 
      kCIInputExtentKey: CIVector(CGRect: imageA.extent)]) 

let totalBytes = 4 
let bitmap = calloc(totalBytes, sizeof(UInt8)) 

ciContext.render(difference, 
    toBitmap: bitmap, 
    rowBytes: totalBytes, 
    bounds: difference.extent, 
    format: kCIFormatRGBA8, 
    colorSpace: nil) 

let rgba = UnsafeBufferPointer<UInt8>(
    start: UnsafePointer<UInt8>(bitmap), 
    count: totalBytes) 

let red = rgba[0] 
let green = rgba[1] 
let blue = rgba[2] 

如果red,​​或blue不爲零,你知道的圖像是不同的!

+0

一些像素是100%相同,我希望看到在其上CGPoint是相同的...... –

+0

嗯,好吧,我誤解了「我有2張圖片,我想比較,如果像素的顏色是一樣的,以保存它。」我想你想拯救只有在兩個畫面是相同的圖像。 –