2016-01-28 51 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张图片,我想比较,如果像素的颜色是一样的,以保存它。”我想你想拯救只有在两个画面是相同的图像。 –