Reputation: 1321
I need to check if a file loaded into an UIImage
object file is equal to another image and execute some actions if so. Unfortunately, it's not working.
emptyImage = UIImage(named: imageName)
if(image1.image != emptyImage) {
// do something
} else {
// do something
}
The above code always enters the if
branch.
Upvotes: 10
Views: 14001
Reputation: 32780
You can implement the equality operator on UIImage
, which will ease your logic when it comes to comparing images:
func ==(lhs: UIImage, rhs: UIImage) -> Bool {
lhs === rhs || lhs.pngData() == rhs.pngData()
}
The operator compares the PNG representation, with a shortcut if the arguments point to the same UIImage
instance
This also enables the !=
operator on UIImage
.
Note that the .pngData
call and the byte-to-byte comparison might be a time consuming operation, so care to be taken when trying to compare large images.
Upvotes: 22
Reputation: 5590
You can convert your UIImage
instances to NSData
instances and compare them.
if let emptyImage = UIImage(named: "empty") {
let emptyData = UIImagePNGRepresentation(emptyImage)
let compareImageData = UIImagePNGRepresentation(image1.image)
if let empty = emptyData, compareTo = compareImageData {
if empty.isEqualToData(compareTo) {
// Empty image is the same as image1.image
} else {
// Empty image is not equal to image1.image
}
} else {
// Creating NSData from Images failed
}
}
Upvotes: 14
Reputation: 23451
You cannot compare two UIImage
objects using the !=
or ==
operators, one option is comparing as NSData
using the UIImagePNGRepresentation
to convert it to NSData
objects, like in the following code:
func areEqualImages(img1: UIImage, img2: UIImage) -> Bool {
guard let data1 = UIImagePNGRepresentation(img1) else { return false }
guard let data2 = UIImagePNGRepresentation(img2) else { return false }
return data1.isEqualToData(data2)
}
I hope this help you.
Upvotes: 14