Source code for imagesplit.file.tiff_file_reader

# coding=utf-8

"""Read and write data to TIFF files"""
import os
import numpy as np
from PIL import Image, TiffImagePlugin

from imagesplit.file.data_type import DataType
from imagesplit.file.file_image_descriptor import FileImageDescriptor
from imagesplit.file.image_file_reader import BlockImageFileReader


[docs]class TiffFileReader(BlockImageFileReader): """Read and write to TIFF files""" def __init__(self, filename, image_size, data_type): super(TiffFileReader, self).__init__(image_size, data_type) # pylint: disable=super-with-arguments self.cached_image = None self.filename = filename
[docs] def close_file(self): """Closes file if required"""
[docs] def close(self): """Closes file if required"""
[docs] def load(self): """Load image data from TIFF file""" if self.cached_image is None: img = Image.open(self.filename) if self.data_type.is_rgb: print("Warning: ImageSplit currently does not support RGB " "input. Converting to grayscale.") img = img.convert('L') self.cached_image = np.array(img) return self.cached_image
[docs] def save(self, image): """Save out image data into TIFF file""" compression = self.data_type.compression if compression == 'default': compression = 'tiff_adobe_deflate' if compression not in [None, 'packbits', 'tiff_deflate', 'tiff_adobe_deflate', 'tiff_sgilog23', 'tiff_raw16']: raise ValueError( compression + ' compression not supported for TIFF files') img = Image.fromarray(image) if compression: # Set WRITE_LIBTIFF to true for compression, but restore previous # value afterwards in case user has deliberately set a value write_libtiff_previous_value = TiffImagePlugin.WRITE_LIBTIFF try: TiffImagePlugin.WRITE_LIBTIFF = True img.save(self.filename, compression=compression) finally: TiffImagePlugin.WRITE_LIBTIFF = write_libtiff_previous_value else: img.save(self.filename)
[docs] @staticmethod # pylint: disable=unused-argument def create_write_file(subimage_descriptor, file_handle_factory): """Create a TiffFileReader class for this filename and template""" filename = subimage_descriptor.filename local_file_size = subimage_descriptor.get_local_size() byte_order_msb = subimage_descriptor.msb compression = subimage_descriptor.compression data_type = DataType(subimage_descriptor.data_type, byte_order_msb=byte_order_msb, compression=compression) return TiffFileReader(filename, local_file_size, data_type)
[docs] @staticmethod def add_filename_suffix(filename, suffix): """Adds a suffix to to the filename before the extension""" name, ext = os.path.splitext(filename) return "{name}_{suffix}{ext}".format(name=name, suffix=suffix, ext=ext)
[docs] @classmethod def load_and_parse_header(cls, filename): """Reads a TIFF header file and parses""" img = Image.open(filename) descriptor = parse_tiff(img) img.close() return descriptor
[docs] @classmethod def create_read_file(cls, subimage_descriptor, file_handle_factory): # pylint:disable=unused-argument """Create a TIFF class for file access""" filename = subimage_descriptor.filename local_file_size = subimage_descriptor.get_local_size() byte_order_msb = subimage_descriptor.msb compression = subimage_descriptor.compression data_type = DataType(subimage_descriptor.data_type, byte_order_msb=byte_order_msb, compression=compression) return cls(filename=filename, image_size=local_file_size, data_type=data_type)
[docs]def parse_tiff(image): """Read a metaheader and returns a FileImageDescriptor""" file_format = "tiff" dim_order = [1, 2, 3] data_type = DataType.name_from_tiff(image.mode) image_size = [image.height, image.width, 1] msb = True compression = image.info["compression"] dpi = image.info['dpi'] voxel_size = [25.4/dpi[1], 25.4/dpi[0], 25.4/dpi[0]] header = {} return (FileImageDescriptor(file_format=file_format, dim_order=dim_order, data_type=data_type, image_size=image_size, msb=msb, compression=compression, voxel_size=voxel_size), header)