Search code examples
pythonmetadatatiffexifpiexif

Changing EXIF data of a TIF file affects the rest metadata


I am using piexif library to modify the gps altitude of a tif file's EXIF data. This is my implementation:

import piexif
from PIL import Image
Image.MAX_IMAGE_PIXELS = 1000000000

fname_1='initial.tif'
fname_2='new_file.tif'
img = Image.open(fname_1)
exif_dict = piexif.load(fname_1)
new_exif_dict = exif_dict
new_exif_dict['GPS'][piexif.GPSIFD.GPSAltitude] = (140, 1)
del new_exif_dict['0th'][50714]  # I delete this because it causes an error for class type for some reason. It happens even if I dump the original metadata as they are, to a new tif file

exif_bytes = piexif.dump(new_exif_dict)
im = Image.open(fname_1)
im.save(fname_2, exif=exif_bytes)

The code works, however the metadata are now a lot less on the new tif photo than the original one. Even the GPS coordinates are lost.

My question is how could I change the tif file's metadata about GPS without affecting the rest?


Solution

  • Using PIL and saving the image will recompress the data and rewrite or remove many tags. You can use a different library that alters less. For instance, if you are only working with tiff files, you can do this with the tifftools python package via the command line:

    tifftools set --set GPSAltitude,0,GPSIFD:0 140,1 IMG_0036_1.tif new_file.tif
    

    or via python:

    import tifftools
    
    # Load all tag information from the file
    info = tifftools.read_tiff('IMG_0036_1.tif')
    # Get a reference to the IFD with GPS tags.  If the GPS data is in a different
    # location, you might need to change this.
    gpsifd = info['ifds'][0]['tags'][tifftools.Tag.GPSIFD.value]['ifds'][0][0]
    # Set the altitude tag; this assumes it already exists and is stored as a rational
    gpsifd['tags'][tifftools.constants.GPSTag.GPSAltitude.value]['data'] = [140, 1]
    # Write the output; this copies all image data from the original file.
    tifftools.write_tiff(info, 'new_file.tif')
    

    Disclaimer: I'm the author of tifftools.