2016-01-28 24 views
12

Piksel rengini kaydetmek için aynıysa, karşılaştırmak istediğim 2 fotoğrafım var. Bu UIImage uzatma işlevi tarafından pikselin rengini tespit:Swift - Renkleri CGPoint ile karşılaştır

Örneğin
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 ??? 
} 

, resimden 1 tarayıcıyı çalıştırın ve bir dizi kaydetmek? Ya da sözlük? Ve bundan sonra tarayıcıyı resim 2 üzerinde çalıştırıyorum ve 2 resimden bilgi aldığımda, hangi fonksiyonla karşılaştırmalıyım?

Hangi CGPoint piksel renkleri 2 resimden aynı olduğunu görmek istiyorum?

GÜNCELLEME: beni dönmek için getPixelColor güncellemek "(poz) (r) (g), (b) (a)" ve bundan sonra ben SİZE ZORUNDA Bu fonksiyonu kullanmadan önce (sadece çiftleri sol bu işlevi yarattı. sort() ARRAY)

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 
    } 
} 

Bu bana böyle bir şey döndürür:! "(609,0, 47,0) 1.01.01.01.0" Ben rengi bu noktada siyah olduğunu biliyoruz yapmam x-536 için iPhone 5 ekranına sığdırdığımda ve tekrar çizme girişiminde bulunduğumda yanlış bir şey çiziyor ... belki de düzgün yapamam .. yardım?

+0

dönüşü bir 'UIColor' ve bunlar eşittir olup olmadığını kontrol? Renkler arasındaki farkın, birçok farklı yaklaşımla tartışılan bir konu olduğunu unutmayın. – Larme

+0

ayrıca - her bir pikseli mi kontrol ediyorsunuz? Bu resimleri tarıyorsanız, her bir boyutta 1/255 değerine kadar her rengi doğru taramayı düşünmeden önce bile pikselleri mükemmel hale getirme şansınız olduğunu düşünmüyorum. – Russell

+0

UIColor, protokolde yıkanabilir ... Piksellerden bazıları% 100 özdeş, hangi CGPoint'in aynı olduğunu görmek istiyorum ... –

cevap

3

. İki görüntünün her bir pikselini karşılaştırmak için bu yöntemi kullanın. Her iki piksel eşleşirse, rengi bir dizi diziye ekleyin. Basitlik için

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)") 
} 

i findMatchingPixels() resimler aynı boyutta olması gerektiren yapılmış, ancak farklı boyutlardaki görüntüleri izin almak olmaz:

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 
} 

bu gibi kullanılabilir.

GÜNCELLEME

Eğer ben böyle bir başlığın döneceğini eşleşen SADECE pikselleri isterseniz:

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

Neden farklı bir yaklaşım denemiyorsunuz? Çekirdek Resim filtresi CIDifferenceBlendMode, iki aynı görüntüye ve iki görüntü farklı olduğunda siyah olmayan alanlara sahip bir görüntü aktarılırsa tüm siyah bir görüntüyü döndürür. Bunu, maksimum pikseli içeren bir 1x1 görüntüyü döndürecek olan CIAreaMaximum'a aktarın: maksimum değer 0 ise, iki aynı görüntü olduğunu biliyorsunuzdur, maksimum değer sıfırdan büyükse, iki görüntü farklıdır.

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] 

Eğer red, green veya blue edilir değil sıfır, sen görüntüleri farklıdır biliyorum:

Verilen iki CIImage örnekleri, imageA ve imageB, burada kod! UIImage uzantısının bir UIColor döndürmesi için

+0

Piksellerden bazıları% 100 özdeş, hangi CGPoint üzerinde görmek istiyorum aynıdır ... –

+0

Ah, tamam, "Ben piksel rengini kaydetmek için aynı ise, ben karşılaştırmak istiyorum 2 resim var." Bir görüntüyü sadece iki resim aynı olsaydı kaydetmek istediğini sanıyordum. –