2016-01-28 5 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) (आर) (जी) (बी) (ए)" और उसके बाद मैंने यह फ़ंक्शन बनाया जो केवल डुप्लीकेट छोड़ देता है (इस समारोह का उपयोग करने से पहले। प्रकार() 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 
    } 
} 

यह मैं कुछ इस तरह देता है: "(609.0, 47.0) 1.01.01.01.0" मुझे पता है कि रंग इस बिंदु पर काला है मैं क्या एक्स-536 के लिए आईफोन 5 स्क्रीन फिट करें और जब मैं इसे फिर से खींचने का प्रयास करता हूं तो यह कुछ गलत खींचता है ... शायद मैं इसे ठीक से नहीं कर सकता .. मदद?

+0

वापसी एक 'UIColor', और देखें कि क्या उन्होंने बराबरी कर रहे हैं? ध्यान दें कि रंगों के बीच अंतर एक अलग-अलग दृष्टिकोण के साथ एक चर्चा विषय है। – Larme

+0

भी - क्या आप हर सिंगल पिक्सेल की जांच कर रहे हैं? यदि आप इन तस्वीरों को स्कैन कर रहे हैं, तो मुझे नहीं लगता कि आपको प्रत्येक आयाम में 1/255 के लिए प्रत्येक रंग को स्कैन करने के बारे में चिंता करने से पहले, पिक्सेल-परिपूर्ण को रेखांकित करने का अधिक मौका है। – Russell

+0

यूआईसीओलर प्रोटोकॉल हैशबल के अनुरूप नहीं है ... कुछ पिक्सेल 100% समान हैं, मैं देखना चाहता हूं कि कौन से CGPoint समान हैं ... –

उत्तर

3

में यूआईएममेज एक्सटेंशन यूआईसीओलर लौटाता है। दो छवियों के प्रत्येक पिक्सेल की तुलना करने के लिए इस विधि का उपयोग करें। यदि दोनों पिक्सल मेल खाते हैं, तो रंगों को सरणी के सरणी में जोड़ें।

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() आवश्यकता छवियों ही आकार के होने बनाया है, लेकिन यह बहुत ज्यादा नहीं ले विभिन्न आकार छवियों अनुमति देने के लिए होगा।

अद्यतन

अगर आप केवल पिक्सल से मेल खाने वाले, मैं इस तरह की एक टपल वापसी चाहते हैं हैं:

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 है, तो आप जानते हैं कि अधिकतम दो समान छवियां हैं, यदि अधिकतम शून्य से अधिक है, तो दो छवियां अलग-अलग हैं।

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, green या blue नहीं कर रहे हैं शून्य, तुम्हें पता है छवियों से अलग हैं:

को देखते हुए दो CIImage उदाहरणों, imageA और imageB, यहाँ कोड है!

+0

कुछ पिक्सल 100% समान हैं, मैं देखना चाहता हूं कि कौन सी CGPoint समान हैं ... –

+0

आह, ठीक है, मैंने गलत समझा "मेरे पास 2 चित्र हैं जिन्हें मैं तुलना करना चाहता हूं, अगर पिक्सेल रंग इसे सहेजने के लिए समान है।" मैंने सोचा कि आप केवल एक छवि को सहेजना चाहते हैं अगर दो चित्र समान थे। –

संबंधित मुद्दे