On samedi 10 novembre 2018 16:21:45 CET Tobias Wendorff wrote: > Am Sa, 10.11.2018, 16:13 schrieb Even Rouault: > > I imagine we could come with a hack to still recognize the old values, > > but I don't plan to go to that complication unless really needed. > > Not knowing the full topic: can't users with a problem just patch the > magic byte in the header to port them to the new values?
Sure. That's just what I've done with the few golden files in GDAL autotest. You can use the following Python script to do the patching. {{{ #!/usr/bin/env python import os import struct import sys def patch(filename): with open(filename, "rb+") as f: magic = f.read(4) if magic == b'\x49\x49\x2A\x00': # Classic TIFF little endian while True: dir_offset = struct.unpack('<I', f.read(4))[0] if dir_offset == 0: break f.seek(dir_offset, os.SEEK_SET) num_tags = struct.unpack('<H', f.read(2))[0] for i in range(num_tags): tag_name = struct.unpack('<H', f.read(2))[0] f.read(2 + 4) # skip type and count tag_value = struct.unpack('<I', f.read(4))[0] if tag_name == 259: # TIFFTAG_COMPRESSION if tag_value == 34926: print('Patching COMPRESSION_ZSTD to new value') f.seek(-4, os.SEEK_CUR) f.write(struct.pack('<I', (50000))) f.seek(0, os.SEEK_CUR) elif tag_value == 34927: print('Patching COMPRESSION_WEBP to new value') f.seek(-4, os.SEEK_CUR) f.write(struct.pack('<I', (50001))) f.seek(0, os.SEEK_CUR) elif magic == b'\x49\x49\x2B\x00': # BigTIFF little endian f.read(4) # skip while True: dir_offset = struct.unpack('<Q', f.read(8))[0] if dir_offset == 0: break f.seek(dir_offset, os.SEEK_SET) num_tags = struct.unpack('<Q', f.read(8))[0] for i in range(num_tags): tag_name = struct.unpack('<H', f.read(2))[0] f.read(2 + 8) # skip type and count tag_value = struct.unpack('<Q', f.read(8))[0] if tag_name == 259: # TIFFTAG_COMPRESSION if tag_value == 34926: print('Patching COMPRESSION_ZSTD to new value') f.seek(-8, os.SEEK_CUR) f.write(struct.pack('<Q', (50000))) f.seek(0, os.SEEK_CUR) elif tag_value == 34927: print('Patching COMPRESSION_WEBP to new value') f.seek(-8, os.SEEK_CUR) f.write(struct.pack('<Q', (50001))) f.seek(0, os.SEEK_CUR) else: print('Unrecognized file type') if __name__ == '__main__': patch(sys.argv[1]) }}} -- Spatialys - Geospatial professional services http://www.spatialys.com _______________________________________________ gdal-dev mailing list gdal-dev@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/gdal-dev