I created `Image->save()` and added a `debugLog()` command to it. Then I activated `DEBUG_FILTERS` in `global-definitions.php`. This is what happens with my filter registered to hook `save_object` and move an image from one folder to another:
[start of request]
{12839:Sun, 17 Feb 2019 16:04:26 GMT}
[Zenphoto starting to register all the filters]
[…]
{12839:Sun, 17 Feb 2019 16:04:26 GMT}
media_change_date.php=>media_change_date::updateChangeDate registered to save_object at priority 5
[…]
{12839:Sun, 17 Feb 2019 16:04:26 GMT}
Image:

ave() was called from:
#0 zp-core/admin-functions.php(2557): Image->save()
#1 zp-core/admin-edit.php(278): processImageEdit(Object(Image), 0)
#2 {main}
{12839:Sun, 17 Feb 2019 16:04:26 GMT}
Apply filters for save_image_utilities_data
exiftool::putEXIF
[This another plugin of mine. Proofs filters get applied.]
{12839:Sun, 17 Feb 2019 16:04:26 GMT}
Image:

ave() was called from:
#0 zp-core/admin-functions.php(2557): Image->save()
#1 zp-core/admin-edit.php(278): processImageEdit(Object(Image), 1)
#2 {main}
{12839:Sun, 17 Feb 2019 16:04:26 GMT}
Image:

ave() was called from:
#0 zp-core/class-image.php(857): Image->save()
#1 zp-core/admin-functions.php(2564): Image->move(Object(Album))
#2 zp-core/admin-edit.php(278): processImageEdit(Object(Image), 1)
#3 {main}
{31647:Sun, 17 Feb 2019 16:04:26 GMT}
[Zenphoto starting to register all the filters again after roundtrip]
[…]
So although the filter is registered and `Image->save()` gets called multiple times the filter is not applied.