FlexMonkey의 ImageCompareDemo은 C++에서 Swift에 대한 페이스 북의 ios-snapshot-test-case에서 불완전한 포트입니다. 그것은 픽셀 당 픽셀 비교의 마지막 부분을 생략했습니다. 내 것은 스위프트 4에 있으며 전체 기능은 다음과 같습니다.
static func compareWithImage(reference:CGImage, target:CGImage, tolerance:CGFloat) -> Bool {
guard reference.width == target.width && reference.height == target.height else { return false }
let referenceImageSize = CGSize(width:CGFloat(reference.width), height:CGFloat(reference.height))
let targetImageSize = CGSize(width:CGFloat(target.width), height:CGFloat(target.height))
let minBytesPerRow = min(reference.bytesPerRow, target.bytesPerRow)
let referenceImageSizeBytes = Int(referenceImageSize.height) * minBytesPerRow
let referenceImagePixels = calloc(1, referenceImageSizeBytes)
let targetImagePixels = calloc(1, referenceImageSizeBytes)
let referenceImageCtx = CGContext(data: referenceImagePixels,
width: Int(referenceImageSize.width),
height: Int(referenceImageSize.height),
bitsPerComponent: reference.bitsPerComponent,
bytesPerRow: minBytesPerRow,
space: reference.colorSpace!,
bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)
let targetImageCtx = CGContext(data: targetImagePixels,
width: Int(targetImageSize.width),
height: Int(targetImageSize.height),
bitsPerComponent: target.bitsPerComponent,
bytesPerRow: minBytesPerRow,
space: target.colorSpace!,
bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)
guard let referenceImageContext = referenceImageCtx, let targetImageContext = targetImageCtx else {
return false
}
referenceImageContext.draw(reference, in:CGRect(x:0, y:0, width:referenceImageSize.width, height:referenceImageSize.height))
targetImageContext.draw(target, in:CGRect(x:0, y:0, width:targetImageSize.width, height:targetImageSize.height))
var imageEqual = true
if(tolerance == 0) {
imageEqual = (memcmp(referenceImagePixels, targetImagePixels, referenceImageSizeBytes) == 0)
} else {
let pixelCount = Int(referenceImageSize.width * referenceImageSize.height)
let p1 = convertUMRPtoUInt32Array(pointer:referenceImagePixels!, length:referenceImageSizeBytes)
let p2 = convertUMRPtoUInt32Array(pointer:targetImagePixels!, length:referenceImageSizeBytes)
var percent:CGFloat = 0
var numDiffPixels = 0
for n in 0..<pixelCount {
if(p1[n] != p2[n]) {
numDiffPixels += 1
percent = CGFloat(numDiffPixels)/CGFloat(pixelCount)
if (percent > tolerance) {
imageEqual = false;
break;
}
}
}
//print(percent)
}
return imageEqual
}
재미 있습니다. 그래서 저는 그것들을 각각 UIImage로 변환 한 다음 NSData로 변환하고 비교해 보았습니다 - 여전히 번들과 동일한 이미지로도 실패했습니다. 그게 효과가 있니? – Luke
@lukech : PNG 파일 -> UIImage -> CIImage -> UIImage -> PNG 데이터로 변환합니다. 나는 데이터가 동일 할 것이라고 기대하지 않는다. –
그럴 것입니다. 아마 그것은 순진하다. 어쨌든, 내 질문에 대한 정답과 같이 보입니다. 감사합니다 :) – Luke