Convert a HDF5 file into a multiframe TIFF

This simple tutorial explains how to convert a mutiframe HDF5 into a Tiff. FabIO does not support mutiframe TIFF file writing (reading is OK) and provides TiffIO which supports it.

[1]:
import os
import fabio
from fabio.test.utilstest import UtilsTest
from fabio.TiffIO import TiffIO
[2]:
filename = UtilsTest.getimage("sample_water0000.h5")
print(f"Just downloaded {filename}")
Just downloaded /tmp/fabio_testdata_kieffer/sample_water0000.h5
[3]:
fimg = fabio.open(filename)
print(f"This file contains {fimg.nframes} frames of shape {fimg.shape} and weights {os.stat(filename).st_size/1e6:.3f}MB")
This file contains 10 frames of shape (1679, 1475) and weights 99.101MB
[4]:
#Initialization of the TiffIO file with the first frame, note the mode "w"
dest = filename.replace(".h5", ".tiff")
tif = TiffIO(dest, mode='w')
tif.writeImage(fimg.data)
del  tif
[5]:
# Complete the Tiff file with all other frames, note the mode "r+"
tif = TiffIO(dest, mode='r+')
for frame_id in range(1, fimg.nframes):
    tif.writeImage(fimg.get_frame(frame_id).data)
print(f"The destination file {dest} contains {tif.getNumberOfImages()} frames  and weights {os.stat(dest).st_size/1e6:.3f}MB")
del tif
The destination file /tmp/fabio_testdata_kieffer/sample_water0000.tiff contains 10 frames  and weights 99.062MB
[6]:
timg = fabio.open(dest)
print(f"{'frame id':10s}|{'min hdf5':10s}|{'min tiff':10s}|{'max hdf5':10s}|{'max tiff':10s}|{'mean hdf5':10s}|{'mean tiff':10s}|{'std hdf5':10s}|{'std tiff':10s}|{'hdf5==tiff':10s}")
for frame_id in range(fimg.nframes):
    hdata = fimg.get_frame(frame_id).data
    tdata = timg.get_frame(frame_id).data
    print(f"{frame_id:10d}|{hdata.min():10d}|{tdata.min():10d}|{hdata.max():10d}|{tdata.max():10d}|{hdata.mean():10f}|{tdata.mean():10f}|{hdata.std():10f}|{tdata.std():10f}|{(hdata==tdata).all()}")
# The two files have actually the same content
frame id  |min hdf5  |min tiff  |max hdf5  |max tiff  |mean hdf5 |mean tiff |std hdf5  |std tiff  |hdf5==tiff
         0|        -2|        -2|    284956|    284956|  6.854841|  6.854841|181.234427|181.234427|True
         1|        -2|        -2|    284956|    284956|  6.853417|  6.853417|181.238234|181.238234|True
         2|        -2|        -2|    284956|    284956|  6.854140|  6.854140|181.265561|181.265561|True
         3|        -2|        -2|    284956|    284956|  6.844210|  6.844210|181.167266|181.167266|True
         4|        -2|        -2|    284956|    284956|  6.847996|  6.847996|181.168757|181.168757|True
         5|        -2|        -2|    284956|    284956|  6.853962|  6.853962|181.265936|181.265936|True
         6|        -2|        -2|    284956|    284956|  6.855220|  6.855220|181.327199|181.327199|True
         7|        -2|        -2|    284956|    284956|  6.851232|  6.851232|181.309509|181.309509|True
         8|        -2|        -2|    284956|    284956|  6.856564|  6.856564|181.376959|181.376959|True
         9|        -2|        -2|    284956|    284956|  6.849990|  6.849990|181.285734|181.285734|True

Conclusion

This simple tutorial explains how to perform a file conversion towards multiframe TIFF.

Note the importance of the opening mode in TiffIO!