Murat Kaya
Murat Kaya

Reputation: 1321

UIImage is equal to

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

Answers (3)

Cristik
Cristik

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

aahrens
aahrens

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

Victor Sigler
Victor Sigler

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

Related Questions