
    0-Ph                       d Z ddlmZmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZdZdZdZd Zdd	ZddZ G d de           Z! G d de           Z" G d de           Z# G d de           Z$ G d de           Z% G d de           Z& G d de           Z' G d de(          Z) G d de           Z* G d de           Z+ G d  d!e           Z, G d" d#e           Z- G d$ d%e           Z. G d& d'e           Z/e/ G d( d)e                       Z0dd*Z1d+ Z2d, Z3d- Z4d. Z5d/ Z6d0 Z7d1 Z8d2 Z9d3 Z:d4 Z;dd5Z<d6 Z=d7 Z>d8 Z?d9 Z@d: ZAd; ZBd< ZCd= ZDd> ZEd? ZFd@ ZGdA ZHdB ZIdC ZJdD ZKdE ZLdF ZMdG ZNdH ZOdI ZPdJ ZQdK ZR	 	 	 	 	 	 ddNZSddOZTdP ZUdQ ZVddRZWdS ZXdT ZYdU ZZdV Z[dW Z\dX Z]e^ddYfdZZ_d[ Z` e_d\          d]             Za e_d^          d_             Zb e_d`          dda            ZcddeZd e_df          dg             ZeddhZfdi Zgdj Zhdk ZiddmZjddoZkddqZlddsZmdt ZnddvZoddyZpdz Zqdd|Zrd} ZsddZtddZuddZvd Zwd Zxd Zyd Zzd Z{ej        |                    d          fdZ}ddZ~d Zd ZddZddZd ZddZd ZddZddZd Zd Zd ZddZddZ	 	 	 	 	 	 	 	 	 	 	 ddZd Zd ZddZej        d         dk    r#eefZd ZddZddZd Z G d de          Ze%Z&neZeefZeZeZddZddZd Zedk    r ej         e                       dS dS )a8  Read image and meta data from (bio) TIFF(R) files. Save numpy arrays as TIFF.

Image and metadata can be read from TIFF, BigTIFF, OME-TIFF, STK, LSM, NIH,
SGI, ImageJ, MicroManager, FluoView, ScanImage, SEQ, GEL, and GeoTIFF files.

Tifffile is not a general-purpose TIFF library.
Only a subset of the TIFF specification is supported, mainly uncompressed and
losslessly compressed 1, 8, 16, 32 and 64 bit integer, 16, 32 and 64-bit float,
grayscale and RGB(A) images, which are commonly used in scientific imaging.
Specifically, reading slices of image data, image trees defined via SubIFDs,
CCITT and OJPEG compression, chroma subsampling without JPEG compression,
or IPTC and XMP metadata are not implemented.

TIFF(R), the tagged Image File Format, is a trademark and under control of
Adobe Systems Incorporated. BigTIFF allows for files greater than 4 GB.
STK, LSM, FluoView, SGI, SEQ, GEL, and OME-TIFF, are custom extensions
defined by Molecular Devices (Universal Imaging Corporation), Carl Zeiss
MicroImaging, Olympus, Silicon Graphics International, Media Cybernetics,
Molecular Dynamics, and the Open Microscopy Environment consortium
respectively.

For command line usage run C{python -m tifffile --help}

:Author:
  `Christoph Gohlke <https://www.lfd.uci.edu/~gohlke/>`_

:Organization:
  Laboratory for Fluorescence Dynamics, University of California, Irvine

:Version: 2018.06.15

Requirements
------------
* `CPython 3.6 64-bit <https://www.python.org>`_
* `Numpy 1.14 <http://www.numpy.org>`_
* `Matplotlib 2.2 <https://www.matplotlib.org>`_ (optional for plotting)
* `Tifffile.c 2018.02.10 <https://www.lfd.uci.edu/~gohlke/>`_
  (recommended for faster decoding of PackBits and LZW encoded strings)
* `Tifffile_geodb.py 2018.02.10 <https://www.lfd.uci.edu/~gohlke/>`_
  (optional enums for GeoTIFF metadata)
* Python 2 requires 'futures', 'enum34', 'pathlib'.

Revisions
---------
2018.06.15
    Pass 2680 tests.
    Towards reading JPEG and other compressions via imagecodecs package (WIP).
    Add function to validate TIFF using 'jhove -m TIFF-hul'.
    Save bool arrays as bilevel TIFF.
    Accept pathlib.Path as filenames.
    Move 'software' argument from TiffWriter __init__ to save.
    Raise DOS limit to 16 TB.
    Lazy load lzma and zstd compressors and decompressors.
    Add option to save IJMetadata tags.
    Return correct number of pages for truncated series (bug fix).
    Move EXIF tags to TIFF.TAG as per TIFF/EP standard.
2018.02.18
    Pass 2293 tests.
    Always save RowsPerStrip and Resolution tags as required by TIFF standard.
    Do not use badly typed ImageDescription.
    Coherce bad ASCII string tags to bytes.
    Tuning of __str__ functions.
    Fix reading 'undefined' tag values (bug fix).
    Read and write ZSTD compressed data.
    Use hexdump to print byte strings.
    Determine TIFF byte order from data dtype in imsave.
    Add option to specify RowsPerStrip for compressed strips.
    Allow memory map of arrays with non-native byte order.
    Attempt to handle ScanImage <= 5.1 files.
    Restore TiffPageSeries.pages sequence interface.
    Use numpy.frombuffer instead of fromstring to read from binary data.
    Parse GeoTIFF metadata.
    Add option to apply horizontal differencing before compression.
    Towards reading PerkinElmer QPTIFF (no test files).
    Do not index out of bounds data in tifffile.c unpackbits and decodelzw.
2017.09.29 (tentative)
    Many backwards incompatible changes improving speed and resource usage:
    Pass 2268 tests.
    Add detail argument to __str__ function. Remove info functions.
    Fix potential issue correcting offsets of large LSM files with positions.
    Remove TiffFile sequence interface; use TiffFile.pages instead.
    Do not make tag values available as TiffPage attributes.
    Use str (not bytes) type for tag and metadata strings (WIP).
    Use documented standard tag and value names (WIP).
    Use enums for some documented TIFF tag values.
    Remove 'memmap' and 'tmpfile' options; use out='memmap' instead.
    Add option to specify output in asarray functions.
    Add option to concurrently decode image strips or tiles using threads.
    Add TiffPage.asrgb function (WIP).
    Do not apply colormap in asarray.
    Remove 'colormapped', 'rgbonly', and 'scale_mdgel' options from asarray.
    Consolidate metadata in TiffFile _metadata functions.
    Remove non-tag metadata properties from TiffPage.
    Add function to convert LSM to tiled BIN files.
    Align image data in file.
    Make TiffPage.dtype a numpy.dtype.
    Add 'ndim' and 'size' properties to TiffPage and TiffPageSeries.
    Allow imsave to write non-BigTIFF files up to ~4 GB.
    Only read one page for shaped series if possible.
    Add memmap function to create memory-mapped array stored in TIFF file.
    Add option to save empty arrays to TIFF files.
    Add option to save truncated TIFF files.
    Allow single tile images to be saved contiguously.
    Add optional movie mode for files with uniform pages.
    Lazy load pages.
    Use lightweight TiffFrame for IFDs sharing properties with key TiffPage.
    Move module constants to 'TIFF' namespace (speed up module import).
    Remove 'fastij' option from TiffFile.
    Remove 'pages' parameter from TiffFile.
    Remove TIFFfile alias.
    Deprecate Python 2.
    Require enum34 and futures packages on Python 2.7.
    Remove Record class and return all metadata as dict instead.
    Add functions to parse STK, MetaSeries, ScanImage, SVS, Pilatus metadata.
    Read tags from EXIF and GPS IFDs.
    Use pformat for tag and metadata values.
    Fix reading some UIC tags (bug fix).
    Do not modify input array in imshow (bug fix).
    Fix Python implementation of unpack_ints.
2017.05.23
    Pass 1961 tests.
    Write correct number of SampleFormat values (bug fix).
    Use Adobe deflate code to write ZIP compressed files.
    Add option to pass tag values as packed binary data for writing.
    Defer tag validation to attribute access.
    Use property instead of lazyattr decorator for simple expressions.
2017.03.17
    Write IFDs and tag values on word boundaries.
    Read ScanImage metadata.
    Remove is_rgb and is_indexed attributes from TiffFile.
    Create files used by doctests.
2017.01.12
    Read Zeiss SEM metadata.
    Read OME-TIFF with invalid references to external files.
    Rewrite C LZW decoder (5x faster).
    Read corrupted LSM files missing EOI code in LZW stream.
2017.01.01
    Add option to append images to existing TIFF files.
    Read files without pages.
    Read S-FEG and Helios NanoLab tags created by FEI software.
    Allow saving Color Filter Array (CFA) images.
    Add info functions returning more information about TiffFile and TiffPage.
    Add option to read specific pages only.
    Remove maxpages argument (backwards incompatible).
    Remove test_tifffile function.
2016.10.28
    Pass 1944 tests.
    Improve detection of ImageJ hyperstacks.
    Read TVIPS metadata created by EM-MENU (by Marco Oster).
    Add option to disable using OME-XML metadata.
    Allow non-integer range attributes in modulo tags (by Stuart Berg).
2016.06.21
    Do not always memmap contiguous data in page series.
2016.05.13
    Add option to specify resolution unit.
    Write grayscale images with extra samples when planarconfig is specified.
    Do not write RGB color images with 2 samples.
    Reorder TiffWriter.save keyword arguments (backwards incompatible).
2016.04.18
    Pass 1932 tests.
    TiffWriter, imread, and imsave accept open binary file streams.
2016.04.13
    Correctly handle reversed fill order in 2 and 4 bps images (bug fix).
    Implement reverse_bitorder in C.
2016.03.18
    Fix saving additional ImageJ metadata.
2016.02.22
    Pass 1920 tests.
    Write 8 bytes double tag values using offset if necessary (bug fix).
    Add option to disable writing second image description tag.
    Detect tags with incorrect counts.
    Disable color mapping for LSM.
2015.11.13
    Read LSM 6 mosaics.
    Add option to specify directory of memory-mapped files.
    Add command line options to specify vmin and vmax values for colormapping.
2015.10.06
    New helper function to apply colormaps.
    Renamed is_palette attributes to is_indexed (backwards incompatible).
    Color-mapped samples are now contiguous (backwards incompatible).
    Do not color-map ImageJ hyperstacks (backwards incompatible).
    Towards reading Leica SCN.
2015.09.25
    Read images with reversed bit order (FillOrder is LSB2MSB).
2015.09.21
    Read RGB OME-TIFF.
    Warn about malformed OME-XML.
2015.09.16
    Detect some corrupted ImageJ metadata.
    Better axes labels for 'shaped' files.
    Do not create TiffTag for default values.
    Chroma subsampling is not supported.
    Memory-map data in TiffPageSeries if possible (optional).
2015.08.17
    Pass 1906 tests.
    Write ImageJ hyperstacks (optional).
    Read and write LZMA compressed data.
    Specify datetime when saving (optional).
    Save tiled and color-mapped images (optional).
    Ignore void bytecounts and offsets if possible.
    Ignore bogus image_depth tag created by ISS Vista software.
    Decode floating point horizontal differencing (not tiled).
    Save image data contiguously if possible.
    Only read first IFD from ImageJ files if possible.
    Read ImageJ 'raw' format (files larger than 4 GB).
    TiffPageSeries class for pages with compatible shape and data type.
    Try to read incomplete tiles.
    Open file dialog if no filename is passed on command line.
    Ignore errors when decoding OME-XML.
    Rename decoder functions (backwards incompatible).
2014.08.24
    TiffWriter class for incremental writing images.
    Simplify examples.
2014.08.19
    Add memmap function to FileHandle.
    Add function to determine if image data in TiffPage is memory-mappable.
    Do not close files if multifile_close parameter is False.
2014.08.10
    Pass 1730 tests.
    Return all extrasamples by default (backwards incompatible).
    Read data from series of pages into memory-mapped array (optional).
    Squeeze OME dimensions (backwards incompatible).
    Workaround missing EOI code in strips.
    Support image and tile depth tags (SGI extension).
    Better handling of STK/UIC tags (backwards incompatible).
    Disable color mapping for STK.
    Julian to datetime converter.
    TIFF ASCII type may be NULL separated.
    Unwrap strip offsets for LSM files greater than 4 GB.
    Correct strip byte counts in compressed LSM files.
    Skip missing files in OME series.
    Read embedded TIFF files.
2014.02.05
    Save rational numbers as type 5 (bug fix).
2013.12.20
    Keep other files in OME multi-file series closed.
    FileHandle class to abstract binary file handle.
    Disable color mapping for bad OME-TIFF produced by bio-formats.
    Read bad OME-XML produced by ImageJ when cropping.
2013.11.03
    Allow zlib compress data in imsave function (optional).
    Memory-map contiguous image data (optional).
2013.10.28
    Read MicroManager metadata and little-endian ImageJ tag.
    Save extra tags in imsave function.
    Save tags in ascending order by code (bug fix).
2012.10.18
    Accept file like objects (read from OIB files).
2012.08.21
    Rename TIFFfile to TiffFile and TIFFpage to TiffPage.
    TiffSequence class for reading sequence of TIFF files.
    Read UltraQuant tags.
    Allow float numbers as resolution in imsave function.
2012.08.03
    Read MD GEL tags and NIH Image header.
2012.07.25
    Read ImageJ tags.
    ...

Notes
-----
The API is not stable yet and might change between revisions.

Tested on little-endian platforms only.

Other Python packages and modules for reading (bio) scientific TIFF files:

*  `python-bioformats <https://github.com/CellProfiler/python-bioformats>`_
*  `Imread <https://github.com/luispedro/imread>`_
*  `PyLibTiff <https://github.com/pearu/pylibtiff>`_
*  `ITK <https://www.itk.org>`_
*  `PyLSM <https://launchpad.net/pylsm>`_
*  `PyMca.TiffIO.py <https://github.com/vasole/pymca>`_ (same as fabio.TiffIO)
*  `BioImageXD.Readers <http://www.bioimagexd.net/>`_
*  `Cellcognition.io <http://cellcognition.org/>`_
*  `pymimage <https://github.com/ardoi/pymimage>`_
*  `pytiff <https://github.com/FZJ-INM1-BDA/pytiff>`_

Acknowledgements
----------------
*   Egor Zindy, University of Manchester, for lsm_scan_info specifics.
*   Wim Lewis for a bug fix and some LSM functions.
*   Hadrien Mary for help on reading MicroManager files.
*   Christian Kliche for help writing tiled and color-mapped files.

References
----------
1)  TIFF 6.0 Specification and Supplements. Adobe Systems Incorporated.
    http://partners.adobe.com/public/developer/tiff/
2)  TIFF File Format FAQ. http://www.awaresystems.be/imaging/tiff/faq.html
3)  MetaMorph Stack (STK) Image File Format.
    http://support.meta.moleculardevices.com/docs/t10243.pdf
4)  Image File Format Description LSM 5/7 Release 6.0 (ZEN 2010).
    Carl Zeiss MicroImaging GmbH. BioSciences. May 10, 2011
5)  The OME-TIFF format.
    http://www.openmicroscopy.org/site/support/file-formats/ome-tiff
6)  UltraQuant(r) Version 6.0 for Windows Start-Up Guide.
    http://www.ultralum.com/images%20ultralum/pdf/UQStart%20Up%20Guide.pdf
7)  Micro-Manager File Formats.
    http://www.micro-manager.org/wiki/Micro-Manager_File_Formats
8)  Tags for TIFF and Related Specifications. Digital Preservation.
    http://www.digitalpreservation.gov/formats/content/tiff_tags.shtml
9)  ScanImage BigTiff Specification - ScanImage 2016.
    http://scanimage.vidriotechnologies.com/display/SI2016/
    ScanImage+BigTiff+Specification
10) CIPA DC-008-2016: Exchangeable image file format for digital still cameras:
    Exif Version 2.31.
    http://www.cipa.jp/std/documents/e/DC-008-Translation-2016-E.pdf

Examples
--------
>>> # write numpy array to TIFF file
>>> data = numpy.random.rand(4, 301, 219)
>>> imsave('temp.tif', data, photometric='minisblack')

>>> # read numpy array from TIFF file
>>> image = imread('temp.tif')
>>> numpy.testing.assert_array_equal(image, data)

>>> # iterate over pages and tags in TIFF file
>>> with TiffFile('temp.tif') as tif:
...     images = tif.asarray()
...     for page in tif.pages:
...         for tag in page.tags.values():
...             _ = tag.name, tag.value
...         image = page.asarray()

    )divisionprint_functionNz
2018.06.15zrestructuredtext en)imsaveimreadimshowmemmapTiffFile
TiffWriterTiffSequence
FileHandlelazyattrnatural_sorted
decode_lzw	stripnullcreate_output	repeat_ndformat_sizeproductxml2dictc                 `    t          |dd          }t          |d          }t           t                    r/t           fddD                       rt	          j                     st          d          t           d          st                     dk    r d	          t           t                    st           d          r4t           fi |5 } |j	        di |cd
d
d
           S # 1 swxY w Y   d
S t           fi |5 } |j	        di |cd
d
d
           S # 1 swxY w Y   d
S )a  Return image data from TIFF file(s) as numpy array.

    Refer to the TiffFile class and member functions for documentation.

    Parameters
    ----------
    files : str, binary stream, or sequence
        File name, seekable binary stream, glob pattern, or sequence of
        file names.
    kwargs : dict
        Parameters 'multifile' and 'is_ome' are passed to the TiffFile class.
        The 'pattern' parameter is passed to the TiffSequence class.
        Other parameters are passed to the asarray functions.
        The first image series is returned if no arguments are provided.

    Examples
    --------
    >>> # get image from first page
    >>> imsave('temp.tif', numpy.random.rand(3, 4, 301, 219))
    >>> im = imread('temp.tif', key=0)
    >>> im.shape
    (4, 301, 219)

    >>> # get images from sequence of files
    >>> ims = imread(['temp.tif', 'temp.tif'])
    >>> ims.shape
    (2, 3, 4, 301, 219)

    	multifileis_omepatternc              3       K   | ]}|v V  	d S N ).0ifiless     Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/imageio/plugins/_tifffile.py	<genexpr>zimread.<locals>.<genexpr>  s'      ,F,FAQ%Z,F,F,F,F,F,F    ?*no files foundseek   r   Nr   )parse_kwargs
isinstance
basestringanyglob
ValueErrorhasattrlenr	   asarrayr   )r   kwargskwargs_file
kwargs_seqtifimseqs   `     r    r   r     s   < v{H==Kfi00J%$$ !,F,F,F,F,F,F,F)F)F !	%   +)***5&!! c%jjAooa%$$ +v(>(> +e++{++ 	)s3;((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) %..:.. 	+% 5=**6**	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s$   C//C36C3	D##D'*D'      | c                    t          |dddd          }|Ct          |          t          j        |          j        z  }t          j        |          j        }n)	 |j        }|j        j        }n# t          $ r d}d}Y nw xY w||k    r5d|vr1|                    dd          s|                    dd          sd	|d<   d|vr||d<   t          | fi |5 }	 |	j
        |||fi |cddd           S # 1 swxY w Y   dS )
a
  Write numpy array to TIFF file.

    Refer to the TiffWriter class and member functions for documentation.

    Parameters
    ----------
    file : str or binary stream
        File name or writable binary stream, such as an open file or BytesIO.
    data : array_like
        Input image. The last dimensions are assumed to be image depth,
        height, width, and samples.
        If None, an empty array of the specified shape and dtype is
        saved to file.
        Unless 'byteorder' is specified in 'kwargs', the TIFF file byte order
        is determined from the data's dtype or the dtype argument.
    shape : tuple
        If 'data' is None, shape of an empty array to save to the file.
    dtype : numpy.dtype
        If 'data' is None, data-type of an empty array to save to the file.
    bigsize : int
        Create a BigTIFF file if the size of data in bytes is larger than
        this threshold and 'imagej' or 'truncate' are not enabled.
        By default, the threshold is 4 GB minus 32 MB reserved for metadata.
        Use the 'bigtiff' parameter to explicitly specify the type of
        file created.
    kwargs : dict
        Parameters 'append', 'byteorder', 'bigtiff', and 'imagej', are passed
        to TiffWriter(). Other parameters are passed to TiffWriter.save().

    Returns
    -------
    If the image data are written contiguously, return offset and bytecount
    of image data in the file.

    Examples
    --------
    >>> # save a RGB image
    >>> data = numpy.random.randint(0, 255, (256, 256, 3), 'uint8')
    >>> imsave('temp.tif', data, photometric='rgb')

    >>> # save a random array and metadata, using compression
    >>> data = numpy.random.rand(2, 5, 3, 301, 219)
    >>> imsave('temp.tif', data, compress=6, metadata={'axes': 'TZCYX'})

    appendbigtiff	byteorderimagejNr   FtruncateT)r'   r   numpydtypeitemsizer9   nbytes	Exceptiongetr
   save)
filedatashaper=   bigsizer0   tifargssizer9   r3   s
             r    r   r     s   \ 68YXNNG|u~~E 2 2 ;;K&&0			;D
,II 	 	 	DIII	 	wW$$Xu-- %18Z1O1O % "	'!!(	D	$	$G	$	$ 6sxeU55f556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6s$   A. .A?>A?C00C47C4r+c                 &   |M|K|                     d||dt          j                   t          | fi |}|t	          d          |d         }nt          | fi |5 }	|<|	j        |         }|j        st	          d          |j        \  }}
|j	        }|j
        }n8|	j        |         }|j        t	          d          |j	        }|j
        }|j        }|	j        |j        z   }ddd           n# 1 swxY w Y   t          j        | ||||d          S )aT  Return memory-mapped numpy array stored in TIFF file.

    Memory-mapping requires data stored in native byte order, without tiling,
    compression, predictors, etc.
    If 'shape' and 'dtype' are provided, existing files will be overwritten or
    appended to depending on the 'append' parameter.
    Otherwise the image data of a specified page or series in an existing
    file will be memory-mapped. By default, the image data of the first page
    series is memory-mapped.
    Call flush() to write any changes in the array to the file.
    Raise ValueError if the image data in the file is not memory-mappable.

    Parameters
    ----------
    filename : str
        Name of the TIFF file which stores the array.
    shape : tuple
        Shape of the empty array.
    dtype : numpy.dtype
        Data-type of the empty array.
    page : int
        Index of the page which image data to memory-map.
    series : int
        Index of the page series which image data to memory-map.
    mode : {'r+', 'r', 'c'}, optional
        The file open mode. Default is to open existing file for reading and
        writing ('r+').
    kwargs : dict
        Additional parameters passed to imsave() or TiffFile().

    Examples
    --------
    >>> # create an empty TIFF file and write to memory-mapped image
    >>> im = memmap('temp.tif', shape=(256, 256), dtype='float32')
    >>> im[255, 255] = 1.0
    >>> im.flush()
    >>> im.shape, im.dtype
    ((256, 256), dtype('float32'))
    >>> del im

    >>> # memory-map image data in a TIFF file
    >>> im = memmap('temp.tif', page=0)
    >>> im[255, 255]
    1.0

    NT)rD   rE   r=   returnoffsetalignz"image data are not memory-mappabler   C)updateTIFFALLOCATIONGRANULARITYr   r,   r	   pagesis_memmappableis_contiguousrE   r=   seriesoffsetr9   charr<   r   )filenamerE   r=   pagerT   moder0   resultrU   r3   _s              r    r   r     s   ^ U., 	 	
 	
 	
 ++F++>ABBB h))&)) 	/Sy* K$%IJJJ .	

F+=($%IJJJMEJ.E	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/  <%vucBBBs   BC//C36C3c                   ,     e Zd ZdZdZd Z fdZ xZS )r   z2Attribute whose value is computed on first access.funcc                     || _         d S r   r]   )selfr^   s     r    __init__zlazyattr.__init__m  s    			r"   c                    || S 	 |                      |          }n!# t          $ r}t          |          d }~ww xY w|t          u r(t	          t          ||          | j         j                  S t          || j         j        |           |S r   )r^   AttributeErrorRuntimeErrorNotImplementedgetattrsuper__name__setattr)r`   instanceownervaluee	__class__s        r    __get__zlazyattr.__get__s  s    K	"IIh''EE 	" 	" 	"q//!	"N""511493EFFF$),e444s    
;6;)rh   
__module____qualname____doc__	__slots__ra   ro   __classcell__)rn   s   @r    r   r   g  sT        << I          r"   r   c                   p    e Zd ZdZddZddddddddddddddddddi dd	fd
Zd Zd Zd Zd Z	d Z
d ZdS )r
   a  Write numpy arrays to TIFF file.

    TiffWriter instances must be closed using the 'close' method, which is
    automatically called when using the 'with' context manager.

    TiffWriter's main purpose is saving nD numpy array's as TIFF,
    not to create any possible TIFF format. Specifically, JPEG compression,
    SubIFDs, ExifIFD, or GPSIFD tags are not supported.

    Examples
    --------
    >>> # successively append images to BigTIFF file
    >>> data = numpy.random.rand(2, 5, 3, 301, 219)
    >>> with TiffWriter('temp.tif', bigtiff=True) as tif:
    ...     for i in range(data.shape[0]):
    ...         tif.save(data[i], compress=6, photometric='minisblack')

    FNc                   	 |r3	 t          |dd          5 }|                                }	 t          |          5 	|dk    r*t          	fddD                       rt	          d          	j        }	j        }	j        j        | _	        ddd           n# 1 swxY w Y   n1# t          $ r$}t	          d	t          |          z            d}~ww xY w|                    |           n# |                    |           w xY w	 ddd           n# 1 swxY w Y   n# t          t          f$ r d
}Y nw xY w|dv rt          j        dk    rdnd}n|dvrt	          d|z            |r|rt!          j        d           || _        t'          |          | _        d
| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _         d| _!        |r+d| _"        d| _#        d| _$        d| _%        d| _&        d| _'        n*d
| _"        d| _#        d| _$        d| _%        d| _&        d| _'        |r4t          |dd          | _(        | j(                            dd           dS t          |dd          | _(        | j(        )                    dd d|                    |r3| j(        )                    tU          j+        |d!z   d"dd                     n0| j(        )                    tU          j+        |dz   d#                     | j(                                        | _	        | j(        )                    tU          j+        || j&        z   d                     dS )$a  Open a TIFF file for writing.

        An empty TIFF file is created if the file does not exist, else the
        file is overwritten with an empty TIFF file unless 'append'
        is true. Use bigtiff=True when creating files larger than 4 GB.

        Parameters
        ----------
        file : str, binary stream, or FileHandle
            File name or writable binary stream, such as an open file
            or BytesIO.
        bigtiff : bool
            If True, the BigTIFF format is used.
        byteorder : {'<', '>', '=', '|'}
            The endianness of the data in the file.
            By default, this is the system's native byte order.
        append : bool
            If True and 'file' is an existing standard TIFF file, image data
            and tags are appended to the file.
            Appending data may corrupt specifically formatted TIFF files
            such as LSM, STK, ImageJ, NIH, or FluoView.
        imagej : bool
            If True, write an ImageJ hyperstack compatible file.
            This format can handle data types uint8, uint16, or float32 and
            data shapes up to 6 dimensions in TZCYXS order.
            RGB images (S=3 or S=4) must be uint8.
            ImageJ's default byte order is big-endian but this implementation
            uses the system's native byte order by default.
            ImageJ does not support BigTIFF format or LZMA compression.
            The ImageJ file format is undocumented.

        rbr   )rY   rH   forcec              3   >   K   | ]}t          d |z             V  dS is_N)rf   )r   ar3   s     r    r!   z&TiffWriter.__init__.<locals>.<genexpr>  sE       
9 
9$% !(UQY 7 7
9 
9 
9 
9 
9 
9r"   )lsmstkr:   nihfluoviewmicromanagerzfile contains metadataNzcannot append to file: %sF)N=|little<>r   r   zinvalid byteorder %sz#writing incompatible BigTIFF ImageJT      Q8s      HI4szr+b   wb   II   MMHHH+   *   ),r   tellr	   r*   r,   r9   
is_bigtiffrQ   next_page_offset
_ifdoffsetr@   strr%   IOErrorFileNotFoundErrorsyswarningswarn
_byteorderbool_imagej	_truncate	_metadata	_colormap_descriptionoffset_descriptionlen_descriptionlenoffset_tags_shape
_datashape
_datadtype_dataoffset_databytecounts_tagoffsets_bigtiff_offsetsize_tagsize_tagnoformat_offsetformat_valueformat_fhwritestructpack)
r`   rC   r8   r9   r7   r:   fhposrm   r3   s
            @r    ra   zTiffWriter.__init__  sI   B  	4a888 %B''))C%%b\\ IS%00S 
9 
9 
9 
9*"
9 
9 
9 
6 
60 '11I&J&J J(+I&)nG.1i.HDOI I I I I I I I I I I I I I I  % O O O()Ds1vv)MNNNO -% % % % % % % % % % % % % % %. ./    ((("}88cIIj((3i?@@@ 	Ag 	AM?@@@#F||"# %&"
# 	% DM DDM #D!$D $D!DM DDM #D!$D $D 	K!$U;;;DHHMM!Q!$T:::DHHNNU33I>??? Av{9u+<b!QGGHHHHv{9s?B??@@@"hmmooDOHNN6;y43E'EqIIJJJJJs   D DB%ABB%B	B% B	!B%$C,%
C/CCC,D,DDD DD DD D54D5T   r   ztifffile.pyr   c                 /  TUVWXYZ[ | j         }| j        T|B|rt          d          |}t          j        |                              T          }|j        }nWt          j        |T|j        j        z   d          }|j        dk    rt          d          |j	        }|j        }|j        j        }|o|j
        }|dk    }|rS|d         dk    rdnd	}t          |d|                   }||         d
z  r|||         d
z  dz   z  }n&|||         d
z  z  }nt          |          |j        z  }t          |
          | _        | j        r|rC| j        dd         |k    s0| j        |k    s%|r| j        s|st          j        || j                  sb|                                  |                                  d| _        d| _        d| _        d| _        d| _        | j        rt          d          nd| j        d         dz   f|z   | _        |sI|                                }||                    |           n|                    |           |r||fS dS |}| j        }| j        [| j        W| j        X| j         } tB          j"        j#        }!tB          j"        j$        }"tB          j"        j%        }#tB          j"        j&        }$tB          j'        j(        }%tB          j'        j)        }&|tU          tB          j"        |          }|rtU          tB          j'        |          }|sd}d}'d}ntW          |tX          tZ          f          r|\  }}(nJtW          |t\                    r3dt]          |          }(}d|(cxk    rdk    sn t          d|z            nd}(|/                                }tU          tB          j0        |          }'| j        r|dv rt          d          |rtc          j2        d           d}d})|dvrt          d|z            |r||"k    nd}*|dvrd}*tg          ||*          }+|+d         dv r|"}|dvrt          d|z            n||!}d}||&k    rt          d          |*r|%nd}|rh|(tB          j4        |'         \  V}(n$tB          j4        |'         \  V},t]          |(          }(|r#|j5        dvrt          d|z            |(fVfd	}n|(fVfd	}|Z|dvrt          d          t          j        |Tdz              }|j	        d!d"|j        d
z  z  fk    rt          d#          || _        |rtY          d$ |dd!         D                       }tm          |          d!k    })tm          |          d"k     s/|d         d%z  s$|d	         d%z  sto          d& |D                       rt          d'          nd(}d})tq          |||"k    rd!nd"          }|}tm          |          }-d}.d}/|)r|-d!k     rd})||$}d}||!}|rtB          j"        j9        }n||%k    r|-d"k    r|d         dv r|"}nr||&k    r(|)r|-d!k    r|d)         dv r|"}nW|-d"k    r|d*         dv r|"}nD|-d"k    r|d         dv r|"}n1| j        r|!}n'|)r|-d!k    r|d)         dv r|"}n|-d"k    r|d*         dv r|"}|rtm          |          |)rd!nd"k    rd}|!}||"k    rtm          |          d!k     rt          d+          tm          |          d,k     rd})|9|d         dv r|%}n,||)rd)nd*         dv r|&}n|d         ||)rd)nd*         k    r|&}n|%}||%k    rd-||)rd)nd*d         z   }|d         }.nd.||)rd)nd*d         z   d/z   }|d         }.|.d!k    r|.d!z
  }/n(||#k    rTtm          |          d"k    rt          d0          d})d}d-|d	d         z   d/z   }d1d2 |D             vrt          d3          n|rYtm          |          |)rd!nd"k    rB||%k    rd-||)rd)nd*d         z   }|d         }.nd.||)rd)nd*d         z   d/z   }|d         }.|.dz
  }/nsd}tm          |          d"k    r5|d         dk    r)|dd         }tm          |          d"k    r|d         dk    )tm          |          d!k     rd})d-||)rd*nd	d         z   d/z   }tm          |          d4v sJ tm          |          d5k    r|dd"         d/z   |d"d         z   }|d         dk    r5t          |          t          |dd                   z  }0|0f|dd         z   }|}||:                    |          }|r|)sd|d	         |d         f}||$k    r/|.dk    s|/s|d         dk    s|d         dk    rt          d6          ||"k    r|.d"k    rt          d7          |r|rt          d8          |rt          d9          |d:vrt          d;tw          |          z            t[          |          }|d	         d
z  r|d	         d
z  dz   |d	<   n|d	         d
z  |d	<   tY          |          }|t          |          k    sJ |/t          j<        |d	<          }|d	         |j	        d	         k    sJ tz          j>        d         d=k    rt~          nd> Ug Z|rd?nd@}1tB          j@        |1dAz            }2tB          j@        |1dBz            }3|3| _A        TfdCYdwUWXYZ[fdD	}4dxdF}5|r |4dGdHd|dIJ           |si n|B                                | _C        | j        r$t          ||d         dv | j        dufi | jC        }n?|s|i k    r5| j        r| jC        E                    dIK           t          |fi | jC        }nd}|r9t          |dL          }|dMz  }tm          |          | _H         |4dGdHd|dIJ           |r |4dNdHd|dIJ           || I                                } |4dOdHd |jJ        dP          dIJ            |4dQdd|'           |r |4dRddd"            |4dSdTd|d	                     |4dUdTd|d*                    |r\ |4dVdTd|d                     |4dWdTd|d	                    |d         dk    r( |4dXdTd|d)                     |4dYdTd|d                     |4dZdTdd           |s$dd"d!d[d\|j5                 }6 |4d]d|.|6f|.z              |4d^dd|jK                   | |4d_d|j        |            |4d`dd|.           |rnL|r4|.dk    r. |4dadd|jK                    |4dbd|.|j        d
z  f|.z             n |4dbdd|j        d
z             |/r,||"k    r|/dk    r |4dcddd           n |4dcd|/dd|/z             | |4dedfd |5|d                               |4dgdfd |5|d                              tm          |          d"k    r'|d"         }7|7dntU          tB          jL        |7          }7n| j        rd}7nd"}7 |4dhdd|7           n1| j        s* |4dedfddi            |4dgdfddi            |4dhddd           |rt          |T          D ]}8 |4|8  | }|r|d"         |d         z   dz
  |d         z  |d!         |d         z   dz
  |d         z  |d,         |d"         z   dz
  |d"         z  f}9t          |9          |d         z  }:t          |          |d         z  |j        z  g|:z  }; |4|2W|:|;            |4|3W|:dg|:z             |ot          |9          dk    }|s t          jN        ||d         fz   |           }<n-|r|r"t          |d"d                   g|d         z  };n)t          |d"d                   |j        z  g|d         z  }; |4|2W|d         |;            |4|3W|d         dg|d         z              |4djdTd|d*                    nt          |d	d                   |j        z  }=|dk|=z  }|dk     rd}n||d*         k    r|d*         } |4djdTd|           |d*         |z   dz
  |z  }>|>|d         z  }>dg|>z  }; |4|2W|>dg|>z              |4|3W|>dg|>z             ||st          dl          |D ]}8 |4|8  t          Zdm n          Z| jP        s1| j        s*|                                |z   dok    rt          dp          t          |rdn|d                   D ]}?|                                }@|@d"z  r|R                    dq           |@dz  }@|S                    | jT                   |R                     YW|@                     |S                    |@           |R                     Y|tm          Z                               |                                }A|R                    drU                    ds ZD                                  |                                | _T        |R                     YWd                     t          Z          D ]\  }B}C|Cd"         r|                                }@|@d"z  r|R                    dq           |@dz  }@|S                    |A|B| z  z   Xz   d,z              |R                     YW|@                     |S                    |@           |Cd         |3k    r|@}DnM|Cd         |2k    r|@}En>|Cd         dtk    r2|Cd"         W                    du          r|@| _        |A|B| z  z   d,z   | _        |R                    |Cd"                    |                                }F|	|F|	z  z
  }G|S                    |Gd           |F|Gz  }F|r0||                    |           nq|                    |           nZ|r| |                    |:|;d         z             n5d}H||?         D ]}It          |9d                   D ]}}Jt          |9d                   D ]c}Kt          |9d"                   D ]I}Lt          |d         |d"         |J|d         z  z
            }Mt          |d         |d!         |K|d         z  z
            }Nt          |d"         |d,         |L|d"         z  z
            }Od|<|Md|Nd|Odf<   |I|J|d         z  |J|d         z  |Mz   |K|d         z  |K|d         z  |Nz   |L|d"         z  |L|d"         z  |Oz   f         |<d|Md|Nd|Of<   |r9 ||<          }8|R                    |8           tm          |8          |;|H<   |Hdz  }H |                    |<           |Y                                 Ken|r|j	        d"         dk    sJ |d*         |z   dz
  |z  }>d}H||?         D ]`}It          |>          D ]N}P|Id|P|z  |Pdz   |z  f         }Q ||Q          }Q|R                    |Q           tm          |Q          |;|H<   |Hdz  }HOa|                                }@t          Z          D ]4\  }B}C|Cd         |3k    r|Cd"         rA|S                    |D           |F}R|;D ]&}S|R                     YW|R                     |R|Sz  }R'[|S                    |A|B| z  z   Xz   d,z              |R                     YW|F                     |Cd         |2k    r|r|Cd"         r:|S                    |E           |;D ]!}S|R                     YW|S                     "nF|S                    |A|B| z  z   Xz   d,z              |R                     YW|;d                               n6|S                    |@           |Y                                 |?dk    rdv ZD             Z|| _Z        d/|z   | _        || _        |F| _[        |;| _\        |rZ| _        |r|Ft          |;          fS dS dS )ya  Write numpy array and tags to TIFF file.

        The data shape's last dimensions are assumed to be image depth,
        height (length), width, and samples.
        If a colormap is provided, the data's dtype must be uint8 or uint16
        and the data values are indices into the last dimension of the
        colormap.
        If 'shape' and 'dtype' are specified, an empty array is saved.
        This option cannot be used with compression or multiple tiles.
        Image data are written uncompressed in one strip per plane by default.
        Dimensions larger than 2 to 4 (depending on photometric mode, planar
        configuration, and SGI mode) are flattened and saved as separate pages.
        The SampleFormat and BitsPerSample tags are derived from the data type.

        Parameters
        ----------
        data : numpy.ndarray or None
            Input image array.
        shape : tuple or None
            Shape of the empty array to save. Used only if 'data' is None.
        dtype : numpy.dtype or None
            Data-type of the empty array to save. Used only if 'data' is None.
        returnoffset : bool
            If True and the image data in the file is memory-mappable, return
            the offset and number of bytes of the image data in the file.
        photometric : {'MINISBLACK', 'MINISWHITE', 'RGB', 'PALETTE', 'CFA'}
            The color space of the image data.
            By default, this setting is inferred from the data shape and the
            value of colormap.
            For CFA images, DNG tags must be specified in 'extratags'.
        planarconfig : {'CONTIG', 'SEPARATE'}
            Specifies if samples are stored contiguous or in separate planes.
            By default, this setting is inferred from the data shape.
            If this parameter is set, extra samples are used to store grayscale
            images.
            'CONTIG': last dimension contains samples.
            'SEPARATE': third last dimension contains samples.
        tile : tuple of int
            The shape (depth, length, width) of image tiles to write.
            If None (default), image data are written in strips.
            The tile length and width must be a multiple of 16.
            If the tile depth is provided, the SGI ImageDepth and TileDepth
            tags are used to save volume data.
            Unless a single tile is used, tiles cannot be used to write
            contiguous files.
            Few software can read the SGI format, e.g. MeVisLab.
        contiguous : bool
            If True (default) and the data and parameters are compatible with
            previous ones, if any, the image data are stored contiguously after
            the previous one. Parameters 'photometric' and 'planarconfig'
            are ignored. Parameters 'description', datetime', and 'extratags'
            are written to the first page of a contiguous series only.
        align : int
            Byte boundary on which to align the image data in the file.
            Default 16. Use mmap.ALLOCATIONGRANULARITY for memory-mapped data.
            Following contiguous writes are not aligned.
        truncate : bool
            If True, only write the first page including shape metadata if
            possible (uncompressed, contiguous, not tiled).
            Other TIFF readers will only be able to read part of the data.
        compress : int or 'LZMA', 'ZSTD'
            Values from 0 to 9 controlling the level of zlib compression.
            If 0 (default), data are written uncompressed.
            Compression cannot be used to write contiguous files.
            If 'LZMA' or 'ZSTD', LZMA or ZSTD compression is used, which is
            not available on all platforms.
        rowsperstrip : int
            The number of rows per strip used for compression.
            Uncompressed data are written in one strip per plane.
        predictor : bool
            If True, apply horizontal differencing to integer type images
            before compression.
        colormap : numpy.ndarray
            RGB color values for the corresponding data value.
            Must be of shape (3, 2**(data.itemsize*8)) and dtype uint16.
        description : str
            The subject of the image. Must be 7-bit ASCII. Cannot be used with
            the ImageJ format. Saved with the first page only.
        datetime : datetime
            Date and time of image creation in '%Y:%m:%d %H:%M:%S' format.
            If None (default), the current date and time is used.
            Saved with the first page only.
        resolution : (float, float[, str]) or ((int, int), (int, int)[, str])
            X and Y resolutions in pixels per resolution unit as float or
            rational numbers. A third, optional parameter specifies the
            resolution unit, which must be None (default for ImageJ),
            'INCH' (default), or 'CENTIMETER'.
        software : str
            Name of the software used to create the file. Must be 7-bit ASCII.
            Saved with the first page only.
        metadata : dict
            Additional meta data to be saved along with shape information
            in JSON or ImageJ formats in an ImageDescription tag.
            If None, do not write a second ImageDescription tag.
            Strings must be 7-bit ASCII. Saved with the first page only.
        ijmetadata : dict
            Additional meta data to be saved in application specific
            IJMetadata and IJMetadataByteCounts tags. Refer to the
            imagej_metadata_tags function for valid keys and values.
            Saved with the first page only.
        extratags : sequence of tuples
            Additional tags as [(code, dtype, count, value, writeonce)].

            code : int
                The TIFF tag Id.
            dtype : str
                Data type of items in 'value' in Python struct format.
                One of B, s, H, I, 2I, b, h, i, 2i, f, d, Q, or q.
            count : int
                Number of data values. Not used for string or byte string
                values.
            value : sequence
                'Count' values compatible with 'dtype'.
                Byte strings must contain count values of dtype packed as
                binary data.
            writeonce : bool
                If True, the tag is written to the first page only.

        Nz!cannot save compressed empty filerM   r   zcannot save empty array?r&   r   Fz+ImageJ does not support non-contiguous dataADOBE_DEFLATE	   zinvalid compression level %s)LZMAZSTDz-ImageJ cannot handle LZMA or ZSTD compressionz&not writing description to ImageJ fileBHhfz$ImageJ does not support data type %sB   r   z,ImageJ does not support data type %s for RGBz%ImageJ does not support planar imagesiuz!prediction not implemented for %sc           	          t          j        | d          }t          j        |d| ddd d f         d          }  | |          S )Nr   axisr   .)r<   diffinsert)rD   levelr   
compressors      r    compressz!TiffWriter.save.<locals>.compress#  sO     :d444D <ac1aaairJJJD%:dE222r"   c                      | |          S r   r   )rD   r   r   s     r    r   z!TiffWriter.save.<locals>.compress+  s    %:dE222r"   BHz#invalid data dtype for palette moder   r=   r   r   zinvalid color map shapec              3   4   K   | ]}t          |          V  d S r   intr   r   s     r    r!   z"TiffWriter.save.<locals>.<genexpr>9  s(      22AQ222222r"   r   c              3   "   K   | ]
}|d k     V  dS r&   Nr   r   s     r    r!   z"TiffWriter.save.<locals>.<genexpr>?  s&      ++q1u++++++r"   zinvalid tile shaper   znot a RGB(A) imager   )r   r&   r   r&   zinvalid CFA image  c              3   &   K   | ]}|d          V  dS r   Nr   )r   ets     r    r!   z"TiffWriter.save.<locals>.<genexpr>  s&      77rRU777777r"   z#must specify DNG tags for CFA image)      r   z#invalid data shape for palette modez#not a RGB image (samplesperpixel=2)z$cannot save compressed bilevel imagezcannot save tiled bilevel imager   r&   zcannot save bilevel image as %sr   2c                 P    t          | t                    rt          | d          n| S )Nascii)r(   r   bytesxs    r    <lambda>z!TiffWriter.save.<locals>.<lambda>  s$    As1C1CJE!W--- r"   TileStrip
ByteCountsOffsetsc                 .    t          j        | z   g|R  S r   r   r   fmtvalr9   s     r    r   zTiffWriter.save.<locals>.pack      ;y355555r"   c           
      r   t          t          j                            | |                     } 	 t          j        |         }n # t
          $ r t          d|z            w xY w|}|dk    rF 
|          dz   }t          |          x}}|                    d          }|dk     r|}n|dz  }|f}n\t          |t                    rGt          j        |          }t          |          |z  rt          d          t          |          |z  }t          |          dk    r"|t          |d d                   z  }|d         } d	| |           |          g}d }	t          j        |          |z  k    rt          |t                    r!|                     |                     n]|dk    rYt          |t          t          t           j        f          r|d         }|                      ||                               n|                      t%          |          |z   g|R                       n|                     d                     t          |t                    r|}	nt          |t           j                  r4|j        |k    sJ |j        j        |k    sJ |                                }	nBt          |t          t          f          r t%          |          |z   g|R  }	n ||          }	                    | d
                    |          |	|f           d S )Nzunknown dtype %ss    s     r   r&   zinvalid packed binary datar   HHr"   )r   rO   	TAG_NAMESrA   DATA_DTYPESKeyErrorr,   r.   findr(   r   r   calcsizer7   tuplelistr<   ndarrayr   rH   r=   rV   tostringjoin)coder=   countrl   	writeoncetifftyperawcountdtsizeifdentryifdvaluebytestroffsetformat
offsetsizer   tagsvalueformats             r    addtagzTiffWriter.save.<locals>.addtag  s]    t~))$5566D=+E2 = = = !3e!;<<<=H||.#&u::- ::g..a<<$HHMHE5)) -//u::& C$%ABBBE

f,5zzA~~U3B3Z(b	T422DDx4P4PQHHu%%-;;eU++ YOODDe$<$<====aZZ!%%u})EFF ) %aOODDdd5%6H6H$I$IJJJJOODDdd3u::;M6VPU6V6V6V$W$WXXXX \1 5 5666eU++ 	2$HHu}55 2 :.... ;+u4444$~~//HHt}55 2#tCJJ$6????HH#tE511HKKsxx118YGHHHHHs   A A @B c                     ddl m} 	 |                    |           }n(# t          $ r  || d         | d                   }Y nw xY w|                    |          }|j        |j        fS )z> "Return nominator and denominator from float or two integers.r   Fractionr&   )	fractionsr  
from_float	TypeErrorlimit_denominator	numeratordenominator)argmax_denominatorr  fs       r    rationalz!TiffWriter.save.<locals>.rational  s    ******-'',, - - -HSVSV,,-##O44A;--s    "AAImageDescriptionr   T)r	  )	truncatedr   s@                                                                   SoftwareDateTimez%Y:%m:%d %H:%M:%SCompression	Predictor
ImageWidthr   ImageLength	TileWidth
TileLength
ImageDepth	TileDepthNewSubfileTyper   )ur   r!  cSampleFormatPhotometricInterpretationColorMapSamplesPerPixelPlanarConfigurationBitsPerSampleExtraSamplesr   XResolution2IYResolutionResolutionUnitr&   r&   RowsPerStripi   z&cannot write non-contiguous empty filec                     | d         S Nr   r   r   s    r    r   z!TiffWriter.save.<locals>.<lambda>  s
    !A$ r"   keyz%data too large for standard TIFF filer   r"   c              3   &   K   | ]}|d          V  dS r   r   r   ts     r    r!   z"TiffWriter.save.<locals>.<genexpr>  s&      11qad111111r"     s       c                 "    g | ]}|d          
|S r   r   )r   tags     r    
<listcomp>z#TiffWriter.save.<locals>.<listcomp>   s!    ;;;3r7;;;;r"   F)r  )^r   r   r,   r<   r=   newbyteorderrV   r/   rH   rE   isnativer   r>   r   r   r   r   r   array_equalr   _write_remaining_pages_write_image_descriptionr   r   r   r   write_emptywrite_arrayr   r   r   r   r   rO   PHOTOMETRIC
MINISBLACKRGBCFAPALETTEPLANARCONFIGCONTIGSEPARATEenumargr(   r  r  r   upperCOMPRESSIONr   r   imagej_shape
COMPESSORSkindr.   r*   
reshape_nd
MINISWHITEreshaper   packbitsr   versionr   r   r   copyr   imagej_descriptionrN   json_description	str2bytesr   _nowstrftimerl   RESUNITimagej_metadata_tagsemptysortedr   ranger   r%   r   r  	enumerateendswithminflushr   r   r   sum)\r`   rD   rE   r=   rK   photometricplanarconfigtile
contiguousrL   r;   r   rowsperstrip	predictorcolormapdescriptiondatetime
resolutionsoftwaremetadata
ijmetadata	extratagsr   	datashape	datadtypedatadtypecharbilevelindexdatasizerU   input_shapetagnoformattagsizerU  rV  rW  rX  rZ  r[  compresstagcompresslevelvolumeijrgbijshaper[   ndimsamplesperpixelextrasampless0strip_or_tiletagbytecountstag_offsetsr  r"  sampleformatunitrG  tilesnumtilesstripbytecountschunkrowsize	numstrips	pageindexr   
tag_offsettagindexrJ  stripoffsetsoffsetstrip_bytecounts_offsetdata_offsetskip
stripindexplanetztytxc0c1c2r   stripstrip_offsetrH   r9   r  r   r  r  r   r  r  s\                                                                                       @@@@@@@@r    rB   zTiffWriter.save  s   ` XO	< F !DEEEIE**77	BBI%NMM=y4:?'BCHHDyA~~ !:;;;
I
I JOM#:	(:3& 	?#B-!++BBEy%011H!# 2Ie,1A55Ie,11y))I,>>H h? 	?122&)33?i// 0!% 0 0 (4>BB 0 ++-----///!&*+'-.*"&!%< T$%RSSST $(?1#5#9";i"G 	WWYYF|x0000t,,,# 0%x//F'')%
-%0
"""*")$- "!$"2K@@K 	D"4#4lCCL 	>HKII(UDM22 %*2'--Hc** %*93x==-M....Q....$%Ch%NOOO / !%~~''H!$"2H==K < 	9+++ !PQQQ #FGGG"FF** !G-!WXXX*5?K3&&4EC''"9e44Gr{f$$! ++$"$12   ,
 $(#x'' !HIII).8vvD  	3$,0OK,H)
MM $ <
A #M 2 2 3>--$%H9%TUUU)6 3 3 3 3 3 3 3 *7 3 3 3 3 3 3 D(( !FGGG}XY_EEEH~!Q9+=+A%B!CCC !:;;;%DN  	22bqb22222DYY!^FD		A8b= 8b=  ++d+++++ 
 !!5666  DF y{c/A/A!!qII	9~~ 	dQhhF!KL$K "".9''!88b	V 3 3"%K)) &dQhh59+>+>"%KKAXX%)v"5"5"%KeBi611! "( "D1HHrf)<)<!eBi611! 	%CJJ+=11A>>L$K#5zzA~~ !56665zzA~~#9&&#)LL/22R0F::#+LL2YV';rr!<<<#+LL#)Lv%%#e6-ARRr,D,D&EE	"+B-!E+?22R*B*B$CCdJ	"+A,"".2C5zzQ !4555FL%*,t3I77Y77777 !FGGG 8 	Ic%jj,>AAQ??v%%#e6-ARRr,D,D&EE	"+B-!E+?22R*B*B$CCdJ	"+A,*Q.LLLe**q..U2Y!^^crc
 e**q..U2Y!^^5zzA~~%v)=2(@(@"AADHI 9~~''''y>>Q!"1",y}<IQ<2%%122)?)??B	!""-I<<&&D 	+ 	+tBxb*D'!!!##|#uQx1}}b	UV !FGGG#/Q"6"6BCCC 	7 I !GHHH D !BCCC&(( !BSEUEU!UVVVYI}q  3 )" 2Q 6	" )" 2	"i((Iwy111111~d444 }
26666 {1~$$ EJJ 	
 "&3G}|'CDn]Y%>?&	6 	6 	6 	6 	66	I 6	I 6	I 6	I 6	I 6	I 6	I 6	I 6	I 6	I 6	Ip		. 		. 		. 		.  	LF%sA{dKKKK $,@< 	,b	V#d*  .	 KK  	R~ 6%%%555*;II$.IIKKK 	L $K99K:%K#&{#3#3D F%sA{dKKKK 	AF:sAx4@@@@yy{{HQ 1 12E F FRV	
 	
 	
 	
 	}c1k222 	+F;Q***|S!U2Y///}c1eBi000 	5F;QR111F<ab222Aw{{|S!U2Y777{CDG444a+++ 	!";;INKLF_|o6W   	*CK4EFFFF:sHM8<<< #q/::: 	D 		Do11F(#q,2DEEEF#a')O;	    F?CI,>,BCCC 	Oc!!la&7&7~sAq1111~sL$:MNNN!F=$88JqM+B+BCCCF=$88JqM+B+BCCC:""!!} LqqgdlD.I.I F#S!T2222 	0F=$6222F=$6222F#S!Q/// 	)*i@@  


!\
 +	J qDG#a'DG3qDG#a'DG3qDG#a'DG3E
 u~~a0Hb	)I,>>O F=,/JJJF;hhGGG#;!(;J JDE"I<$7yIII 	J #*9QRR=#9#9":U1X"E#*9QRR=#9#9I<N#N"ORWS # F=,a/JJJF;eAheAhGGGF>3595555 eBCCj))I,>>G#$/a b	))$RyF>3<888r\1A5,FIq!I cIoOF=,	A3?KKKF;i!yIII<
<EFFF  	 	AFAJJJ
 d/// 	F 	FBGGII4H94T4TDEEE J<qqE!H== t	< t	<I''))CQw qGGDO$$$HHTT,,,---GGCLLL HHTT+s4yy11222JHHSXX11D11111222 ggiiDOHHTT,**+++ "+4 % %#q6 %''))CQw !qGGJG);;jH1LMMMHHTT,44555GGCLLL1v,,-0**Q=0025//Q33q6??;+G+G25/5?(WBT5TWX5X2HHSV$$$ ''))K;..DGGD!4K *(<NN8,,,,NN4(((( %(<NN8oa.@#@AAAA!"J!%i 3 3"'a// 3 3B&+E!Hoo 3 3*/a// !3 !3B),T!WeAhd1g6M)N)NB),T!WeAhd1g6M)N)NB),T!WeAhd1g6M)N)NB;<E"##rssBCC-$8;@(*T!WrDG|b7H(H(*T!WrDG|b7H(H(*T!WrDG|b7H(H)J<&E#2#ssCRC-$8
 (0 %3,4HUOO(*FI!ff
(C(2a

(*u(=(=(=(*



#!3333*  (z!}))))"2Y59lJ	
!)_ ( (E"9-- ( ( %a\)9QUl<R)R&R S (69%jj
3"a

( ''))C!*4  #q6[((1v B 2333'2$3 1 1DHHTT,%E%EFFF(D0LL1 
X-? ?* Lq PQQQlK!@!@AAAAV},, Mq6 MGG$;<<<(7 C C "lD)A)A B B B BC GGJG1C$Cj$PST$TUUUHHTT,8J%K%KLLLE - GGCLLLHHJJJ A~~;;t;;;,#&. 	9DJ 9"C$8$888	9 	99 9r"   c                 	   | j         r| j        rdS | j        }|                                }|dz  r|                    d           |dz  }| j        | j        }| j        }| j        }| j	        }| j
        }t          | j                  }| j        d         | j        d         z  dz
  }	fd}
t          j                    }|                     |
|t#          | j                                        |                                }|                    d                    d | j         D                                  |                                }|                     |
|d                     t'          | j                   D ]'\  }}|||z  z   |z   d	z   }|d         r|                                }|dz  r|                    d           |dz  }|                    |           	 |                     |
|||z                        nC# t*          $ r6 | j        rt/          j        d
           d| _        Y  dS t3          d          w xY w|                    |           |                    |d                    |d         | j        k    r|}|}|d         | j        k    rd}|})|                                dz  r|                    d           |                                }| j        sQ||                                |	z  z   dk    r3| j        rt/          j        d
           d| _        dS t3          d          t9          |	          D ]N}|                                }|                    | j                   |                     |
||                     |                    |           ||z   | _        ||z  }|5|                    |           |                     |
||                     n||                    |           |                     |
|||z                        |                    |           |}| j        D ]&}|                     |
||                     ||z  }'|                    |                                           Pd| _         d| _        d| _
        d| _        dS )z(Write outstanding IFDs and tags to file.Nr   r   r&   r   c                 .    t          j        | z   g|R  S r   r   r   s     r    r   z/TiffWriter._write_remaining_pages.<locals>.packB  r   r"   r"   c              3   &   K   | ]}|d          V  dS r   r   rF  s     r    r!   z4TiffWriter._write_remaining_pages.<locals>.<genexpr>J  s&      44A1Q4444444r"   r   ztruncating ImageJ fileTz#data too large for non-BigTIFF filel     ) r   r   r   r   r   r   r   r   r   r   r   rv  r   r   r   ioBytesIOr.   r  rr  r%   r@   r   r   r   r,   r   r   rq  r   getvaluer   )r`   r   fhposr  r  r  r  
dataoffsetpagedatasizepagenor   ifd	tagoffset	ifdoffsetr  rJ  offset2valuer   stripoffset2offsetstripoffset2valuer[   stripoffsetrH   r9   s                          @r    rP  z!TiffWriter._write_remaining_pages/  s   z 	T^ 	FX		19 	HHUOOOQJEO	)%
'-%
4/00Q$/!"44q8	6 	6 	6 	6 	6
 jll		$${C
OO44555HHJJ			#((4444444555HHJJ			$$|Q''(((&tz22 	1 	1MHc$x''99JFJL1v 1hhjj7 IIe$$$1HC&&&LIIdd<u==>>>>  L L L|  &>???)-$%JKKKL 		#a&!!!q6T---)5&(+%Q4+++%)"$0!88::> 	IIe ggii} 	DsxxzzF':!:[!H!H| 6777!%BCCC v 	% 	%A''))CGGDO$$$HHTT,,,---GGCLLL!IoDO,&J!)*+++		$$|Z889999+,,,		$$|S3D-DEEFFF*+++( 0 ( (DIIdd<==>>>4'KKHHS\\^^$$$$
#s   ("H,I;Ic                    | j         r| j         d         dk    s| j        dk    rdS | j        du}| j        r)| j        d         dv }t          | j         ||fi | j        }nt          | j         fi | j        }|                    d          }|d| j	        dz
           }| j
                                        }| j
                            | j                   | j
                            |           | j
                            | j                   | j
                            t          j        | j        | j        z   t'          |          dz                        | j
                            |           d| _        d| _        d| _	        dS )z(Write meta data to ImageDescription tag.r   r&   Nr   r   utf-8)r   r   r   r   r   rh  r   ri  encoder   r   r   r%   r   r   r   r   r   r   r.   )r`   colormappedisrgbr~  r   s        r    rQ  z#TiffWriter._write_image_description  s    	q!Q&&&!++FnD0< 	NKOv-E, 7;~ KK +4?MMdnMMK "((11!"<D$81$<"<=hmmood-...{###d0111K$*<<c+>N>NQR>RSS	
 	
 	
 	c"#%&" r"   c                 >    t           j                                         S )zReturn current date and time.)r  nowr`   s    r    rk  zTiffWriter._now  s     $$&&&r"   c                     | j         s|                                  |                                  | j                                         dS )z,Write remaining pages and close file handle.N)r   rP  rQ  r   closer  s    r    r  zTiffWriter.close  sH    ~ 	*'')))%%'''r"   c                     | S r   r   r  s    r    	__enter__zTiffWriter.__enter__      r"   c                 .    |                                   d S r   r  r`   exc_type	exc_value	tracebacks       r    __exit__zTiffWriter.__exit__      

r"   )FNFF)rh   rp   rq   rr   ra   rB   rP  rQ  rk  r  r  r  r   r"   r    r
   r
     s         &qK qK qK qKj -e9 e9 e9 e9Na$ a$ a$H !  !  !D' ' '        r"   r
   c                      e Zd ZdZ	 	 	 	 	 d3dZed             Zed             Zed             Z	d Z
d4d
Zed             Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd5dZed             Zed             Zed             Zed              Zed!             Z ed"             Z!ed#             Z"ed$             Z#ed%             Z$ed&             Z%ed'             Z&ed(             Z'ed)             Z(ed*             Z)ed+             Z*ed,             Z+ed-             Z,ed.             Z-ed/             Z.ed0             Z/ed1             Z0ed2             Z1dS )6r	   a  Read image and metadata from TIFF file.

    TiffFile instances must be closed using the 'close' method, which is
    automatically called when using the 'with' context manager.

    Attributes
    ----------
    pages : TiffPages
        Sequence of TIFF pages in file.
    series : list of TiffPageSeries
        Sequences of closely related TIFF pages. These are computed
        from OME, LSM, ImageJ, etc. metadata or based on similarity
        of page properties such as shape, dtype, and compression.
    byteorder : '>', '<'
        The endianness of data in the file.
        '>': big-endian (Motorola).
        '>': little-endian (Intel).
    is_flag : bool
        If True, file is of a certain format.
        Flags are: bigtiff, movie, shaped, ome, imagej, stk, lsm, fluoview,
        nih, vista, 'micromanager, metaseries, mdgel, mediacy, tvips, fei,
        sem, scn, svs, scanimage, andor, epics, pilatus, qptiff.

    All attributes are read-only.

    Examples
    --------
    >>> # read image array from TIFF file
    >>> imsave('temp.tif', numpy.random.rand(5, 301, 219))
    >>> with TiffFile('temp.tif') as tif:
    ...     data = tif.asarray()
    >>> data.shape
    (5, 301, 219)

    NTc                 X   d|v r|d= t          d          |                                D ]]\  }}	|dd         dk    r9|dd         t          j        v r#|	 |	st	          | |t          |	                     Lt          d|z            t          |d|||          }
|
| _        t          |          | _	        |
j
        | i| _        	 |
                    d	           	 d
dd|
                    d                   }n# t          $ r t          d          w xY wdd
dt           j                 }||k    | _        t'          j        |dz   |
                    d                    d	         }|dk    rd| _        t'          j        |dz   |
                    d                    \  }}|s|dk    rt          d          || _        d| _        |dz   | _        d| _        |dz   | _        d| _        |dz   | _        |dz   | _        na|dk    rLd| _        || _        d| _        |dz   | _        d| _        |dz   | _        d| _        |dz   | _        |dz   | _        nt          d          t;          |           | _        | j        rz| j         j!        d k    s,| j        d	         j"        d!k    s| j        d!         j"        d!k    r>| #                                 | $                                 | %                                 dS |rd| j        _&        dS dS # tN          $ r |
(                                  w xY w)"a  Initialize instance from file.

        Parameters
        ----------
        arg : str or open file
            Name of file or open file object.
            The file objects are closed in TiffFile.close().
        name : str
            Optional name of file in case 'arg' is a file handle.
        offset : int
            Optional start position of embedded file. By default, this is
            the current file position.
        size : int
            Optional size of embedded file. By default, this is the number
            of bytes from the 'offset' to the end of the file.
        multifile : bool
            If True (default), series may include pages from multiple files.
            Currently applies to OME-TIFF only.
        movie : bool
            If True, assume that later pages differ from first page only by
            data offsets and byte counts. Significantly increases speed and
            reduces memory usage when reading movies with thousands of pages.
            Enabling this for non-movie files will result in data corruption
            or crashes. Python 3 only.
        kwargs : bool
            'is_ome': If False, disable processing of OME-XML metadata.

        fastijz!the fastij option will be removedNr   r{   zunexpected keyword argument: %srw   )rY   namerU   rH   r   r   r   r   r   r   znot a TIFF filebigr   r   r   Tr   r   r   zinvalid BigTIFF filer   r   Q8sr   Fr   r   I4szinvalid TIFF file        r&   ))DeprecationWarningitemsrO   
FILE_FLAGSri   r   r  r   r   
_multifiler  _filesr%   readr   r,   r   r9   rN  r   unpackr   r  r  	tagnosizer  r  
tagformat1
tagformat2	TiffPagesrQ   is_lsm
filehandlerH   compression_lsm_load_pages_lsm_fix_strip_offsets_lsm_fix_strip_bytecounts	useframesr@   r  )r`   r  r  rU   rH   r   movier0   rC  rl   r   r9   sys_byteorderrf  r  zeros                   r    ra   zTiffFile.__init__  sl   L vx $%HIII ,,.. 	I 	IJC2A2w%CGt$>$>$U$D#tE{{333 AC GHHH$T&tLLLy//wo5	GGAJJJ4$'44RWWQZZ@		 4 4 4 !23334$'377FM%6DMmIORWWQZZ@@CG"}}"&#)=T1A2771::#N#N 
D =:??$%;<<<!*"#$-O!!"#,s? !"+d"2"+e"3B"'!*"#$-O!!"#,s? !"+d"2"+e"3 !4555 #4DJ{ 	,$--:a=,11:a=,11$$&&&++---..00000 ,'+
$$$, ,  	 	 	HHJJJ	s+   L	 C< ;L	 <DGL	 7L	 	 L)c                     | j         S )zReturn file handle.r   r  s    r    r  zTiffFile.filehandleW  s     xr"   c                     | j         j        S )zReturn name of file handle.)r   r  r  s    r    rW   zTiffFile.filename\  s     x}r"   c                 |    	 t          j        | j                                                  S # t          $ r Y dS w xY w)z3Return status of file handle as stat_result object.N)osfstatr   filenor@   r  s    r    r  zTiffFile.fstata  sE    	8DHOO--... 	 	 	44	s   *- 
;;c                 ~    | j                                         D ]}|j                                         i | _         dS )zClose open file handle(s).N)r  valuesr  r  )r`   r3   s     r    r  zTiffFile.closei  sA    ;%%'' 	# 	#CN  """"r"   r&   c                    | j         st          j        g           S ||d}|.	 | j        |         }n# t          t
          f$ r Y nw xY w|j        n| j         |nut          |t                    r
|         gnVt          |t                    r	|         n8t          |t          j                  rfd|D             nt          d          st          d          | j        rt          ||d          }n	||r|j        r| j        |j        j        z   }|dk    r4d         j        r'| j                            ||j        |j                  }n|t/          ||j        |j                  }| j                            |j                   | j                            |t5          |j                  |d	
          }nCt7                    dk    rd                             ||          }nt          ||          }|dS |x	 |j        |_        n# t          $ r] 	 t;          j        d|j        d|j                   d|j        z   |_        n%# t          $ r dd         j        z   |_        Y nw xY wY n?w xY wt7                    dk    rd         j        |_        ndd         j        z   |_        |S )aB  Return image data from multiple TIFF pages as numpy array.

        By default, the data from the first series is returned.

        Parameters
        ----------
        key : int, slice, or sequence of page indices
            Defines which pages to return as array.
        series : int or TiffPageSeries
            Defines which series of pages to return as array.
        out : numpy.ndarray, str, or file-like object; optional
            Buffer where image data will be saved.
            If None (default), a new array will be created.
            If numpy.ndarray, a writable array of compatible dtype and shape.
            If 'memmap', directly memory-map the image data in the TIFF file
            if possible; else create a memory-mapped array in a temporary file.
            If str or open file, the file name or file object used to
            create a memory-map to an array stored in a binary file on disk.
        validate : bool
            If True (default), validate various tags.
            Passed to TiffPage.asarray().
        maxworkers : int
            Maximum number of threads to concurrently get data from pages.
            Default is 1. If None, up to half the CPU cores are used.
            Reading data from file is limited to a single thread.
            Using multiple threads can significantly speed up this function
            if the bottleneck is decoding compressed data, e.g. in case of
            large LZW compressed LSM files.
            If the bottleneck is I/O or pure Python code, using multiple
            threads might be detrimental.

        Nr   c                      g | ]
}|         S r   r   )r   krQ   s     r    rK  z$TiffFile.asarray.<locals>.<listcomp>  s    +++!U1X+++r"   z&key must be an int, slice, or sequencezno pages selectedF)out
maxworkerssqueezer   T)r  nativer&   )r  validate)r  r  zfailed to reshape  to r   )rQ   r<   arrayrT   r   r  _pagesr(   inttypesslicecollectionsIterabler,   is_nihstack_pagesrU   r9   r=   rV   rR   r  memmap_arrayrE   r   r%   
read_arrayr   r.   r/   r   r   )	r`   rC  rT   r  r  r  rZ   typecoderQ   s	           @r    r/   zTiffFile.asarrayo  s   B z 	#;r??";6>FV,i(   MEEJE;X&& 	F3ZLEEU## 	F#JEE[122 	F++++s+++EEDEEE 	20111; 	H CJPUVVVFF[V[[~(99Hh58#:55flFM  ?'V\6<HHC$$V]33333gfl33T 4   ZZ1__1X%%#%AAFF CJGGGF>F;:%| 	: 	: 	::MM8>fllS   $)6<#7FLL! : : :#(58>#9FLLL:	: ZZ1__ 8>FLL 58>1FLsE   4 AAH 
J'3IJI=:J<I==JJc                    | j         sg S | j         j        }| j         j        }g }d                                D ]3}t	          | d|z   d          r t	          | d|z                        } n4|| j         _        || j         _        |s|                                 }d |D             }t          |          D ]\  }}||_        |S )zReturn related pages as TiffPageSeries.

        Side effect: after calling this function, TiffFile.pages might contain
        TiffPage and TiffFrame instances.

        z(ome imagej lsm fluoview nih mdgel shapedr{   Fz
_%s_seriesc                 B    g | ]}t          |j                  d k    |S r9  )rv  rE   r   r   s     r    rK  z#TiffFile.series.<locals>.<listcomp>  s*    888s17||a'7'7!'7'7'7r"   )rQ   r  keyframesplitrf   _generic_seriesrr  r  )r`   r  r  rT   r  r   r   s          r    rT   zTiffFile.series  s     z 	IJ(	:&>DDFF 	 	DtUT\511 ;|d':;;==  )
&
 	,))++F 98V888f%% 	 	DAqAGGr"   c           
      T   | j         j        rw| j         d         }|j        }|j        }t	          | j                   dk    rt	          | j                   f|z   }d|z   }t          | j         dd         ||j        |d          gS | j                             d           | j                                          g }g }i }t          j
        }| j         D ]]}|j        s
|j        |j        |j        |v fz   }||v r||                             |           B|                    |           |g||<   ^|D ]w}||         }	|	d         }|j        }|j        }t	          |	          dk    rt	          |	          f|z   }d|z   }|                    t          |	||j        |d                     x|S )	zReturn image series in file.r   r&   r   Nr  stypeFGeneric)rQ   r  rE   axesr.   TiffPageSeriesr=   clearloadrO   DECOMPESSORSr  r7   )
r`   rX   rE   r  rZ   keysrT   compressionsrC  rQ   s
             r    r  zTiffFile._generic_series  s   : 
	:a=DJE9D4:""TZ*U2Tztz!!!}eTZWUUU  	

(J 	% 	%D: *	4+;|+KLLCf}}s""4((((C   #fs 
	 
	C3KE8DJE9D5zzA~~U-TzMMueTZYOOO    r"   c           	         | j         }d|_        t          |          }d }dx}x}x}x}}g }	d}
	 |
|k    rn|
|_        ||
         }|j        st          j        d           dS d}d}t          |j                  }|                    dd          }|d         }|                    d	d          }d
|v rA|d
         }t          |          t          |          k    r|}nd}t          j        d           |g}t          |          }t          |t          |j                            \  }}|rt          j        d           dS d|cxk     r	||
z
  k    r|n ny||j        j        z  }|rd}ne|j        r|j        |z   ||
dz            j        k     rd}n?d}t!          |
dz   |
|z             D ]&}||         }||_        |                    |           ' ||	||||||           |
|z  }
|	S )z%Return image series in "shaped" file.Tc                    |d         }|s9|j         }|j        }t          |          dk    rt          |          f|z   }d|z   }t          |          }t          |          }	|j        r!|	|k    r|	|z  dk    r|d}d|z   }|	|z  f|z   }	 t          |||          }|}n8# t          $ r+}
t          j        t          |
                     Y d }
~
nd }
~
ww xY w| 
                    t          |||j        ||d|                     d S )Nr   r&   r   TShaped)r  r  r$  )rE   r  r.   r   rS   reshape_axesr,   r   r   r   r7   r   r=   )rT   rQ   r  rE   rd  r  r$  rX   rH   resizerm   s              r    append_seriesz.TiffFile._shaped_series.<locals>.append_series$  sS   8D &
yu::>> ZZME1E:D5>>DW%%F! 2ftmm8J8J$ $ITz4)E1&#D%99 & & &c!ff%%%%%%%%&MMJ"'  
 
 
 
 
s   B 
C)!CCNr   z(invalid shape metadata or corrupted filer   rE   r$  r  axes do not match shapez&series shape does not match page shaper&   F)rQ   r  r.   r  	is_shapedr   r   json_description_metadatarA   r   divmodrE   _dtyper>   is_finalrU   rq  r7   )r`   rQ   lenpagesr+  r  r  rE   rd  r  rT   r  r  r$  spagesrH   npagesmodjrX   s                      r    _shaped_serieszTiffFile._shaped_series  sk   
u::	 	 	@ 487747%7'D/	  "ENU|H% HIIIDE01CDDH<<++Dw'G [$77I!!'t99G,,#EEDM";<<<ZF7##D wx~'>'>??KFC FGGG6----X------00 ,FF%, $.uqy1A1HHH %II !&I"519efn== , ,$Qx(0d++++M&&$wiPPPVOE_/	b r"   c                 0   	 d j         _        d j         _         j         j         		d         	 fd}	  |            }n%# t          $ r t          j        d           Y dS w xY w|rg	n j                                          g }g }dv r0|                    d                    |                    d           dv r0|                    d                    |                    d	           d
v rQj	        dk    r
                    dd          r0|                    d
                    |                    d           
                    dt          	                    |rt          |          ndz  }|dk    r*|                    |           |                    d           j        d         dk    rE|                    j        dd                    |                    j        dd                    nj        dd         dk    rjj        dd         t!          |          z   j        dd         z   }t#          j        d                   |z   t#          j        dd                   z   }n4|                    j                   |                    j                   |o@t           j                   dk    o(j        d         t          |          j        z  dz  k    }t)          	|j        |d|          gS )z#Return image series in ImageJ file.Tr   c                  P   j         sdS                     dd          } | dk    rdS j        \  }}|t          j                  j        z  dz  k    s||| z  z   j        j        k    rt                      t                    dk    r||| z  z   d         j
        k    rdS dS )NFimagesr   r&   r   T)r2  rA   rS   r   rE   bitspersampler  rH   r,   r.   rU   )r;  rU   r  ijrX   rQ   r`   s      r    is_hyperstackz.TiffFile._imagej_series.<locals>.is_hyperstack  s     = uVVHa((F{{u .MFE,,t/AAQFFFEFN*T_-AAA ll"5zzA~~&56>"9E!HO"K"Ku4r"   z)invalid ImageJ metadata or corrupted fileNframesTslicesZchannelsr   
hyperstackFrM   r;  r&   r   SIr   ImageJ)r  r$  )rQ   r  r  imagej_metadatar,   r   r   r"  r7   rw  rA   r.   r   r  extendrE   r  r  rS   r<  r   r=   )
r`   r>  rD  rE   r  remainr$  r=  rX   rQ   s
   `      @@@r    _imagej_serieszTiffFile._imagej_seriesz  s:     $

!
Qx	 	 	 	 	 	 	 	&	&JJ 	 	 	MEFFFFF	  	FEEJOOr>>LLH&&&KKr>>LLH&&&KK!!"&&u*E*E!LLJ(((KK#e**--E2P'%...qQA::LL   KK9Q<3LLABB(((KK	!""&&&&Yrr]d""JqsOeEll2TZ^CE	!%%,tDIabbM/B/BBDDLL$$$KK	"""  RDJ1$R"1%$:L)LPQ)QQ 	 udj$h)  
 	
s   
A A)(A)c                    d| j         _        d| j         _        | j                                          | j        }t          t          |d                             }d                    d |D                       }t          d |D                       }t          | j         || j         d         j
        ||d         d	          gS )
z%Return image series in FluoView file.Tr   
Dimensionsr,  c              3      K   | ]H}|d          d k    t           j                            |d                                         d          V  IdS )r&   r   r   N)rO   MM_DIMENSIONSrA   r]  r   s     r    r!   z,TiffFile._fluoview_series.<locals>.<genexpr>  sR       
 
:;qtaxxD""1Q4::<<55xxxx
 
r"   c              3   X   K   | ]%}|d          d k    t          |d                    V  &dS r   r   r   s     r    r!   z,TiffFile._fluoview_series.<locals>.<genexpr>  s4      ::A1c!A$ii::r"   	ImageNameFluoViewr  r  )rQ   r  r  r"  fluoview_metadatar  reversedr  r  r   r=   )r`   mmmmhdr  rE   s        r    _fluoview_serieszTiffFile._fluoview_series  s    #


#HR-..//ww 
 
?C
 
 
 
 
 :::::::

1#_   	
 		
r"   c                 r   d| j         _        d| j         _        | j                                          | j        }|d         dv rEt          j        d          }|d         d         d         z  |d         dk    rfd	}nfd
}nd}| j         d         }t          |g|j        ||j	        |d          gS )z#Return image series in MD Gel file.Fr   FileTag)r      float32
ScalePixelr&   r   c                 :    |                      d          dz  z  S )Nr[  r   astyper|   scales    r    	transformz)TiffFile._mdgel_series.<locals>.transform  s    88I..!3e;;r"   c                 4    |                      d          z  S )Nr[  r^  r`  s    r    rb  z)TiffFile._mdgel_series.<locals>.transform  s    88I..66r"   NMDGel)rb  r  )
rQ   r  r  r"  mdgel_metadatar<   r=   r   rE   r  )r`   mdr=   rb  rX   ra  s        @r    _mdgel_serieszTiffFile._mdgel_series  s      %


 i=H$$K	**E|$E!HuQx'E)}!!< < < < < <
7 7 7 7 7 7 Iz!}
E49	QX  
 	
r"   c                 X   d| j         _        d| j         _        | j                                          | j         d         }t	          | j                   dk    r|j        }|j        }n't	          | j                   f|j        z   }d|j        z   }t          | j         ||j        |d          gS )z Return image series in NIH file.Tr   r&   r   NIHr  )	rQ   r  r  r"  r.   rE   r  r   r=   )r`   page0rE   r  s       r    _nih_serieszTiffFile._nih_series 	  s    #



1tz??aKE:DD__&4E#Dtz5%+t5QQQRRr"   c                 \  & ddl m} | j        d         j        }	 |                    |          }n# |j        $ rv}t          j        d|z             	 |                    dd          	                    d          }|                    |          }n# t          $ r Y Y d}~dS w xY wY d}~nd}~ww xY wd| j        _        d| j        _        | j                                         |j                            dd          }|| i| _        | j        j        }i }g }|D ]u}	|	j                            d	          rt          j        d
            nC|	j                            d          r4|	D ]0}
|
j                            dd                              d          s2|
D ]}|D ]}|D ]}|j        dd                             d          s%|j        d         }|j                            dd          }t*          j        |         }d|j        v rvt/          |j                            dd                    }t/          |j        d                   }t/          |j        d                   |z   }t1          j        |||          }nd |D             }||f||<   2|	j                            d          s|	j        &&                    dd          }|	D ]}|j                            d          s|j        &&                    dd          }d                    t7          &d                             }t9          &fd|D                       }t;          |dd                   }d}d}|D ]Z}|j                            d          rm|j        &|-t=          &                    d |                    }dg||z  z  }n6t=          &                    d d                    |k    rt?          d!          |	dg||z  z  }|j                            d"          s|j        &t=          &                    d#d                    }t=          &                    d$d#&v rdnd                    }t=          &                    d%|                    }&fd&|dd         D             }	 t1          j         ||dd                   }n%# t>          $ r t          j        d'           Y |w xY w|D ]s}|j                            d          s|j!        | j        vr| j"        s
g c c c c S |j        d(         } 	 tG          tH          j%                            ||                     }!d|!j        _        d|!j        _        |!j                                         n5# tL          tN          t>          f$ r t          j        d)| z             Y  nw xY w|!| j        |j!        <   |!(                                 | j        |j!                 j        }"	 tS          |r|ntU          |"                    D ]}#|"||#z            |||#z   <   n$# tV          $ r t          j        d*           Y nw xY w nc| j        }"	 tS          |r|ntU          |"                    D ]}#|"||#z            |||#z   <   5# tV          $ r t          j        d*           Y Vw xY w\tY          d+ |D                       rd}$|D ]}#|#r|#|#j        k    r|#}$ n|$sKt[          |          D ];\  }#}$|$r4|$j.        |$j/        j        _        |$j/        j        |$j.                 }$|$||#<    n<|D ]}#|#|$|#_        |$j0        }|1                    te          ||||| |d,-                     w|D ]}%t9          |%j3                  }|4                                D ]\  }\  }}|%j5        .                    |          }#tU          |          }||#         |k    r"|%j5        6                    ||d          |%_5        _||#xx         |z  cc<   |7                    |#dz   |           |%j5        6                    |||z   d          |%_5        tq          |          |%_3        |D ])}%ts          |%j3        |%j5                  \  |%_3        |%_5        *|S ).z(Return image series in OME-TIFF file(s).r   cElementTreezome-xml: %sr  ignoreNTUUID
BinaryOnlyz$ome-xml: not an ome-tiff master fileStructuredAnnotations	Namespacer,  modulor   AlongTypeotherStartStepr&   Endc                 P    g | ]#}|j                             d           |j        $S )Label)rJ  rs  text)r   labels     r    rK  z(TiffFile._ome_series.<locals>.<listcomp>?	  s@     .& .& .&,1+09+=+=g+F+F.&(-
.& .& .&r"   ImageNamePixels	PixelTypeDimensionOrderc              3   H   K   | ]}t          d |z                      V  dS )SizeNr   r   axattrs     r    r!   z'TiffFile._ome_series.<locals>.<genexpr>R	  s4      CCSfrk!233CCCCCCr"   r   Channelr5  z'cannot handle differing SamplesPerPixelTiffDataIFD	NumPlanes
PlaneCountc                 \    g | ](}t                              d |z   d                    )S )Firstr   )r   rA   r  s     r    rK  z(TiffFile._ome_series.<locals>.<listcomp>j	  s3    NNNb3txx"a8899NNNr"   zome-xml: invalid TiffData indexFileNamezome-xml: failed to read '%s'zome-xml: index out of rangec              3      K   | ]}|d u V  	d S r   r   r   s     r    r!   z'TiffFile._ome_series.<locals>.<genexpr>	  s&      //QqDy//////r"   OME)parentr  r  ):	xml.etreern  rQ   r~  
fromstring
ParseErrorr   r   decoder  r@   r  r  r"  attribrA   r  r   dirnamerJ  rs  rO   AXES_LABELSfloatr<   aranger  rT  r  r   r   r,   ravel_multi_indexr}  r  r	   r  pathr   r   r  rq  r.   
IndexErrorallrr  r  r  r=   r7   r   rE   r  r  replacer   r  squeeze_axes)'r`   etreeomexmlrootrm   uuidr  rt  rT   elementannotrl   modulalongr   newaxisstepstartstoplabelsr  pixelsr=   r  rE   rH   ifdsspprD   r  numidxfnamer3   rQ   r   r  serier  s'                                         @r    _ome_serieszTiffFile._ome_series	  s	   333333A*
	##F++DD 	 	 	M-!+,,,w99@@II''//    	  $


{vt,,Tl(" H	 H	G{##L11 DEEE{##$;<< A$ A AE <++K<<EEhOO ! !& A A%* A AE). A A',y"~'>'>w'G'G !-$,',y}*/,*:*:67*K*K*.*:7*C#*el#:#:+01A1A&!1L1L+M+MD,1%,w2G,H,HE+0e1D+E+E+LD-2\%t-L-LFF.& .&5:.& .& .&F
 18/@t#AAA* ;''00 >D88FD))D! d dz**844 }d33wwx-=(>??@@CCCCdCCCCCuSbSz** # 9I 9IDx((33 !#{<"%dhh/@#&F&F"G"GC$(6TS[#9DD *;Q!?!?@@CGG",-V"W"WW | $v58,,Z88 ! ;Ddhhua0011Cdhh{$AAANNOOCdhh|S99::CNNNND"INNNC!#5c5":FF% ! ! ! &GHHH ! !% !I !I#x0088 %$9DK77#'? * (*									$(K
$;E&&.rw||GU/K/K&L&L6:	 356	 2 #	 0 0 0 0$+->
#K & & & (.Lu.T U U U %& 69DK	2IIKKK $DI 6 <I%*#+E333u::%F%F ? ?05cAgS1W?) I I I$M*GHHHHHI  $
I%*#+E333u::%F%F ? ?05cAgS1W?) I I I$M*GHHHHHI //$/////     A Q!*__#$ "'0 " "8# "=E^HO1:'/'<X^'LH&.DG!E	"
  . .A}%-
 "eUDDPU     AdJ  	' 	'E%%E+1<<>> M M''wJ$$T**6{{8t##!&!3!3D'1!E!EEJJ!HHH%HHHLLQ---!&!3!3D$.!!L!LEJJ,,EKK 	L 	LE&25;
&K&K#EKs   1 
B1B,>BB,
B$B,#B$$B,,B11SS1	0S1	AV  .WW4YY&%Y&34Z))[	
[	c           
        	 | j         	t          j        	d                  }| j        d         j        dk    r*|                    dd                              dd          }	                    dd          d	k    r|d
z  }	                    dd          d	k    r|dz  }|ddd         }t          	fd|D                       }	                    dd          }d| j        _        | j        ddd         }|d         j	        }t          |||||d          g}| j        d	         j        rd	| j        _        | j        d	dd         }|d         j	        }d\  }}|t          |          k     rO|t          |          dz
  k     r9|||         z  }|d	z  }|t          |          k     r|t          |          dz
  k     9|d|         |d         j        z   }|d|         dz   }|                    t          |||||d                     |S )z6Return main image series in LSM file. Skip thumbnails.ScanTyper   r   rM   r,  XYXYC
DimensionPr&   P
DimensionMMNr   c              3   b   K   | ])}t          t          j        |                            V  *d S r   )r   rO   CZ_LSMINFO_DIMENSIONS)r   r   lsmis     r    r!   z'TiffFile._lsm_series.<locals>.<genexpr>	  s8      MM1c$t9!<=>>MMMMMMr"   r  LSMrR  r&   r   CYX
LSMreduced)lsm_metadatarO   CZ_LSMINFO_SCANTYPErQ   rw  r  rA   r  r  r=   r   
is_reducedr.   rE   r7   )
r`   r  rE   r  rQ   r=   rT   cpr   r  s
            @r    _lsm_serieszTiffFile._lsm_series	  s    'Z(89:a=$))<<R((00u==D88L!$$q((CKD88L!$$q((CKDDDbDzMMMMMMMMMxx##

33Q3a udUSSST:a=# 	"#DJJqt!t$E!HNEEBs5zz//a#e**q.&8&8eAhQ s5zz//a#e**q.&8&8 "1"Ia.E8e#DMMueUDt<XXX   r"   c                    d| j         _        d| j         _        d| j         _        | j         d         }| j         ddd         D ]	}||_        
d| j         _        | j         d         }| j         ddd         D ]	}||_        
dS )zLoad all pages from LSM file.Tr&   Nr   r   )rQ   cacher  r  )r`   r  rX   s      r    r  zTiffFile._lsm_load_pages	  s    
#

:a=Jqt!t$ 	% 	%D$DMM
:a=JsssO 	% 	%D$DMM	% 	%r"   c                 r   | j         j        dk     rdS | j        }t          |          }| j        d         }|j        }d}dD ]!}|j        |         dv r||j        |         z  }"|dk    rd}dD ]}||         dk    r|j        |         } n|rqt          |d	|z  |z            \  }}	|	dk    sJ |||d	f}
t          j	        t          |
                                        |
          }t          j        |dd          }n(t          j	        |                              d
d	          }|d         j        d         |d         j        d         k    r|dddd
f         }d}d}|j        D ]O}||         }g }|j        D ]'}||k     r|dz  }|                    ||z              |}(t!          |          |_        PdS )zUnwrap strip offsets for LSM files greater than 4 GB.

        Each series and position require separate unwrapping (undocumented).

        r  Nr   r&   r   PMr&   r   r@  r   r   .)r  rH   rQ   r.   rT   r  rE   r0  r<   r  r   rd  moveaxisdataoffsetsflatr7   r  )r`   rQ   r5  rT   r  	positionsr   ntimesdivr6  rE   indiceswrappreviousoffsetrX   r  currentoffsets                    r    r  zTiffFile._lsm_fix_strip_offsets	  s    ?%''F
UQ{ 	 	- 	-A{1~%%V\!_,	 q==F  7c>>#\!_FE "  8!&!i-&*@AASaxxxx"FC3,wu~~66>>uEE.!Q77l6**222q99G 8"U1X%9!%<<<c44R4i(G  	2 	2A8DK!%!1 / / >11EMD""=4#7888!.$[11D	2 	2r"   c           	         | j         }|d         j        dk    rdS t          |d           }t          |          dz
  }t	          |          D ]\  }}|j        dz  r|j        |j        }||k     r||dz            j        d         }n,t          d         d|d         z  z   | j	        j
                  }|fz   t          fdt          t          |                    D                       |_        dS )	zSet databytecounts to size of compressed data.

        The StripByteCounts tag in LSM files contains the number of bytes
        for the uncompressed data.

        r   r&   Nc                     | j         d         S rA  )r  )ps    r    r   z4TiffFile._lsm_fix_strip_bytecounts.<locals>.<lambda>3
  s    AM!,< r"   rB  r   r   c              3   @   K   | ]}|d z            |         z
  V  dS r   r   )r   r7  offsetss     r    r!   z5TiffFile._lsm_fix_strip_bytecounts.<locals>.<genexpr>@
  sE       ( (01A+( ( ( ( ( (r"   )rQ   r  rp  r.   rr  r  r  databytecountsrt  r   rH   r  rq  )r`   rQ   r5  r   rX   
bytecounts
lastoffsetr  s          @r    r  z"TiffFile._lsm_fix_strip_bytecounts(
  s*    
81$$Fu"<"<===Ua '' 	 	GAtzA~ &G,J6zz"1q5\5a8

 !q:b>/A!A48=QQ
-G"' ( ( ( (5:3z??5K5K( ( ( # #D	 	r"   c                     |dd         t           j        v rD| j        sdS t          t	          | j        d         |                    }t          | ||           |S t          d| j        j        d|d          )z,Return 'is_flag' attributes from first page.r   NFr   '' object has no attribute ')	rO   r  rQ   r   rf   ri   rc   rn   rh   )r`   r  rl   s      r    __getattr__zTiffFile.__getattr__D
  s    8t&&: uA5566ED$&&&Ln37>3J3J3JDDDQ
 
 	
r"   c                     | S r   r   r  s    r    r  zTiffFile.__enter__P
  r  r"   c                 .    |                                   d S r   r  r  s       r    r  zTiffFile.__exit__S
  r  r"   r   O   c                    dt          | j        j                  ddd| j                 g}| j        r|                    d           |                    d                    d | j        D                                  t          | j	                  dk    r*|                    d	t          | j	                  z             t          | j
                  dk    r*|                    d
t          | j
                  z             t          | j                  dk    r*|                    dt          | j                  z             d                    |          }|                    dd                              dd          }|t          | j        j        t          ddz   t          |          z
                      z  }dk    r|S |g}|                    d                    d | j
        D                                  dk    r(|                    fd| j	        D                        n'|                    fd| j
        D                        dk    r~t#          | j                  D ]i}t%          | |dz             rTt'          | |dz             }|r?|                    |                                dt+          |dz                       jd                    |                              dd          S )a  Return string containing information about file.

        The detail parameter specifies the level of detail returned:

        0: file only.
        1: all series, first page of series and its tags.
        2: large tag values and file metadata.
        3: all pages.

        zTiffFile '%s'LittleEndian	BigEndianr   BigTiffr   c              3   >   K   | ]}|                                 V  d S r   r]  r   r!  s     r    r!   z#TiffFile.__str__.<locals>.<genexpr>h
  s*      ;;1QWWYY;;;;;;r"   r&   %i Pagesz	%i Seriesz%i Files  z    z   r   r   r   
c              3   4   K   | ]}t          |          V  d S r   r   r  s     r    r!   z#TiffFile.__str__.<locals>.<genexpr>u
  s(      ::c!ff::::::r"   r   c              3   V   K   | ]#}|t                               |          V  $d S )Ndetailwidth)TiffPage__str__)r   r  r  r  s     r    r!   z#TiffFile.__str__.<locals>.<genexpr>x
  sF        } $$QvU$CC$}}} r"   c              3      K   | ]9}|j         d          t                              |j         d                    V  :dS )r   Nr  )rQ   r  r  )r   r   r  r  s     r    r!   z#TiffFile.__str__.<locals>.<genexpr>
  sV        wqz- $$QWQZe$LL---- r"   r   z
_METADATA
r  height

z


)r   r   rH   r9   r   r7   r  flagsr.   rQ   rT   r  r  snipstrr  maxrH  rp  r-   rf   r]  pformat)r`   r  r  infor  ms    ``   r    r  zTiffFile.__str__V
  s    && {33DNC

 ? 	#KK	"""CHH;;
;;;;;<<<tz??QKK
S__4555t{aKKc$+&6&66777t{aKK
c$+&6&67888yy||FD))11%>>gdhmSUQYT5J-K-KLLLQ;;KvDII::dk:::::;;;Q;;KK    !Z      KK    ![     Q;;tz** 
 
4!344 	d[&899A  !%

 'v{ K K K K   {{4  ((6:::r"   c                 h     t           fdt          t          j                  D                       S )zReturn set of file flags.c              3   f   K   | ]+}t          d |z             |                                V  ,dS rz   rf   lowerr   r  r`   s     r    r!   z!TiffFile.flags.<locals>.<genexpr>
  sS       
 
tUT\**
JJLL
 
 
 
 
 
r"   setrp  rO   r  r  s   `r    r   zTiffFile.flags
  sG      
 
 
 
t//
 
 
 
 
 	
r"   c                 n    	 | j         d         j        p| j         d         j        S # t          $ r Y dS w xY w)zFile has MD Gel format.r   r&   F)rQ   is_mdgelr  r  s    r    r  zTiffFile.is_mdgel
  sF    	:a=)CTZ]-CC 	 	 	55	s   #& 
44c                     | j         j        S )zReturn if file is a movie.)rQ   r  r  s    r    is_moviezTiffFile.is_movie
  s     z##r"   c                 P    | j         sdS t          d | j        D                       S )z9Return Tifffile metadata from JSON descriptions as dicts.Nc              3      K   | ]@}|j                                         d k    t          |j        d         j                  V  AdS )shapedr   N)r  r	  r/  rQ   r.  r  s     r    r!   z+TiffFile.shaped_metadata.<locals>.<genexpr>
  sT       
 
w}}(** &agaj&:;;****
 
r"   )r.  r  rT   r  s    r    shaped_metadatazTiffFile.shaped_metadata
  sC     ~ 	F 
 
[
 
 
 
 
 	
r"   c                 ^    | j         sdS t          | j        d         j                  d         S )zReturn OME XML as dict.Nr   r  )r   r   rQ   r~  r  s    r    ome_metadatazTiffFile.ome_metadata
  s/     { 	F
1122599r"   c                     | j         sdS d}| j        d         j                            d|z   dz   |          }t	          |          |         S )z<Return PerkinElmer-QPI-ImageDescription XML element as dict.Nz PerkinElmer-QPI-ImageDescriptionr    )	is_qptiffrQ   r~  r  r   )r`   r  xmls      r    qptiff_metadatazTiffFile.qptiff_metadata
  sP     ~ 	F1jm'//d
S0@$GG}}T""r"   c                 N    | j         sdS | j        d         j        d         j        S )z0Return LSM metadata from CZ_LSMINFO tag as dict.Nr   
CZ_LSMINFO)r  rQ   r  rl   r  s    r    r  zTiffFile.lsm_metadata
  s*     { 	Fz!}!,/55r"   c                 4   | j         sdS | j        d         }|j        }i }|d         j        |d<   |j        r|j                            d          |d<   d|v r |                    |d         j                   d|v r |                    |d         j                   d	|v r |                    |d	         j                   |d         j        }|d
         |d
<   |d         |d<   |d         |d<   	 t          j	        d t          |d         |d                   D             d          |d<   t          j	        d t          |d         |d                   D             d          |d<   n.# t          $ r!}t          j        d|z             Y d}~nd}~ww xY w|S )z*Return STK metadata from UIC tags as dict.Nr   UIC2tagNumberPlanes PlaneDescriptionsUIC1tagUIC3tagUIC4tag	ZDistanceTimeCreatedTimeModifiedc                      g | ]}t          | S r   julian_datetimer   dts     r    rK  z)TiffFile.stk_metadata.<locals>.<listcomp>
  -        $R(  r"   DateCreatedzdatetime64[ns]r   DatetimeCreatedc                      g | ]}t          | S r   r*  r,  s     r    rK  z)TiffFile.stk_metadata.<locals>.<listcomp>
  r.  r"   DateModifiedDatetimeModifiedzstk_metadata: %s)is_stkrQ   r  r  r~  r  rN   rl   r<   r
  zipr,   r   r   )r`   rX   r  rZ   uic2tagrm   s         r    stk_metadatazTiffFile.stk_metadata
  s    { 	Fz!}y!%i!6~ 	G*.*:*@*@*F*FF&' MM$y//000MM$y//000MM$y//000y/'%k2{ ' 6}!(!8~	2(- !'-"8'-:PQQ   ') ) )F$% */ !'."97>;RSS   '* * *F%&&  	2 	2 	2M,q011111111	2s   /A:E* *
F4FFc                     | j         sdS | j        d         }t          |j                   }d|j        v r7	 |                    |j        d         j                   n# t          $ r Y nw xY w|S )z,Return consolidated ImageJ metadata as dict.Nr   
IJMetadata)	is_imagejrQ   imagej_description_metadatar  rN   rl   r@   )r`   rX   rZ   s      r    rG  zTiffFile.imagej_metadata
  s     ~ 	Fz!},T^<<49$$di5;<<<<   s   %A 
A('A(c                     | j         sdS i }| j        d         }|                    |j        d         j                   |j        d         j        |d<   |S )z.Return consolidated FluoView metadata as dict.Nr   	MM_HeaderMM_StampStamp)is_fluoviewrQ   rN   r  rl   )r`   rZ   rX   s      r    rS  zTiffFile.fluoview_metadata  sZ      	Fz!}di,2333)J/5w r"   c                 N    | j         sdS | j        d         j        d         j        S )z:Return NIH Image metadata from NIHImageHeader tag as dict.Nr   NIHImageHeader)r  rQ   r  rl   r  s    r    nih_metadatazTiffFile.nih_metadata  s+     { 	Fz!}!"2399r"   c                     | j         sdS | j        d         j        }d|v r|d         j        S d|v r|d         j        S dS )z5Return FEI metadata from SFEG or HELIOS tags as dict.Nr   FEI_SFEG
FEI_HELIOS)is_feirQ   r  rl   )r`   r  s     r    fei_metadatazTiffFile.fei_metadata   s[     { 	Fz!}!
#))4%++  r"   c                 N    | j         sdS | j        d         j        d         j        S )z,Return SEM metadata from CZ_SEM tag as dict.Nr   CZ_SEM)is_semrQ   r  rl   r  s    r    sem_metadatazTiffFile.sem_metadata+  s*     { 	Fz!}!(+11r"   c                     | j         dd         D ]}d|j        v r	|j        } ndS i }t          dd          D ]1}t          j        |         }||vr||         j        ||dd         <   2|S )z6Return consolidated metadata from MD GEL tags as dict.Nr   	MDFileTag饂  i  )rQ   r  rq  rO   TAGSrl   )r`   rX   r  rZ   r  r  s         r    re  zTiffFile.mdgel_metadata2  s     JrrN 	 	Ddi''y ( F%'' 	0 	0D9T?D4#Dz/F48r"   c                 &    | j         d         j        S )zReturn Andor tags as dict.r   )rQ   
andor_tagsr  s    r    andor_metadatazTiffFile.andor_metadataC       z!}''r"   c                 &    | j         d         j        S )z'Return EPICS areaDetector tags as dict.r   )rQ   
epics_tagsr  s    r    epics_metadatazTiffFile.epics_metadataH  rT  r"   c                 N    | j         sdS | j        d         j        d         j        S )zReturn TVIPS tag as dict.Nr   TVIPS)is_tvipsrQ   r  rl   r  s    r    tvips_metadatazTiffFile.tvips_metadataM  s*     } 	Fz!}!'*00r"   c                 R    | j         sdS t          | j        d         j                  S )z:Return MetaSeries metadata from image description as dict.Nr   )is_metaseriesmetaseries_description_metadatarQ   r~  r  s    r    metaseries_metadatazTiffFile.metaseries_metadataT  s+     ! 	F.tz!}/HIIIr"   c                 R    | j         sdS t          | j        d         j                  S )z7Return Pilatus metadata from image description as dict.Nr   )
is_pilatuspilatus_description_metadatarQ   r~  r  s    r    pilatus_metadatazTiffFile.pilatus_metadata[  s*      	F+DJqM,EFFFr"   c                     | j         sdS t          | j                  }|                    | j        d         j        d         j                   |S )z2Return consolidated MicroManager metadata as dict.Nr   MicroManagerMetadata)is_micromanagerread_micromanager_metadatar   rN   rQ   r  rl   )r`   rZ   s     r    micromanager_metadatazTiffFile.micromanager_metadatab  sL     # 	F+DH55djm()?@FGGGr"   c                 F   | j         sdS i }	 t          | j                  \  }}||d<   |                    |           n# t          $ r Y nw xY w	 t          | j        d         j                  |d<   n.# t          $ r!}t          j
        d|z             Y d}~nd}~ww xY w|S )z<Return ScanImage non-varying frame and ROI metadata as dict.N	FrameDatar   Descriptionz)scanimage_description_metadata failed: %s)is_scanimageread_scanimage_metadatar   rN   r,   scanimage_description_metadatarQ   r~  r@   r   r   )r`   rZ   	framedataroidatarm   s        r    scanimage_metadatazTiffFile.scanimage_metadatam  s       	F	!8!B!BIw"+F;MM'"""" 	 	 	D		K$B
1)% %F=!!  	K 	K 	KMEIJJJJJJJJ	Ks'   1? 
AA"A3 3
B=BBc                 8    | j         sdS | j        d         j        S )z0Return GeoTIFF metadata from first page as dict.Nr   )
is_geotiffrQ   geotiff_tagsr  s    r    geotiff_metadatazTiffFile.geotiff_metadata  s"      	Fz!}))r"   )NNNTN)NNNTr&   r   r  )2rh   rp   rq   rr   ra   propertyr  rW   r   r  r  r/   rT   r  r8  rJ  rW  rg  rk  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r7  rG  rS  rC  rH  rL  re  rS  rW  r[  r_  rc  rh  rq  ru  r   r"   r    r	   r	     s/       " "N i i i iV   X   X   X  d d d dL   X:) ) )VZ Z ZxP
 P
 P
d
 
 
,
 
 
<S S Sr r rh     D% % %32 32 32j  8

 

 

    <; <; <; <;| 
 
 X
   X $ $ X$ 
 
 X
 : : X: # # X# 6 6 X6 ' ' X'R   X   X& : : X: , , X, 2 2 X2   X  ( ( X( ( ( X( 1 1 X1 J J XJ G G XG   X   X( * * X* * *r"   r	   c                       e Zd ZdZd Zed             Zej        d             Zed             Zej        d             Zed             Z	e	j        d             Z	ed	             Z
d
 ZddZddZd Zd Zd Zd ZdS )r  z(Sequence of TIFF image file directories.c                    || _         g | _        d| _        t          | _        d| _        d| _        |j        }|                                | _	        t          j        |j        |                    |j                            d         }|dk    r	d| _        dS ||j        k    r t!          j        d|z             d| _        dS |                    |           t          |d          }| j                            |           || _        dS )zInitialize instance from file. Read first TiffPage from file.

        The file position must be at an offset to an offset to a TiffPage.

        FNTr   invalid page offset (%i)r  )r  rQ   completer  	_tiffpage	_keyframe_cacher  r   _nextpageoffsetr   r  r  r  r  rH   r   r   r%   r7   )r`   r  r   rU   rX   s        r    ra   zTiffPages.__init__  s     
! !wwyyv2BGGF<M4N4NOOPQRQ;; DMFRWM4v=>>> DMF 	a(((
$r"   c                     | j         S )z2Return if pages/frames are currently being cached.)r  r  s    r    r  zTiffPages.cache  s     {r"   c                 l    t          |          }| j        r|s|                                  || _        dS )z@Enable or disable caching of pages/frames. Clear cache if False.N)r   r  r!  r`   rl   s     r    r  zTiffPages.cache  s8     U; 	u 	JJLLLr"   c                 >    | j         t          k    ot          t          uS )z?Return if currently using TiffFrame (True) or TiffPage (False).)r}  	TiffFramer  r  s    r    r  zTiffPages.useframes  s     ~*Hy/HHr"   c                 0    |rt           nt          | _        dS )z0Set to use TiffFrame (True) or TiffPage (False).N)r  r  r}  r  s     r    r  zTiffPages.useframes  s     ',9r"   c                     | j         j        S )z!Return index of current keyframe.)r~  r  r  s    r    r  zTiffPages.keyframe  s     ~##r"   c                 h   | j         j        |k    rdS | j        s"d|cxk    rt          | j                  k     rRn nO| j        |         }t          |t                    r	|| _         dS t          |t                    r|j        | j        |<   | j	        }t          | _
        | |         | _         || _	        dS )z;Set current keyframe. Load TiffPage from file if necessary.Nr   )r~  r  r|  r.   rQ   r(   r  r  rU   r  r}  )r`   r  rX   r  s       r    r  zTiffPages.keyframe  s     >5((F= 	0A8888TZ88888:e$D$)) 0!%D),, 0$(K
5!N	!e"r"   c                 H    | j         s|                     d           | j        S )z7Return offset where offset to a new page can be stored.r   )r|  _seekr  r  s    r    r   zTiffPages.next_page_offset  s&     } 	JJrNNN##r"   c                 4   | j         j        }| j        }| j        }| j        s|                     d           t          |          D ]Q\  }}t          |t                    r7|	                    |           | 
                    | j         ||          }|||<   RdS )z#Read all remaining pages from file.r   r  r  N)r  r  r~  rQ   r|  r  rr  r(   r  r%   r}  )r`   r   r  rQ   r   rX   s         r    r"  zTiffPages.load  s    [#>
} 	JJrNNN '' 	  	 GAt$))  ~~dkX~NNa		  	 r"   Tc                 t   | j         }| j        rt          |          dk     rdS |d         | _        |rAt	          |dd                   D ]'\  }}t          |t                    s|j        ||dz   <   (dS t          t          ur4t	          |          D ]&\  }}t          |t                    r
|j        ||<   %dS dS )zADelete all but first page from cache. Set keyframe to first page.r&   Nr   )
rQ   r  r.   r~  rr  r(   r  rU   r  r  )r`   fullyrQ   r   rX   s        r    r!  zTiffPages.clear  s    
{ 	c%jj1nnFq 		+$U122Y// / /4!$11 /#';E!a%L/ / h&&$U++ + +4dI.. +#{E!H	 '&+ +r"     @ c                 |   | j         }|sdS | j        j        }|j        rt	          d          | j        sd|cxk    rt          |          k     r@n n=||         }t          |t                    r|n|j	        }|
                    |           dS | j        j        }| j        j        }| j        j        }	| j        j        }
| j        j        }t           j        }|d         }t          |t                    r|n|j	        }t          |          |k     rP|
                    |           	  ||	|                    |
                    d         }|dk    rt'          d          n1# t(          $ r$ t+          j        d|z             |d= d| _        Y nw xY w||
z   ||z  z   | _        |
                    | j                    |||                    |                    d         }|dk    rd| _        nq||j        k    rt+          j        d	|z             d| _        nG|                    |           d|cxk    rt          |          k     rn nnt          |          |k     P|t          |          k    rt5          d
          ||         }|
                    t          |t                    r|n|j	                   dS )z&Seek file to offset of specified page.NzFileHandle is closedr   r      suspicious number of tagscorrupted tag list at offset %iTrz  list index out of range)rQ   r  r  closedrd   r|  r.   r(   r  rU   r%   r  r  r  r  r  r   r  r  r,   r@   r   r   r  rH   r7   r  )r`   r  maxpagesrQ   r   rX   rU   r  r  r  r  r  r  tagnos                 r    r  zTiffPages._seek  s   
 	F[#9 	75666= 	A3333U33333<D'h77HTTT[FGGFOOOF{/[+
k-K)	+%Ry#D(33D%jj8##GGFOOO{BGGI,>,>??B4<<$%@AAA     ?&HIII"I $	
 $*I#5#GD GGD())) VL"''**=*=>>qAF{{ $  86ABBB $LL   E&&&&CJJ&&&&&9 %jj8##< CJJ6777U|

422CDDDDDs   ':E" "+FFc                 2    t          | j                  dk    S )z'Return True if file contains any pages.r   )r.   rQ   r  s    r    __bool__zTiffPages.__bool__@  s    4:""r"   c                 b    | j         s|                     d           t          | j                  S )zReturn number of pages in file.r   )r|  r  r.   rQ   r  s    r    __len__zTiffPages.__len__D  s)    } 	JJrNNN4:r"   c                      j         }|st          d          |dk    r||         S t          |t                    r|                    d          \  }}} j        s6t          ||          t          |          k    r                     d            fdt          |                    t          |                     D             S  j        r"|t          |          k    rt          d          	 ||         }n# t          $ r d}Y nw xY wt          |t                    s|S                      |                                 j        | j                  } j        r|||<   |S )z,Return specified page(s) from cache or file.r  r   rD  r   c                      g | ]
}|         S r   r   )r   r   r`   s     r    rK  z)TiffPages.__getitem__.<locals>.<listcomp>V  s    EEEDGEEEr"   r  )rQ   r  r(   r  r  r|  r  r.   r  rq  r  r}  r  r~  r  )r`   rC  rQ   r  r  r[   rX   s   `      r    __getitem__zTiffPages.__getitem__J  sx   
 	86777!88:c5!! 	F [[33NE4= Su%5%5E

%B%B

2EEEEUCKKE

,C,C%DEEEE= 	8SCJJ..6777	:DD 	 	 	DDD	$)) 	K

3~~dkt~~NN; 	E#Js   2C; ;D
	D
c              #   R   K   d}	 	 | |         V  |dz  }n# t           $ r Y dS w xY w#)zReturn iterator over all pages.r   Tr&   N)r  )r`   r   s     r    __iter__zTiffPages.__iter__h  sT      	1gQ   		s    
%%NT)r  )rh   rp   rq   rr   ra   rw  r  setterr  r  r   r"  r!  r  r  r  r  r  r   r"   r    r  r    sj       22  B   X \  \ I I XI : : : $ $ X$ _# # _#$ $ $ X$     + + + +"<E <E <E <E|# # #    <    r"   r  c                      e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZd7dZ	 	 	 	 	 	 d8d
Z	 	 	 	 	 d9dZd Zed             Zej        d             Zed             Z ed             Z!ed             Z"ed             Z#d:dZ$ed             Z%ed             Z&ed             Z'ed             Z(ed             Z)ed             Z*ed             Z+ed             Z,ed             Z-ed             Z.ed              Z/ed!             Z0ed"             Z1ed#             Z2ed$             Z3ed%             Z4ed&             Z5ed'             Z6ed(             Z7ed)             Z8ed*             Z9ed+             Z:ed,             Z;ed-             Z<ed.             Z=ed/             Z>ed0             Z?ed1             Z@ed2             ZAed3             ZBed4             ZCed5             ZDed6             ZEdS );r  a  TIFF image file directory (IFD).

    Attributes
    ----------
    index : int
        Index of page in file.
    dtype : numpy.dtype or None
        Data type (native byte order) of the image in IFD.
    shape : tuple
        Dimensions of the image in IFD.
    axes : str
        Axes label codes:
        'X' width, 'Y' height, 'S' sample, 'I' image series|page|plane,
        'Z' depth, 'C' color|em-wavelength|channel, 'E' ex-wavelength|lambda,
        'T' time, 'R' region|tile, 'A' angle, 'P' phase, 'H' lifetime,
        'L' exposure, 'V' event, 'Q' unknown, '_' missing
    tags : dict
        Dictionary of tags in IFD. {tag.name: TiffTag}
    colormap : numpy.ndarray
        Color look up table, if exists.

    All attributes are read-only.

    Notes
    -----
    The internal, normalized '_shape' attribute is 6 dimensional:

    0 : number planes/images  (stk, ij).
    1 : planar samplesperpixel.
    2 : imagedepth Z  (sgi).
    3 : imagelength Y.
    4 : imagewidth X.
    5 : contig samplesperpixel.

    r   r&       Nr,  c           	      Z   || _         || _        d| _        d| _        d| _        d| _        d| _        i | _        d| _        d| _	        |j
        }|                                | _        	 t          j        |j        |                    |j                            d         }|dk    rt%          d          n%# t&          $ r t%          d| j        z            w xY w|j        }|                    ||z            }| j        }| }t+          |          D ]}	||z  }	 t-          | j         ||||z                      }
n=# t,          j        $ r+}t1          j        t5          |                     Y d}~^d}~ww xY w|
j        }||vr|}|
||<   nd}	 d
||fz  }||vr|
||<   nt8          j                            |d          }|r=|dd         dv rt?          |
j         t4                    stC          | ||
j                    |sdS | j"        r| j#         n| j$        r| j%         | j&        s| j        r,| j         j&        r | j        d         '                    |            | j(        s| j        r| j         j(        rd| _)        | j*        rqd|v rm|d         j         s`|d         }|+                    |j,                   t[          || j         j.        |j        |j/        d|d         j/                  |d         _         d|v rv	 ta          |d         j         |d         j         | j         j.                  |d         _         n8# t&          $ r+}t1          j        t5          |                     Y d}~nd}~ww xY wd|v rd|d         }
|
j/        dk    r|
j         | _1        nD|
j         d| j2                 tg          fdD                       r| _1        nd         | _1        d|v rd|d         }
|
j/        dk    r|
j         | _4        nD|
j         d| j2                 tg          fdD                       r| _4        nd         | _4        d|v r!d|vs|d         j/        dk    r| j5        | _6        | j4        | j1        f}t8          j7                            |d          }|tq          j        |          }|x| _        | _        | j5        }| j9        }| j)        }| j2        }| j*        r<| j)        dk    sJ |d         j         }|d         j/        }| j:        dk    r8|dd|||f| _        |dk    r|||f| _        d| _        nJ||||f| _        d| _        n7||d||df| _        |dk    r|||f| _        d| _        n||||f| _        d| _        |dk    r| j        dd         | _        n@tq          j;        |d         dk              rd| j        z   | _        ntq          j;        tq          j<        |d                   dk              rd| j        z   | _        nd| j        z   | _        n| j=        dk    s|dk    r{| j:        dk    r8dd||||f| _        |dk    r|||f| _        d| _        n||||f| _        d | _        nmd||||df| _        |dk    r|||f| _        d| _        nH||||f| _        d!| _        n5dd|||df| _        |dk    r||f| _        d| _        n|||f| _        d"| _        d#|v r|d#         j         | _        nd$|v r|d$         j         | _        nd%| _        d&|v r|d&         j         | _	        n[d'|v r|d'         j         | _	        nDt}          | j                  | j1        d(z  z  f| _	        | j?        dk    rt1          j        d)           t          | j                  t          | j                  k    sJ dS )*zlInitialize instance from file.

        The file handle position must be at offset to a valid IFD.

        r   Nr,  r   r  r  r  r&   Tz%s%ir   zsof desr7  r#  r  r9  IJMetadataByteCountsc              3   .   K   | ]}|d          z
  V  dS r   r   r   vrl   s     r    r!   z$TiffPage.__init__.<locals>.<genexpr>  +      44E!H444444r"   r2  c              3   .   K   | ]}|d          z
  V  dS r   r   r  s     r    r!   z$TiffPage.__init__.<locals>.<genexpr>$  r  r"   r*  r?  YXYXSSYXr&  rB  r'  r@  r   r   ZYXSSZYXZYXTileOffsetsStripOffsetsr9  TileByteCountsStripByteCountsr   z"required ByteCounts tag is missing)Ar  r  rE   r   r=   r1  r  r  r  r  r  r   rU   r   r  r  r  r  r,   r@   r  rq  TiffTagErrorr   r   r   r  rO   TAG_ATTRIBUTESrA   r(   rl   ri   is_andorrR  is_epicsrV  r  _fix_lsm_bitspersampleis_vista
imagedepthr4  r%   valueoffsetread_uic1tagr9   r  rG  r<  r  r*   r  imagelengthr{  SAMPLE_DTYPESr<   
imagewidthrx  r  r   rw  r   r  r.   )r`   r  r  r  r   r  r  rD   r  r[   rJ  rm   tagnamer  r   uic1tagr=   r  r  r  r  uictagplanesrl   s                          @r    ra   zTiffPage.__init__  s	    


		  ggii	NM&"4bggf>N6O6OPPQRSEt|| !<===  	N 	N 	N>LMMM	N .www''yu 	3 	3AWEdk40G+HII=   c!ff%%% hGd"" T

 !WaL0D4''%(T
	
 &**444D 38y((CIs1K1K(D$	222 	F = 	OOO] 	OO; 	D4: 	D$+*< 	DIo&==dCCC= 	 TZ 	 DK,@ 	 DO; 	9,,T)_5J,9oGGGG'((($0%Y%% %DO! 4&+:&,/06K), ,\"((
  & & &c!ff%%%%%%%%& d""'CyA~~%(Y"" 	"8D$8"894444e44455 2).D&&).qD&T!!~&CyA~~$'I!!	"8D$8"894444e44455 1(-D%%(-aD%D  T))T.-A-G!-K-K$($4! !4#55"&&ud33K&&E#((
T[ &_
_
.; C	"?a'''')_*F)_*F A%%%q![*oV"a''"(+z!BDJ $DII"(+z?!SDJ %DII%;
TUV"a''"(+z!BDJ $DII"(/;
!SDJ %DI{{!Z^

6+.!344 ,$)O		5:f]&;<<ABB ,$)O		$)O		""o&9&9 A%%# ??"-z?!KDJ %DII",k:!WDJ &DII # ??"1;
!KDJ %DII"1:{J!WDJ &DIIa[*aHDKQ):6
 		(+zB
!	 D  #M28Dt###N39D#Dt##"&'7"8">D$&&"&'8"9"?D#*4:#6#6$:LPQ:Q#R"TD1$$BCCC4:#di..000000s=   )AB7 7"C D==E7!E22E7;<L8 8
M-!M((M-T        @c           
         *+,  } j           j        rt           j                  dk    rdS  j        }|s||r<t           j                  |k    r$t	          dt           j                  z             j        t	          d j         j        fz             j	        t          j        vrt	          d j	        j        z            d|v rJ|d         ,,j        dk    r7t          ,fd,j        D                       rt	          d	,j        z             j        r% j	        d
k    s j        dk    rt%          d          |dS |j        j        }	||	j        n|}|5  |	j        }
|
r&|r|	                                 nt1          d          ddd           n# 1 swxY w Y    j        + j        } j        } j        } j        } j        * j        j        +j        z   } j        dk    }|j         \  }} j!        }|rh j"        } j#        } j$        }||z   dz
  |z  }||z   dz
  |z  }||z   dz
  |z  }|d         |d         ||z  ||z  ||z  |d         f}||||d         f}|}n|} j        dk    r
| j%        z  }|dk    rA j&        r:|5  |	'                    |||d                   }ddd           n# 1 swxY w Y   n j(        r|tS          ||+          }|5  |	*                    |d                    |	+                    |t          |          |          }ddd           n# 1 swxY w Y   |M|j        j,        sA|-                    d           |.                    |j        /                                          }|rta          |           n@tS          ||+          }t          j         j	                 } j	        d
k    r^*dvrt	          d*z            d|v r|d         j        }nd}tb          }t          2                     j3                  j        } ||*| fd}nH*dv r!*|z  dz  rt	          d          |f*+ fd	}n#ti          *tj                    r|*fd}n|*|fd}|rd}!d\  }}}}"tm          |	|||          D ]~}#|rta          |#          }# ||#          }# ||#          }#	 ||#_7        n# t          $ r} tq          j9        d           tu          j;        |+          <                    d          }$t{          |#j>        |$j>                  }%|#d|%         |$d|%<   |$<                    |          }#Y nw xY w j?        dk    rB|!|#j@        d          }!|!rtu          jA        |#d!+|#"           n1tu          jA        |#d!+#          }#n j?        d$k    rt%                      |#|d|"|||z   |||z   |||z   ddf<   ~#||z  }||d%         k    r-d||z   }}||d$         k    rd||z   }}||d         k    rd|"dz   }"}|d&d|d|d|ddf         }n jB         j        z  }& j        dk    r
|& j%        z  }&|<                    d          }d}'tm          |	|||          D ]e}(|rta          |(          }( ||(          }( ||(          }(t{          |j>        |(j>        |&|j>        |'z
            })|(d|)         ||'|'|)z   <   ~(|'|)z  }'f j        |_7         j?        dk    r_|r j(        rV j        jC        r j	        dk    rn> j?        dk    rtu          jA        |d!+|"           n j?        d$k    rt          |          }|r\	  j7        |_7        nN# t          $ rA tq          j9        d't          |j7                  d(t           j7                             Y nw xY w|
r|	E                                 |S ))a5  Read image data from file and return as numpy array.

        Raise ValueError if format is unsupported.

        Parameters
        ----------
        out : numpy.ndarray, str, or file-like object; optional
            Buffer where image data will be saved.
            If None (default), a new array will be created.
            If numpy.ndarray, a writable array of compatible dtype and shape.
            If 'memmap', directly memory-map the image data in the TIFF file
            if possible; else create a memory-mapped array in a temporary file.
            If str or open file, the file name or file object used to
            create a memory-map to an array stored in a binary file on disk.
        squeeze : bool
            If True, all length-1 dimensions (except X and Y) are
            squeezed out from the array.
            If False, the shape of the returned array might be different from
            the page.shape.
        lock : {RLock, NullContext}
            A reentrant lock used to synchronize reads from file.
            If None (default), the lock of the parent's filehandle is used.
        reopen : bool
            If True (default) and the parent file handle is closed, the file
            is temporarily re-opened and closed if no exception occurs.
        maxsize: int or None
            Maximum size of data before a ValueError is raised.
            Can be used to catch DOS. Default: 16 TB.
        validate : bool
            If True (default), validate various parameters.
            If None, only validate parameters and return None.

        r   Nzdata are too large %szdata type not supported: %s%izcannot decompress %sr2  r&   c              3   8   K   | ]}|j         d          z
  V  dS r   rl   )r   r   rJ  s     r    r!   z#TiffPage.asarray.<locals>.<genexpr>  s.      *O*O1sy|+;*O*O*O*O*O*Or"   zsample formats do not match %s   r   z chroma subsampling not supportedzfile handle is closedr   r   rU   r  T)r   r   zunsupported JPEG precision %i
JPEGTablesr"   c                 D     || |||                               d          S Nr   )rd  )r   r^   tabler<  
colorspaces        r    
decompressz$TiffPage.asarray.<locals>.decompress&  s(      45-DDLLRPPPr"   )r   r       @   rZ  r   zdata and sample size mismatchc                     j         dk    rj        }	 t          j        | |          S # t          $ r; t          |           dz  z  dz  z  }t          j        | d |         |          cY S w xY w)Nr   r   )r|  rV   r<   
frombufferr,   r.   )r   r  xlenr<  r=   r`   s      r    r  z TiffPage.asarray.<locals>.unpack3  s    ~** $):D$/8<<<% D D D !$A=A+= >=TUCUV$/%4%(CCCCC	Ds   * AA/.A/c                 $    t          | ||          S r   )
unpack_rgb)r   r  r<  s      r    r  z TiffPage.asarray.<locals>.unpackC  s    %a=AAAr"   c                 &    t          | |||          S r   )unpack_ints)r   r  r<  runlens       r    r  z TiffPage.asarray.<locals>.unpackH  s     'q(M6JJJr"   )r   r   r   r   zinvalid tile data	WRITEABLEr   r   r=   r  )r   r=   r   r   .zfailed to reshape from r	  )Fr  r   r   r  r,   r   r=   r  r<  r  rO   r#  r  r  r*   rl   is_chroma_subsampledrx  NotImplementedErrorr  r  lockr  openr   r1  r  r  r  r9   rV   	fillorderoffsets_bytecountsis_tiled	tilewidth
tilelength	tiledepthr  rR   r  rS   r   r%   r  rN  byteswapviewrM  reverse_bitorderidentityfuncrT  rw  r(   r  buffered_readrE   r   r   r<   zerosrd  rt  rH   r|  r   cumsumr{  r  decode_floatsr  )-r`   r  r  r  reopenmaxsizer  self_r  r   r  rE   r  r  r  r  lsb2msbr  r  istiledr  r  r  twtltd	tileshaper  rZ   r  r  r  r  writableplry  rG  r   
strip_sizer  r  rH   r<  r=   rJ  s-   `                                         @@@r    r/   zTiffPage.asarray  s
   T }{ 	gdk22a77Fy 	x' M74;//'99 !83t{;K;K!KLLLz! 3($*<=>   t'888 !7$:J:O!OPPP%%>*9>>c*O*O*O*OSY*O*O*O&P&P>$%E	%QRRR( N A%%):a)?)?)*LMMM\$,rwwD 	; 	;YF ; ;GGIIII!"9:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; _
&_
*;(5:5.A%#6- 	 IJIy(1,:B
*Q.:=By(1,:BaaYZYb	E #J	59EIFFF!!d**F(??t2? M M5LLM M M M M M M M M M M M M M M {	"#C66 J J
###xSIIJ J J J J J J J J J J J J J J {6<#8{%%%V\%>%>%@%@AA ) ((("3u55F*4+;<J1$$ //$%D}%TUUU4'' .4EEE%!--d.>??D
 $"/)Q Q Q Q Q "666!F*a/ F$%DEEE'/ D D D D D D D D D M511 
K'/} B B B B B !)fK K K K
  9"!+BB)"dGZHH &3 &3D 6/55%:d++D!6$<<D4%.

% 4 4 4 &9:::!K	599AA"EE	1622 $RaR"1" yy334 ~**#+'+z+'>H# L!LBeNNNNN#(<2U#K#K#KDD1,,1333  R)^+R*_,R)^+ )OBU1X~~!"BOBq>>%&YB!U1X~~)*BFB[j[,;,QQQ NO!.@
$))$"66J++*2tWjII " "E 8 0 7 7&Ju--E"F5MMEv{EJ
FKRWDWXXD38$<F554</0TMEE{>Q8J{! /d&6!&;&;1$$V"EvFFFFF1$$&v.. 	#z   6<((((#dj///;      	HHJJJs]   $0F  F$'F$K  KK)AL66L:=L:SBUU]) )A^43^4Fc                     | j         |i |}| j        } | j        }	t          j        }
|	|
j        k    r| j        }|j        d         d| j        z  k     s| j	        j
        dvrt          d          |r2|                                dk    r|dz  }|                    d          }d| j        v r| j        dk    r|d	         n|d
         }t!          ||          }n|	|
j        k    rd| j        v rz|t          j        }| j        }| j        d         j        dk    r|f}t-          |          D ];\  }}||v r2| j        dk    r|dd
ddd|z   gf         }n|ddd
ddd|z   gf         } n<n| j        dk    r|dddf         }nh|ddddf         }nY|	|
j        k    rt1                      |	|
j        k    rt1                      |	|
j        k    rt1                      t1                      |S )zAReturn image data as RGB(A).

        Work in progress.

        r&   r   r   zcannot apply colormap   r   uint8S.r   r   r8  N.r   )r/   r  rw  rO   rT  rX  r}  rE   r<  r=   rV   r,   r  r_  r  rx  apply_colormaprV  r  EXTRASAMPLEr  r  rr  rU  r  rc  	SEPARATED)r`   r   alphar}  dmindmaxargsr0   rD   rw  rT  r  r   exss                 r    asrgbzTiffPage.asrgb  sP    t|T,V,,}&&+---}H~a 1d&8#888DJOSW<W<W !8999 4<<>>C''NH#??733di'+'8A'='=tF||47!$11DDKO++**= ,E#09^,2a77$0?L'55  FAse||,11#'aAq1u-=(=#>DD#'Aq!QU+;(;#<D $ $))RaR=DD2A2;DD K222%'''K222%'''K111%'''%'''r"   c                     | S r   r   r  s    r    aspagezTiffPage.aspage  r  r"   c                     | S r   r   r  s    r    r  zTiffPage.keyframe  s    r"   c                     d S r   r   )r`   r  s     r    r  zTiffPage.keyframe  s    r"   c                 d    | j         r| j         \  }}|g|gfS t          | j        | j                  S ))Return simplified offsets and bytecounts.)rS   clean_offsets_countsr  r  )r`   rU   
byte_counts      r    r  zTiffPage.offsets_bytecounts  sA      	*!%!3FJ8j\))#D$4d6IJJJr"   c                 (   | j         dk    s	| j        dvrdS d| j        v rh| j        | j        k    s#| j        | j        z  s| j        dz  s
| j        dz  rdS d| j        v r*d| j        v r!| j        | j        k    s| j        | j        z  rdS | j	        | j
        t                    dk    rd         d         fS | j        s9t          fd	t          t                    dz
            D                       rd         t                    fS dS )
zlReturn offset and size of contiguous data, else None.

        Excludes prediction and fill_order.

        r&   r   r   r  r  Nr+  r   r-  r.  r   c              3   r   K   | ]1}|         |         z   |d z            k    p|d z            dk    V  2dS )r&   r   Nr   )r   r   r  r  s     r    r!   z)TiffPage.is_contiguous.<locals>.<genexpr>  sg       
 
  
Z]*ga!en<V
1q5@QUV@V
 
 
 
 
 
r"   )r  r<  r  r  r  r  r  r  r  r  r  r.   r4  r  rq  rv  )r`   r  r  s    @@r    rS   zTiffPage.is_contiguous  sm    q  D$6o$M$MF$)##4>11#do5 2>B& 2 ?R' 2
 	))49,,$777 8 "(
w<<11:z!},,; 	/# 
 
 
 
 
 3w<<!+,,	
 
 
 
 
 	/ 1:s:..	/ 	/r"   c                 L    | j         o| j        dk    o| j        dk    o| j         S )z`Return if page's image data are stored in final form.

        Excludes byte-swapping.

        r&   )rS   r  r|  r  r  s    r    r2  zTiffPage.is_final  s=      .!#.!#. --		
r"   c                 n    | j         j        j        o$| j        o| j        d         | j        j        z  dk    S )9Return if page's image data in file can be memory-mapped.r   )r  r  is_filer2  rS   r=   r>   r  s    r    rR   zTiffPage.is_memmappable'  s?     K"* == q!DJ$771<	
r"   r  c                    | j         | k    rt                              | |          S d}dD ]-}t          | d|z             }|r|                                } n.d                    d d                    d | j        D                       t                              | j	                  j
        | j        d                    d	 t                              | j                  j
        | j        rd
nd| j        dk    r| j        j
        nd| j        dk    r| j        j
        nd| j        dk    r| j        j
        nd| j        dk    r| j        j
        ndfD                       |d                    d | j        D                       fD                       }d| j        | j        |fz  }|dk    r|S |g}| j        }g }g }t/          |                                d           D ]}	|	                    |dz             }
|                    |
d|                                                    |dk    rt7          |
          |k    r{|	j
                                        }|dk    r#d|v sd|v rt9          |	j        ||dz            }
nt9          |	j        ||dz            }
|                    |	j
        d|
           |                    d                    |                     |dk    r(|                    d                    |                     |dk    rO	 |                    dt9          |                                 ||dz            z             n# t>          $ r Y nw xY wd                    |          S )z0Return string containing information about page.r,  )memmappablefinalrz  r{   r  c              3      K   | ]}||V  	d S r   r   r  s     r    r!   z#TiffPage.__str__.<locals>.<genexpr><  s>       
 
& +

 
 
 
 
 
r"   r   c              3   4   K   | ]}t          |          V  d S r   r  r   s     r    r!   z#TiffPage.__str__.<locals>.<genexpr>?  (      44AQ444444r"   r   c              3      K   | ]}||V  	d S r   r   r   s     r    r!   z#TiffPage.__str__.<locals>.<genexpr>B  s>              r"   TILEDr&   c              3   >   K   | ]}|                                 V  d S r   r  r  s     r    r!   z#TiffPage.__str__.<locals>.<genexpr>O  s*      88!''))888888r"   zTiffPage %i @%i  %sr   c                     | j         S r   )r  r   s    r    r   z"TiffPage.__str__.<locals>.<lambda>Z  s    qv r"   rB  )r  Nr   COUNTSOFFSETSr   r  r   r  r  r   zDATA
%sr   ) r  r  r  rf   r]  r  rE   rO   SAMPLEFORMATr  r  r<  rT  rw  r  r  rx  r|  r  r   r  rU   r  rp  r   r7   r  r.   r  rl   r/   r@   )r`   r  r  r  r  r  r  tlinesvlinesrJ  rl   s              r    r  zTiffPage.__str__2  s   =D  $$T6222: 	 	D4..D zz|| yy 
 
 4444444$$T%677<<d>P>PR   (()9::?#'=8b151AQ1F1F(--B262Cq2H2H)..b/3~/B/B++/3~/B/B++     88TZ88899#
 
 
 
 
. %
DK'FFQ;;Kvy$++---=-=>>> 		< 		<CKKeaiK00EMM%---//000zzc%jj500x~~''Q;;H$4$4	T8I8I#CIU6A:NNNEE#CIU6B;OOOE#(((EE:;;;DIIf%%&&&A::KKF++,,,A::uVVWZ!X!X!XX       {{4   s   =M 
M)(M)c                 h     t           fdt          t          j                  D                       S )zReturn set of flags.c              3   f   K   | ]+}t          d |z             |                                V  ,dS rz   r  r
  s     r    r!   z!TiffPage.flags.<locals>.<genexpr>t  sS        4..

     r"   r  r  s   `r    r   zTiffPage.flagsp  sG        "4?33  
 
 	
r"   c                 *    t          | j                  S z"Return number of array dimensions.r.   rE   r  s    r    r  zTiffPage.ndim{       4:r"   c                 *    t          | j                  S z#Return number of elements in array.)r   rE   r  s    r    rH   zTiffPage.size  s     tz"""r"   c                 H   | j         sdS | j        }d|d         j        i}t          | j                                                  D ][}|j        }d|cxk     rdk     sn |j        }t          |j                  dk    r|j        dd         n|j        }|||<   ||j        = \|S )zjReturn consolidated metadata from Andor tags as dict.

        Remove Andor tags from self.tags.

        NIdAndorId   i  r   )r  r  rl   r  r   r  r.   r  )r`   r  rZ   rJ  r  rl   r  s          r    rR  zTiffPage.andor_tags  s     } 	FyY-.	((**++ 	 	C8D$%%%%%%%%IE#&sx==1#4#438ABB<<#(D F4LSXr"   c                     | j         sdS i }| j        }t          | j                                                  D ]}|j        }d|cxk    rdk     sn |j        }|dk    r0t          j                            t          |                    |d<   nv|dk    rt          |          |d<   n]|dk    rt          |          |d<   nD|d	k    rt          |          |d
<   n+|
                    dd          \  }}t          |          ||<   ||j        = |S )z~Return consolidated metadata from EPICS areaDetector tags as dict.

        Remove areaDetector tags from self.tags.

        N  i  	timeStamp  uniqueID  
epicsTSSeci  epicsTSNsec:r&   )r  r  r  r   r  rl   r  fromtimestampr  r   r  r_  r  )r`   rZ   r  rJ  r  rl   rC  s          r    rV  zTiffPage.epics_tags  s+    } 	Fy	((**++ 	 	C8DD((((5((((IEu}}&.&7&E&EeEll&S&S{##%(ZZz""'*5zz|$$(+E

}%%"[[a00
U$UmmsSXr"   c                    | j         sdS | j        }|d         j        }|d         dk    rt          j        d           i S |d         |d         |d         d}t
          j        }t
          j        }t          |d                   D ]}|d	|d	z  z   |d	z  d
z            \  }}}	}
|	                    ||          }|dk    r|
}n\t
          j
        |         }||         j        |
|
|	z            }|dk    r|	dk    r|d         dk    r
|dd         }|	dk    r|n|d         }||v r#	  ||         |          }n# t          $ r Y nw xY w|||<   d|v r`|d         j        }t          j        |          }t          |          dk    r'|                    d                                          }||d<   d|v r6t          j        |d         j                                                  }||d<   d|v r]|d         j        }t          j        |                              d                                                                          }||d<   d|v rL|d         j        }t          j        |                              d                                          }||d<   n	 d|v r|d         j        }i d|d         d|d         d |d         d!|d         d"|d	         d#|d$         d%|d         d&|d'         d(|d
         d)|d*         d+|d,         d-|d.         d/|d0d1         d2|d1d3         d4|d3d5         d6|d5d         |d7<   |S )8z7Return consolidated metadata from GeoTIFF tags as dict.NGeoKeyDirectoryTagr   r&   zinvalid GeoKeyDirectoryTagr   )KeyDirectoryVersionKeyRevisionKeyRevisionMinorr   r   r   鱇  r   r   IntergraphMatrixTagr   )r   r   IntergraphMatrixModelPixelScaleTagModelPixelScaleModelTiepointTag)r   r   ModelTiepointModelTransformationTagModelTransformationFr           )rN  rN  rN        ?RPCCoefficientTagERR_BIASERR_RANDLINE_OFFSAMP_OFFLAT_OFFLONG_OFFr   
HEIGHT_OFF
LINE_SCALEr  
SAMP_SCALE	LAT_SCALEr   
LONG_SCALE
   HEIGHT_SCALE   LINE_NUM_COEFFr   !   zLINE_DEN_COEFF 5   SAMP_NUM_COEFFI   SAMP_DEN_COEFFRPCCoefficient)rs  r  rl   r   r   rO   GEO_KEYS	GEO_CODESrq  rA   rP  r@   r<   r
  r.   rd  tolistr  r7   )r`   r  gkdrZ   geokeysgeocodesr  keyidtagidr  rU   rl   r  sxsysz	tiepoints
transformstpr   r7  r  r   yzrpccs                             r    rt  zTiffPage.geotiff_tags  s     	Fy'(.q6Q;;M6777I $'q6q6 #A
 
 ->3q6]] 	" 	"E*-a%!)meai!m.K*L'E5%KKu--Ezz)E*W+FVe^,CDE>>eaiiE"I4D4D!#2#JE!&a  +HUOE22EE    D!F5MM D((./5EK&&E5zzRf--4466).F%&4''K%9 : @AAHHJJE(-F$%%%+,2EK&&..w77??AAHHJJE&+F?##t++128EK&&..v66==??E,1F())	7& $&&+,2D(DG(DG( DG( DG	(
 47( DG( d1g( d1g( d1g( T!W( d2h( R( !$r"u+( "42;( !$r"u+(  !$rss)!(F#$& s   "D44
E Ec                     d| j         v S )zPage contains tiled image.r+  r  r  s    r    r  zTiffPage.is_tiled       di''r"   c                 >    d| j         v o| j         d         j        dz  S )z'Page is reduced image of another image.r/  r&   r  rl   r  s    r    r  zTiffPage.is_reduced   s'      49,V;K1L1RUV1VVr"   c                 @    d| j         v o| j         d         j        dk    S )z&Page contains chroma subsampled image.YCbCrSubSamplingr>  r{  r  s    r    r  zTiffPage.is_chroma_subsampled%  s.     "TY. 494

64 	r"   c                 V    | j         | j        fD ]}|s dS |dd         dk    r|c S dS )z/Return ImageJ description if exists, else None.Nr  zImageJ=r~  description1r`   r~  s     r    r:  zTiffPage.is_imagej,  s[     !,d.?@ 	# 	#K 2A2)++"""" ,	# 	#r"   c                     | j         | j        fD ]/}|s dS |dd         dk    rd|v r|c S |dd         dk    r|c S 0dS )z?Return description containing array shape if exists, else None.Nr&   {z"shape":r   shape=r  r  s     r    r.  zTiffPage.is_shaped5  s     !,d.?@ 	# 	#K 2A2#%%**C*C""""2A2(**"""" +	# 	#r"   c                     d| j         v S )zPage contains MDFileTag tag.rN  rx  r  s    r    r  zTiffPage.is_mdgel@  ry  r"   c                 P    d| j         v o| j         d         j        dd         dk    S )z'Page contains Media Cybernetics Id tag.MC_IdNr  s   MC TIFFr{  r  s    r    
is_mediacyzTiffPage.is_mediacyE  s.     $)#R	'(:(@!(D
(RRr"   c                     d| j         v S )zPage contains UIC2Tag tag.r  rx  r  s    r    r4  zTiffPage.is_stkJ       DI%%r"   c                     d| j         v S )zPage contains CZ_LSMINFO tag.r  rx  r  s    r    r  zTiffPage.is_lsmO  s     ty((r"   c                     d| j         v S )z$Page contains FluoView MM_STAMP tag.r>  rx  r  s    r    r@  zTiffPage.is_fluoviewT  s     TY&&r"   c                     d| j         v S )zPage contains NIH image header.rB  rx  r  s    r    r  zTiffPage.is_nihY  s      49,,r"   c                 &    d| j         v od| j         v S )z,Page contains SGI image and tile depth tags.r-  r.  rx  r  s    r    is_sgizTiffPage.is_sgi^  s     ty(E[DI-EEr"   c                     | j         dk    S )zSoftware tag is 'ISS Vista'.z	ISS Vistar  r  s    r    r  zTiffPage.is_vistac  s     }++r"   c                     | j         dk    s| j        dk    rdS | j        }|                    d          o|                    d          S )z>Page contains MDS MetaSeries metadata in ImageDescription tag.r&   
MetaSeriesF
<MetaData>z</MetaData>)r  r  r~  
startswithrs  r`   ds     r    r]  zTiffPage.is_metaseriesh  sK     :>>T]l::5||L))Gajj.G.GGr"   c                 p    | j         dk    s| j        sdS | j        }|dd         dk    o|dd         dk    S )z.Page contains OME-XML in ImageDescription tag.r&   FN   <?xml version=z</OME>r  r~  r  s     r    r   zTiffPage.is_omep  I     :>>!1>5"v))@af.@@r"   c                 p    | j         dk    s| j        sdS | j        }|dd         dk    o|dd         dk    S )z4Page contains Leica SCN XML in ImageDescription tag.r&   FNr  r  r  z</scn>r  r  s     r    is_scnzTiffPage.is_scnx  r  r"   c                     d| j         v S )z%Page contains Micro-Manager metadata.re  rx  r  s    r    rf  zTiffPage.is_micromanager  s     &22r"   c                     d| j         v S )z$Page contains Andor Technology tags.r4  rx  r  s    r    r  zTiffPage.is_andor  r  r"   c                 N    | j         dd         dk    o| j        dd         dk    S )zPage contains Pilatus tags.Nr   zTVX TIFFr   # )r  r~  r  s    r    ra  zTiffPage.is_pilatus  s0     }RaR J.O43CBQB3G43OOr"   c                 .    | j         dk    p
| j        dk    S )z&Page contains EPICS areaDetector tags.zEPICS areaDetectorr~  r  r  s    r    r  zTiffPage.is_epics  s%      44 5} 44	
r"   c                     d| j         v S )zPage contains TVIPS metadata.rY  rx  r  s    r    rZ  zTiffPage.is_tvips  s     $)##r"   c                 &    d| j         v pd| j         v S )z&Page contains SFEG or HELIOS metadata.rE  rF  rx  r  s    r    rG  zTiffPage.is_fei  s     TY&C,$)*CCr"   c                     d| j         v S )z!Page contains Zeiss SEM metadata.rJ  rx  r  s    r    rK  zTiffPage.is_sem  s     49$$r"   c                 (    | j         dd         dk    S )zPage contains Aperio metadata.Nr   zAperio Image Libraryr~  r  s    r    is_svszTiffPage.is_svs  s     $(>>>r"   c                 p    | j         dd         dk    p#| j        dd         dk    pd| j         dd         v S )z!Page contains ScanImage metadata.Nr   zstate.config   zSI.LINE_FORMAT_VERSIONzscanimage.SI.i r  r  s    r    rl  zTiffPage.is_scanimage  sO     SbS!^3 :}SbS!%==:$"2455"99	
r"   c                 (    | j         dd         dk    S )z1Page contains PerkinElmer tissue images metadata.N   zPerkinElmer-QPIr  r  s    r    r  zTiffPage.is_qptiff  s    
 }SbS!%666r"   c                     d| j         v S )zPage contains GeoTIFF metadata.rA  rx  r  s    r    rs  zTiffPage.is_geotiff  s     $ty00r"   r   )NTNTr  T)FNNNNrv  )Frh   rp   rq   rr   r  r  r  r  r  r  r<  r  r  r{  r  rx  r  rw  r|  r  r}  r  r~  r  ra   r/   r  r  rw  r  r  r   r  rS   r2  rR   r  r   r  rH   rR  rV  rt  r  r  r  r:  r.  r  r  r4  r  r@  r  r  r  r]  r   r  rf  r  ra  r  rZ  rG  rK  r  rl  r  rs  r   r"   r    r  r  s  sT       " "J JKJIJIMOLLKLIKILHHKLe1 e1 e1 e1R I I I IZ = = = =~     X _  _ K K XK $/ $/ X$/L 
 
 X
 
 
 X
<! <! <! <!| 
 
 X
   X # # X#   X(   X: ` ` X`D ( ( X( W W XW   X # # X# # # X# ( ( X( S S XS & & X& ) ) X) ' ' X' - - X- F F XF , , X, H H XH A A XA A A XA 3 3 X3 & & X& P P XP 
 
 X
 $ $ X$ D D XD % % X% ? ? X? 
 
 X
 7 7 X7 1 1 X1 1 1r"   r  c                       e Zd ZdZdZdZi Zd Zd Zd Z	d Z
ed             Zed	             Zed
             Zd ZddZdS )r  a  Lightweight TIFF image file directory (IFD).

    Only a limited number of tag values are read from file, e.g. StripOffsets,
    and StripByteCounts. Other tag values are assumed to be identical with a
    specified TiffPage instance, the keyframe.

    TiffFrame is intended to reduce resource usage and speed up reading data
    from file, not for introspection of metadata.

    Not compatible with Python 2.

    )r  r  r  rU   r  r  Fc                    || _         || _        || _        d| _        d| _        t
          j        }|j        }|                                | _	        	  ||j
        |                    |j                            d         }|dk    rt          d          n%# t          $ r t          d| j	        z            w xY wh d}|j        }|j        dd         }	|                    ||z            }
| }t#          |          D ]}||z  } ||	|
||dz                      d         }||vr)	 t%          ||
|||z                      }n=# t$          j        $ r+}t)          j        t-          |                     Y d}~{d}~ww xY w|dk    s|d	k    rt/          | d
|j                   |dk    s|dk    rt/          | d|j                   dS )zpRead specified tags from file.

        The file handle position must be at the offset to a valid IFD.

        Nr   r  r  z corrupted page list at offset %i>       D  E  r   r  r  r  r  r  r  )r  r  r  r  r  r   r  r  r   rU   r  r  r  r,   r@   r  r  rq  r  r  r   r   r   ri   rl   )r`   r  r  r  r  r   r  tagcodesr  
codeformatrD   r[   r  rJ  rm   s                  r    ra   zTiffFrame.__init__  s    !
"ggii	OF6-rwwv7G/H/HII!LEt|| !<===  	O 	O 	O?$+MNNN	O (''.&rr*
www''u 	; 	;AWE6*d5519+<&=>>qAD8##fd557?+B&CDD=   c!ff%%% s{{dckkmSY7777.	:::	; 	;s%   AB "B8)EE?!E::E?c                     | j         j                            | j                   t	          | j         | j        d          S )zReturn TiffPage from file.Nr  )r  r  r%   rU   r  r  r  s    r    r  zTiffFrame.aspage  s6    ##DK0004:EEEEr"   c                 6    d|d<   t          j        | g|R i |S )z4Read image data from file and return as numpy array.Fr  )r  r/   r`   r	  r0   s      r    r/   zTiffFrame.asarray  s/    
 #z6t666v666r"   c                 6    d|d<   t          j        | g|R i |S )z>Read image data from file and return RGB image as numpy array.Fr  )r  r  r  s      r    r  zTiffFrame.asrgb  s,    "z~d4T444V444r"   c                     | j         j        r#| j        dd         | j         j        dd         fS t          | j        | j                  S )r  Nr&   )r  rS   r  r  r  r  s    r    r  zTiffFrame.offsets_bytecounts!  sM     =& 	I#BQB')DQRR)HHH#D$4d6IJJJr"   c                 \    | j         j        r| j        d         | j         j        d         fS dS )z5Return offset and size of contiguous data, else None.r   r&   N)r  rS   r  r  s    r    rS   zTiffFrame.is_contiguous(  s;     =& 	G#A&(CA(FFF	G 	Gr"   c                     | j         j        S )r  )r  rR   r  s    r    rR   zTiffFrame.is_memmappable.  s     }++r"   c                     |t           j        v rt          | j        |          S t	          d| j        j        d|d          )zReturn attribute from keyframe.r  r  )rO   FRAME_ATTRSrf   r  rc   rn   rh   r`   r  s     r    r  zTiffFrame.__getattr__3  sO    4###4=$/// n37>3J3J3JDDDQ
 
 	
r"   r   c                     d                     d d                     d | j        D                       t          | j                  fD                       }d| j        | j        |fz  S )z1Return string containing information about frame.r  c              3      K   | ]}|V  d S r   r   r  s     r    r!   z$TiffFrame.__str__.<locals>.<genexpr>?  s3       
 
A
 
 
 
 
 
r"   r   c              3   4   K   | ]}t          |          V  d S r   r  r   s     r    r!   z$TiffFrame.__str__.<locals>.<genexpr>@  s(       < <AQ < < < < < <r"   zTiffFrame %i @%i  %s)r  rE   r   r=   r  rU   )r`   r  r  s      r    r  zTiffFrame.__str__=  ss    yy 
 
 < < < < <<<c$*ooN
 
 
 
 
 &T[$(GGGr"   Nr9  )rh   rp   rq   rr   rs   r  r  ra   r  r/   r  rw  r  rS   rR   r  r  r   r"   r    r  r    s         I HD*; *; *;hF F F
7 7 75 5 5
 K K XK G G XG
 , , X,
 
 
H H H H H Hr"   r  c                   \    e Zd ZdZdZ G d de          Zd Zed             Z	d Z
dd
ZdS )r  a  TIFF tag structure.

    Attributes
    ----------
    name : string
        Name of tag.
    code : int
        Decimal code of tag.
    dtype : str
        Datatype of tag data. One of TIFF DATA_FORMATS.
    count : int
        Number of values.
    value : various types
        Tag data as Python object.
    ImageSourceData : int
        Location of value in file.

    All attributes are read-only.

    )r  r  r=   rl   r  c                       e Zd ZdS )TiffTag.ErrorNrh   rp   rq   r   r"   r    r  r  ]          r"   r  c                 <   |j         }|j        }t          j        }|j        }|                                |z   dz   | _         ||j        |dd                   \  }}	 ||j        |dd                   \  }
}	 t          j
        |	         }n+# t          $ r t                              d|	z            w xY wd||
t          |d                   z  |d         fz  }t          j        |          }||k    s|t          j        v r ||j        |          d         x| _        }|dk     s||j        |z
  k    rt                              d          |                    |           |t          j        v r"t          j        |         } |||||
|          }n|	d	k    s|
dk    r |d
         dk    rt)          ||||
|          }n|t          j        v s|d
         dk    r  |||                    |                    }nEt/          ||||
|          }n1|d
         dk    s|	d	k    r|d|         }n |||d|                   }|t          j        vo|t          j        vo|	d	k    }|r|d
         dk    r|t3          |d         t4                    ra|d         }	 t7          t9          |                                                    }n# t<          $ r t?          j         d|z             d}Y nw xY w|t          j!        v rgt          j!        |         	 tE          fd|D                       }n8# tF          $ r+}t?          j         tI          |                     Y d}~nd}~ww xY w|rtK          |          dk    r|d         }|| _&        || _'        |
| _(        || _)        dS )z$Initialize instance from tag header.r   Nunknown tag data type %i%s%i%sr   r&   r   zinvalid tag value offsetr  r   r   r   'tag %i: coercing invalid ASCII to bytes1Bc              3   .   K   | ]} |          V  d S r   r   )r   r  rG  s     r    r!   z#TiffTag.__init__.<locals>.<genexpr>  s+      !6!61!!A$$!6!6!6!6!6!6r"   )*r  r9   r   r  r  r   r  r  r  rO   DATA_FORMATSr   r  r  r   r  TAG_READERSr  rH   r%   
read_bytesrP  r  
read_numpy	TAG_TUPLEr(   r   	bytes2str
stripasciir  UnicodeDecodeErrorr   r   TAG_ENUMr  r,   r   r.   r  r=   r  rl   )r`   r  	tagheaderr0   r   r9   r  r  r  type_r  rl   r=   r   rH   rU   readfuncprocessrm   rG  s                      @r    ra   zTiffTag.__init__`  s   $	&
7799z1A5fV.	"1">>evf/122??u	D%e,EE 	D 	D 	D-- :U BCCC	D )USq]]%:E!HEEs##*(8 8 8(.v/BE(J(J1(MMDvzzVbgn44mm$>??? GGFOOOt'''+D1 YujII!		eBi3.>.>"2y%
KK""eBi3&6&6sBGGDMM22"2y%
KK2Y#!%4%LEEF3ete--E ((VT-GVEUVJ 	  	%uRyC''JuQx,G,G' !HE!*U"3"3"9"9";";<<%   G$NOOO t}$$M$'*!!6!6!6!6!6!6!666EE! * * *M#a&&))))))))* %u::??!!HE	




s6   ;B (B6.K #K+*K+L+ +
M 5!MM c                 p    t           j                            | j        t	          | j                            S r   )rO   rP  rA   r  r   r  s    r    r  zTiffTag.name  s"    y}}TYDI777r"   c                 r   | j         dk    r| j        dk    rt          j        d           |j        |j                 }t          j        || j                  d         | _	        |j
                            | j	                   t          j        d|j
                            d                    | _        dS dS dS )zCorrect LSM bitspersample tag.

        Old LSM writers may use a separate region for two 16-bit values,
        although they fit into the tag value element of the tag.

          r   z correcting LSM bitspersample tagr   z<HHr   N)r  r  r   r   r  r  r   r  _valuer  r  r%   r  rl   )r`   r  tofs      r    r  zTiffTag._fix_lsm_bitspersample  s     9
aM<===%f&78C%}S$+>>qAD""4#3444uf.?.D.DQ.G.GHHDJJJ r"   r   r  c                    |dk    rdnd|z  }d| j         t          | j        d                   z  | j        d         fz  }d| j        | j        || j        fd|         z  }| j        t          j        v ra| j         dk    r*t          j        | j                 | j                  j        }nCt          t          d | j        D                                 }nt          | j        ||          }|dk    r||z  }|d|         }n|d	|z   z  }|S )
z/Return string containing information about tag.r   r&   r   z%i%szTiffTag %i %s  %s @%i  Nc              3   $   K   | ]}|j         V  d S r   )r  )r   r  s     r    r!   z"TiffTag.__str__.<locals>.<genexpr>  s$      %A%Aaf%A%A%A%A%A%Ar"   r  r  )r  r   r=   r  r  r  rO   r  rl   r  r  )r`   r  r  r  tcodelinerl   s          r    r  zTiffTag.__str__  s   kkq6z$*s4:a='9'994:a=II%y$)UD,<=fufEF 	
 9%%zQdi0<<A%A%Adj%A%A%A A ABBDJeFCCCEQ;;EMD<DDD5L Dr"   Nrv  )rh   rp   rq   rr   rs   r@   r  ra   rw  r  r  r  r   r"   r    r  r  E  s         * CI    	   A A AF 8 8 X8I I I     r"   r  c                       e Zd ZdS )TiffFileErrorNr  r   r"   r    r  r    s        Dr"   r  c                       e Zd ZdZ	 	 	 	 	 ddZddZed             Zed             Z	ed             Z
ed	             Zd
 Zd Zd Zd ZdS )r   a  Series of TIFF pages with compatible shape and data type.

    Attributes
    ----------
    pages : list of TiffPage
        Sequence of TiffPages in series.
    dtype : numpy.dtype
        Data type (native byte order) of the image array in series.
    shape : tuple
        Dimensions of the image array in series.
    axes : str
        Labels of axes in shape. See TiffPage.axes.
    offset : int or None
        Position of image data in file if memory-mappable, else None.

    NFc
                    d| _         || _        t          |          | _        d                    |          | _        t          j        |          | _        |r|nd| _        |r|nd| _	        || _
        |r|| _        n|r|d         j        | _        nd| _        t          |          dk    rE|	sCt          t          | j                  t          |d         j                  z            | _        dS t          |          | _        dS )zInitialize instance.r   r,  Nr&   )r  r  r  rE   r  r  r<   r=   r  r  rb  r  r.   r   r   _len)
r`   rQ   rE   r=   r  r  r  rb  r  r$  s
             r    ra   zTiffPageSeries.__init__  s     
5\\
GGDMM	[''
#+UU
 (DDb	" 	 DKK 	(/DKKDKu::??9?GDJ//758>3J3JJKKDIIIE

DIIIr"   c                     | j         r:| j                             | |          }| j        |                     |          }|S dS )z;Return image data from series of TIFF pages as numpy array.)rT   r  N)r  r/   rb  )r`   r  rZ   s      r    r/   zTiffPageSeries.asarray  sN    ; 	[((#(>>F~)//M		 	r"   c                    | j         sdS d}| j         D ]S}| dS |j        s dS |s|j        d         |j        d         z   }/||j        d         k    r dS ||j        d         z  }T| j         d         }|j        d         }|j        s|j        rt          | j                   dk    r|S ||t          | j                  | j        j	        z  z   k    r|S dS )z-Return offset to series data in file, if any.Nr   r&   )
r  r2  rS   r:  r.  r.   r   rE   r=   r>   )r`   r   rX   rU   s       r    rU   zTiffPageSeries.offset  s    { 	FK 
	) 
	)D|=  (+d.@.CCd(+++4%a((CC{1~#A&N 	dn 	#dk2B2Ba2G2GM&74:..1DDDDDM EDr"   c                 *    t          | j                  S r-  r.  r  s    r    r  zTiffPageSeries.ndim+  r/  r"   c                 D    t          t          | j                            S r1  )r   r   rE   r  s    r    rH   zTiffPageSeries.size0  s     74:&&'''r"   c                     | S )z'Return sequence of all pages in series.r   r  s    r    rQ   zTiffPageSeries.pages5  s	     r"   c                     | j         S )z%Return number of TiffPages in series.)r  r  s    r    r  zTiffPageSeries.__len__;  
    yr"   c                     t          | j                  dk    r<d|cxk     r| j        k     r*n n'| j        d         j        }| j        j        ||z            S | j        |         S )zReturn specified TiffPage.r&   r   )r.   r  r  r  r  rQ   )r`   rC  r  s      r    r  zTiffPageSeries.__getitem__?  si    t{q  Q%8%8%8%8ty%8%8%8%8%8KN(E;$US[11{3r"   c              #      K   t          | j                  | j        k    r| j        D ]}|V  dS | j        j        }| j        d         j        }t          | j                  D ]}|||z            V  dS )z)Return iterator over TiffPages in series.r   N)r.   r  r  r  rQ   r  rq  )r`   rX   rQ   r  r   s        r    r  zTiffPageSeries.__iter__F  s      t{ty((  



  K%EKN(E49%% ' 'EAI&&&&&' 'r"   c                 l   d                     d | j        rt          d| j        z  d          ndd                     d | j        D                       t	          | j                  | j        | j        dt          | j	                  z  | j
        r
d	| j
        z  ndfD                       }d
| j        |fz  S )z,Return string with information about series.r  c              3      K   | ]}||V  	d S r   r   r  s     r    r!   z)TiffPageSeries.__str__.<locals>.<genexpr>S  s>       
 
 

 
 
 
 
 
r"   z'%s'r   r,  r   c              3   4   K   | ]}t          |          V  d S r   r  r   s     r    r!   z)TiffPageSeries.__str__.<locals>.<genexpr>W  r   r"   r  z	Offset=%izTiffPageSeries %i  %s)r  r  r  rE   r   r=   r  r  r.   rQ   rU   r  )r`   r   s     r    r  zTiffPageSeries.__str__Q  s    II 
 
 489D*B///"4444444DJ	
S__,/3{Bt{**
 
 
 
 
 '$*a88r"   )NNNNFr   )rh   rp   rq   rr   ra   r/   r   rU   rw  r  rH   rQ   r  r  r  r  r   r"   r    r   r     s         . # # # #@      X4   X ( ( X(   X
       	' 	' 	'9 9 9 9 9r"   r   c                   n    e Zd ZdZddiZ G d de          ZedfdZd Z	d Z
d	 Zd
 Zd ZddZd ZdS )r   a  Sequence of TIFF files.

    The image data in all files must match shape, dtype, etc.

    Attributes
    ----------
    files : list
        List of file names.
    shape : tuple
        Shape of image sequence. Excludes shape of image array.
    axes : str
        Labels of axes in shape.

    Examples
    --------
    >>> # read image stack from sequence of TIFF files
    >>> imsave('temp_C001T001.tif', numpy.random.rand(64, 64))
    >>> imsave('temp_C001T002.tif', numpy.random.rand(64, 64))
    >>> tifs = TiffSequence('temp_C001*.tif')
    >>> tifs.shape
    (1, 2)
    >>> tifs.axes
    'CT'
    >>> data = tifs.asarray()
    >>> data.shape
    (1, 2, 64, 64)

    r  a  
            # matches Olympus OIF and Leica TIFF series
            _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))
            _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
            _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
            _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
            _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
            _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
            _?(?:(q|l|p|a|c|t|x|y|z|ch|tp)(\d{1,4}))?
            c                       e Zd ZdS )TiffSequence.ParseErrorNr  r   r"   r    r  r    r  r"   r  c           	      `   t          |t          j                  rt          |          }t          |t                    r!t          t          j        |                    }t          |          }|st          d          t          |d         t          j                  rd |D             }n*t          |d         t                    st          d          || _	        t          |d          r|fd}|| _        | j                            ||          | _        	 |                                  | j        s	d| _        d
S d
S # | j        $ r_ d| _        t%          |          f| _        d| _        t+          d	 t-          t%          |                    D                       | _        Y d
S w xY w)a\  Initialize instance from multiple files.

        Parameters
        ----------
        files : str, pathlib.Path, or sequence thereof
            Glob pattern or sequence of file names.
            Binary streams are not supported.
        imread : function or class
            Image read function or class with asarray function returning numpy
            array from single file.
        pattern : str
            Regular expression pattern that matches axes names and sequence
            indices in file names.
            By default, the pattern matches Olympus OIF and Leica TIFF series.

        r$   r   c                 P    g | ]#}t          t          j        |                    $S r   )r   pathlibPathr  s     r    rK  z)TiffSequence.__init__.<locals>.<listcomp>  s(    999aSa))999r"   znot a file namer/   c                 h     |           5 } |j         |i |cd d d            S # 1 swxY w Y   d S r   )r/   )r  r	  r0   im_imreads       r    r   z%TiffSequence.__init__.<locals>.imread  s    WU^^ 7r%2:t6v667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s   '++r   r9  c              3      K   | ]}|fV  d S r   r   r   s     r    r!   z(TiffSequence.__init__.<locals>.<genexpr>  s$      !B!B11$!B!B!B!B!B!Br"   N)r(   r  r  r   r)   r   r+   r  r,   r   r-   r   	_patternsrA   r   _parser  r  r.   rE   _startindexr  rq  _indices)r`   r   r   r   r	  r0   r  s         @r    ra   zTiffSequence.__init__  s   " eW\** 	JJEeZ(( 	5"49U#3#344EU 	/-...eAh-- 	0995999EEE!Hj11 	0.///
69%% 	7G7 7 7 7 7 ~))'7;;	CKKMMM9  			    	C 	C 	CDIe**DJ#D!!B!Bc%jj0A0A!B!B!BBBDMMMM		Cs   "E A%F-,F-c           	          d                     | j        d         dt          | j                  z  d| j        z  dt	          | j                  z  g          S )z4Return string with information about image sequence.r  r   z	 size: %iz	 axes: %sz
 shape: %s)r  r   r.   r  r   rE   r  s    r    r  zTiffSequence.__str__  sP    yy
1c$*oo-di's4:.	
 
 	
r"   c                 *    t          | j                  S r   )r.   r   r  s    r    r  zTiffSequence.__len__  s    4:r"   c                     | S r   r   r  s    r    r  zTiffSequence.__enter__  r  r"   c                 .    |                                   d S r   r  r  s       r    r  zTiffSequence.__exit__  r  r"   c                     d S r   r   r  s    r    r  zTiffSequence.close      r"   Nc                     | j         | j        d         g|R i |}| j        |j        z   }t          |||j                  } |j        dg|j        R  }t          | j        | j                  D ]T\  }}d t          || j                  D             }t          j
        || j                  } | j         |g|R i |}|||<   U||_        |S )zRead image data from all files and return as numpy array.

        The args and kwargs parameters are passed to the imread function.

        Raise IndexError or ValueError if image shapes do not match.

        r   r   r   c                     g | ]
\  }}||z
  S r   r   r   r   r7  s      r    rK  z(TiffSequence.asarray.<locals>.<listcomp>  s     DDDtq!QUDDDr"   )r   r   rE   r   r=   rd  r5  r  r  r<   r  )	r`   r  r	  r0   r   rE   rZ   r  r  s	            r    r/   zTiffSequence.asarray  s     T[A888888
RX%sE:::.RX...tz:: 	 	LE5DDs5$2B'C'CDDDE+E4:>>EU4T444V44BF5MMr"   c           	         | j         s|                     d          t          j        | j         t          j        t          j        z            }|                    | j        d                   }|s|                     d          |d         }t          |          dz  r|                     d          d	                    d |d	d	d         D                       }|s|                     d          g }| j        D ]}|                    |          d         }|d	                    d
 |d	d	d         D                       k    rt          d          |                    d |dd	d         D                        t          t          j        |d                    }t          t          j        |d                    }t          d t!          ||          D                       }t#          |          t          | j                  k    rt%          j        d           |                                | _        || _        || _        || _        d	S )z#Get axes and shape from file names.zinvalid patternr   z!pattern does not match file namesr   r   z*pattern does not match axis name and indexr,  c              3      K   | ]}||V  	d S r   r   r   r  s     r    r!   z&TiffSequence._parse.<locals>.<genexpr>  s'      44Q!4q444444r"   Nc              3      K   | ]}||V  	d S r   r   r  s     r    r!   z&TiffSequence._parse.<locals>.<genexpr>  s'      <<Q!<q<<<<<<r"   z+axes do not match within the image sequencec                 0    g | ]}|t          |          S r   r   r  s     r    rK  z'TiffSequence._parse.<locals>.<listcomp>  s#    ???qQ?CFF???r"   r&   r   c              3   ,   K   | ]\  }}||z
  d z   V  dS r   r   r  s      r    r!   z&TiffSequence._parse.<locals>.<genexpr>  s.      CCDAqa!eaiCCCCCCr"   z*files are missing. Missing data are zeroed)r   r  recompile
IGNORECASEVERBOSEfindallr   r.   r  r,   r7   r  r<   r  rt  r5  r   r   r   r]  r  rE   r  r  )r`   r   matchesr  r  r  rE   
startindexs           r    r  zTiffSequence._parse  s2   | 	5//"3444*T\2=2:+EFF//$*Q-00 	G//"EFFF"+w<<! 	P//"NOOOww44'##A#,44444 	G//"EFFFZ 	A 	AEooe,,R0Grww<<'##A#,<<<<<<< !NOOONN??GADqDM???@@@@eia0001159W155566
CCCz,B,BCCCCC5>>S__,,MFGGGJJLL	
%r"   r   )rh   rp   rq   rr   r  r@   r  r	   ra   r  r  r  r  r  r/   r  r   r"   r    r   r   c  s         < 	 	I    Y    &.v 1C 1C 1C 1Cf	
 	
 	
           (& & & & &r"   r   c                   (   e Zd ZdZdZd$dZd Zd%dZd	 Zd
 Z	d&dZ
	 d'dZd(dZd Zd Zd Zd)dZd Zd Zd Zd Zed             Zed             Zed             Zed              Zed!             Zed"             Zej        d#             ZdS )*r   a  Binary file handle.

    A limited, special purpose file handler that can:

    * handle embedded files (for CZI within CZI files)
    * re-open closed files (for multi-file formats, such as OME-TIFF)
    * read and write numpy arrays and records from file like objects

    Only 'rb' and 'wb' modes are supported. Concurrently reading and writing
    of the same stream is untested.

    When initialized from another file handle, do not use it unless this
    FileHandle is closed.

    Attributes
    ----------
    name : str
        Name of the file.
    path : str
        Absolute path to file.
    size : int
        Size of file in bytes.
    is_file : bool
        If True, file has a filno and can be memory-mapped.

    All attributes are read-only.

    )
r   _file_mode_name_dir_lock_offset_size_closer  rw   Nc                     || _         d| _        || _        || _        d| _        || _        || _        d| _        d| _        t                      | _
        |                                  dS )a  Initialize file handle from file name or another file handle.

        Parameters
        ----------
        file : str, pathlib.Path, binary stream, or FileHandle
            File name or seekable binary stream, such as an open file
            or BytesIO.
        mode : str
            File open mode in case 'file' is a file name. Must be 'rb' or 'wb'.
        name : str
            Optional name of file in case 'file' is a binary stream.
        offset : int
            Optional start position of embedded file. By default, this is
            the current file position.
        size : int
            Optional size of embedded file. By default, this is the number
            of bytes from the 'offset' to the end of the file.

        Nr,  TF)r  r   r  r   r!  r#  r$  r%  r  NullContextr"  r  )r`   rC   rY   r  rU   rH   s         r    ra   zFileHandle.__init__;  s_    ( 


	
 ]]
		r"   c                    | j         rdS t          | j        t          j                  rt          | j                  | _        t          | j        t                    rt          j        	                    | j                  | _        t          j        
                    | j                  \  | _        | _        t          | j        | j                  | _         d| _        | j        d| _        nt          | j        t"                    r| j        j         | _         | j        d| _        | xj        | j        j        z  c_        d| _        | j        sW| j        r?t          j                            | j        j                  \  }}d|| j        |fz  | _        n| j        j        | _        | j        r$| j        | j        j        k    rt'          d          | j        j        | _        | j        j        | _        nt)          | j        d          r	 | j                                         n# t,          $ r t'          d          w xY w| j        | _         | j        | j                                        | _        d| _        | j        sO	 t          j        
                    | j         j                  \  | _        | _        n# t0          $ r
 d	| _        Y nw xY w	 | j         j        | _        n# t0          $ r Y nw xY wt'          d
          | j        r| j                             | j                   | j        q| j                                         }| j                             | j        d           | j                                         | _        | j                             |           	 | j                                          d| _        dS # t,          $ r d| _        Y dS w xY w)zOpen or re-open file.NTr   Fz%s@%i%szFileHandle has wrong moder%   zbinary stream is not seekablezUnnamed binary streamzNThe first parameter must be a file name, seekable binary stream, or FileHandler   )r   r(   r  r  r  r   r)   r  r  realpathr  r!  r   r  r  r%  r#  r   splitextr,   r-   r   r@   r  rc   rY   r%   r$  r  r  )r`   r  extr   s       r    r  zFileHandle.open[  sy   8 	Fdj',// 	)TZDJdj*-- 0	))$*55DJ$&GMM$*$=$=!DItzDJ
33DHDK|# 
J// (	z~DH|# LLDJ..LLDK: 2< 2 " 0 01A B BID#!*dDL#-F!FDJJ!%!1DJz >djDJ,<<< !<===)DJ
DIITZ(( 	B
!!!! B B B !@AAABzDH|##z00DK: 99,.GMM$(-,H,H)DItzz% 9 9 9!8DJJJ9!X]

!    8  
 < 	(HMM$,''':(--//CHMM$,***DJHMM#	!HOODLLL 	! 	! 	! DLLLL	!sB   	H# #H= 6J7 7K
KK! !
K.-K. O OOr   c                 ^    |dk     r| j         r| j        }| j                            |          S )z5Read 'size' bytes from file, or until EOF is reached.r   )r#  r$  r   r  r`   rH   s     r    r  zFileHandle.read  s,    !888:Dx}}T"""r"   c                 6    | j                             |          S )zWrite bytestring to file.)r   r   )r`   
bytestrings     r    r   zFileHandle.write  s    x~~j)))r"   c                 4    | j                                         S )z"Flush write buffers if applicable.)r   ru  r  s    r    ru  zFileHandle.flush  s    x~~r"   r   rrM   c                 |    | j         st          d          t          j        | j        ||| j        |z   ||          S )z+Return numpy.memmap of data stored in file.z%Cannot memory-map file without fileno)r=   rY   rU   rE   order)r  r,   r<   r   r   r#  )r`   r=   rE   rU   rY   r3  s         r    r  zFileHandle.memmap_array  sP    | 	FDEEE|H<&(
 
 
 	
r"   r,     Fc                    | j         }t          j        |          }|dk     r| j        n	||j        z  }|	 t          j        ||||          }	nM# t          $ r@ |                    |          }
t          j        |
||          	                                }	Y nw xY w|rM|	j        j
        sA|	                    d           |	                    |	j                                                  }	|	S |j        }t          |j        |          }|                    d          }d}|dk    rr|                    t          ||                    }
t%          |
          }|dk    rn9||z  }t          j        |
|          }
|
||||
j        z   <   ||
j        z  }|dk    rt)          |d          r|                                 |                    |          S )zReturn numpy array from file.

        Work around numpy issue #2230, "numpy.fromfile does not accept
        StringIO object" https://github.com/numpy/numpy/issues/2230.

        r   NTr   ru  )r   r<   r=   r$  r>   fromfiler   r  r  rg  rN  r  r  rM  rE   rt  r?   rd  r.   rH   r-   ru  )r`   r=   r  sep	chunksizer  r  r   rH   rZ   rD   rE   r  r  s                 r    r  zFileHandle.read_array  s    XE"""QYYtzzEEN,B;EE5#>> E E Ewwt}})$u==BBDDE  Bfl3 B%%%V\%>%>%@%@AAM 	3:t$$kk"ooQhh773y$//00D4yyH1}}HD#D%00D-1C	))*TYE Qhh 3   	IIKKK{{5!!!s   A ABBr&   c                    t           j        }	 |                    | j        |||          }n# t          $ r t          j        |          }|| j        |j        z  }t          t          |                    |j        z  }| j        
                    |          }|                    ||||          }Y nw xY w|dk    r|d         n|S )zReturn numpy record from file.r9   Nr&   r   )r<   recr6  r   r@   r=   r$  r>   r   sequencer  r  )r`   r=   rE   r9   r;  recordrH   rD   s           r    read_recordzFileHandle.read_record  s    i	M\\$(E5I\NNFF 	M 	M 	MK&&E}
en48E??++en<D8==&&D^^D%)^LLFFF	M "QJJvayyF2s   - BB65B6c                     |dk     rdS | j                             |dz
  d           | j                             d           dS )z;Append size bytes to file. Position must be at end of file.r&   Nr   )r   r%   r   r-  s     r    rR  zFileHandle.write_empty  sD    !88FdQh"""wr"   c                     	 |                     | j                   dS # t          $ r0 | j                            |                                           Y dS w xY w)z!Write numpy array to binary file.N)tofiler   r@   r   r  )r`   rD   s     r    rS  zFileHandle.write_array   sa    	,KK!!!!! 	, 	, 	,HNN4==??++++++	,s    6AAc                 D    | j                                         | j        z
  S )zReturn file's current position.)r   r   r#  r  s    r    r   zFileHandle.tell  s    x}}--r"   c                    | j         ri|dk    r%| j                            | j         |z   |           dS |dk    r8| j        dk    r-| j                            | j         | j        z   |z   d           dS | j                            ||           dS )zSet file's current position.r   Nr   )r#  r   r%   r$  )r`   rU   whences      r    r%   zFileHandle.seek  s    < 	{{dlV3V<<<1adlTZ7&@!DDDff%%%%%r"   c                 j    | j         r)| j        r$| j                                         d| _        dS dS dS )zClose file.N)r%  r   r  r  s    r    r  zFileHandle.close  sF    ; 	48 	HNNDHHH	 	 	 	r"   c                     | S r   r   r  s    r    r  zFileHandle.__enter__  r  r"   c                 .    |                                   d S r   r  r  s       r    r  zFileHandle.__exit__   r  r"   c                 h    | j         rt          j        d|z             t          | j        |          S )z-Return attribute from underlying file object.z3FileHandle: '%s' not implemented for embedded files)r#  r   r   rf   r   r  s     r    r  zFileHandle.__getattr__#  s6    < 	XMORVVWWWtx&&&r"   c                     | j         S r   )r   r  s    r    r  zFileHandle.name)  
    zr"   c                     | j         S r   )r!  r  s    r    r  zFileHandle.dirname-  r  r"   c                 V    t           j                            | j        | j                  S r   )r  r  r  r!  r   r  s    r    r  zFileHandle.path1  s    w||DItz222r"   c                     | j         S r   )r$  r  s    r    rH   zFileHandle.size5  rJ  r"   c                     | j         d u S r   r  r  s    r    r  zFileHandle.closed9  s    x4r"   c                     | j         S r   )r"  r  s    r    r  zFileHandle.lock=  rJ  r"   c                 V    |rt          j                    nt                      | _        d S r   )	threadingRLockr'  r"  r  s     r    r  zFileHandle.lockA  s#    */BY_&&&[]]


r"   )rw   NNNr   )r   r1  rM   )r   r,  r4  NFr   r9  )rh   rp   rq   rr   rs   ra   r  r  r   ru  r  r  r>  rR  rS  r   r%   r  r  r  r  rw  r  r  r  rH   r  r  r  r   r"   r    r   r     s        :I   @F! F! F!P# # # #* * *     
 
 
 
 JO+" +" +" +"Z3 3 3 3     , , ,. . .	& 	& 	& 	&      ' ' '   X   X 3 3 X3   X     X    X 
[C C [C C Cr"   r   c                       e Zd ZdZd Zd ZdS )r'  zINull context manager.

    >>> with NullContext():
    ...     pass

    c                     | S r   r   r  s    r    r  zNullContext.__enter__N  r  r"   c                     d S r   r   r  s       r    r  zNullContext.__exit__Q  r  r"   N)rh   rp   rq   rr   r  r  r   r"   r    r'  r'  F  s<               r"   r'  c                   0    e Zd ZdZdZddZd Zd Zd ZdS )	OpenFileCachezKeep files open.)r   pastr  rH   Nc                 x    g | _         i | _        |t                      n|| _        t	          |          | _        dS )zInitialize open file cache.N)rX  r   r'  r  r   rH   )r`   rH   r  s      r    ra   zOpenFileCache.__init__Z  s4    	
%)\KMMMt	II			r"   c                    | j         5  || j        v r| j        |xx         dz  cc<   n?|j        r8|                                 d| j        |<   | j                            |           ddd           dS # 1 swxY w Y   dS )zRe-open file if necessary.r&   N)r  r   r  r  rX  r7   )r`   r  s     r    r  zOpenFileCache.opena  s    Y 	- 	-TZ''
:&&&!+&&&&" -!!!)*
:&	  ,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   AA44A8;A8c                    | j         5  || j        v r| j        |xx         dz  cc<   d}t          | j                  }|| j        k    rd||k     r^| j        |         }| j        |         dk    r*|                                 | j        |= | j        |= |dz  }n|dz  }|| j        k    r||k     ^ddd           dS # 1 swxY w Y   dS )z$Close opened file if no longer used.r&   r   N)r  r   r.   rX  rH   r  )r`   r  r  rH   s       r    r  zOpenFileCache.closek  s/   Y 	# 	#TZ''
:&&&!+&&&49~~TY&&54<<!%5!1Jz*-22"((*** Jz2 Ie,	
 TY&&54<<	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   B$B99B= B=c                 $   | j         5  t          | j                                                  D ]G\  }}|dk    r<|                                 | j        |= | j        | j                            |          = H	 ddd           dS # 1 swxY w Y   dS )z%Close all opened files if not in use.r   N)r  r  r   r  r  rX  r  )r`   r  refcounts      r    r!  zOpenFileCache.clear}  s    Y 	? 	?(,TZ-=-=-?-?(@(@ ? ?$
Hq==$$&&&
:.	$)//*"="=>	?	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?s   A/BB	B	r   )	rh   rp   rq   rr   rs   ra   r  r  r!  r   r"   r    rW  rW  U  s`        1I   - - -# # #$? ? ? ? ?r"   rW  c                       e Zd ZdZd Zd ZdS )	LazyConstzEClass whose attributes are computed on first access from its methods.c                 >    || _         t          |d          | _        d S )Nrr   )_clsrf   rr   )r`   clss     r    ra   zLazyConst.__init__  s    	sI..r"   c                     t          | j        |          }t          |          s|S 	  |            }n$# t          $ r |                                }Y nw xY wt          | ||           |S r   )rf   ra  callabler  __func__ri   )r`   r  r^   rl   s       r    r  zLazyConst.__getattr__  s}    ty$''~~ 	K	$DFFEE 	$ 	$ 	$MMOOEEE	$ 	dE"""s   
3 AAN)rh   rp   rq   rr   ra   r  r   r"   r    r_  r_    s8        OO/ / /
 
 
 
 
r"   r_  c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=d< Z>d= Z?d> Z@d? ZAd@S )ArO   zNamespace for module constants.c                  <   i ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDi dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfi dgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddēddƓddȓddʓdd̓i ddΓddГddғddԓdd֓ddؓddړddܓddޓddddddddddddddddi dddddddddddddddddd ddddddddd	d
ddddddi dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2i d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTi dUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvi dwdxdydzd{d|d}d~ddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddddddÐdēdŐdƓdǐdȓdɐdʓdːd̓d͐dΓdϐdГdѐdғdӐdԓdՐd֓dאdؓdِdړdېdܓi dݐdޓdߐdddddddddddddddddddddddddddddddi dd ddddddddd	d
dddddddddddddddddddddd i d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBi dCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcddi dedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddi ddddddddddddddddddddddddddddddddddi dddddddddddddddddddddddddddÐdēdŐdƓdǐdȓdɐdʓi dːd̓d͐dΓdϐdГdѐdғdӐdԓdՐd֓dאdؓdِdړdېdܓdݐdޓdߐdddddddddddddi dddddddddddddddddddd ddddddddd	d
ddddi dddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0i d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRi dSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdti dudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddddddddÐdēdŐdƓdǐdȓdɐdʓdːd̓d͐dΓdϐdГdѐdғdӐdԓdՐd֓dאdؓdِdړi dېdܓdݐdޓdߐdddddddddddddddddddddddddddddi dddd ddddddddd	d
ddddddddddddddddddddi dd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@i dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbi dcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddS (  Nr^  ProcessingSoftware   r/  r  SubfileType   r)    r*  r  r7    r'    r3    Thresholdingi  	CellWidthi	  
CellLength
  	FillOrderi  DocumentNamerH  r#  i  Makei  Modelr  r    Orientationi  r5  i  r?  r  r  i  MinSampleValuei  MaxSampleValuei  r:  i  r<    r6  i  PageNamei  	XPositioni  	YPositioni   FreeOffsetsi!  FreeByteCounts"  GrayResponseUniti#  GrayResponseCurvei$  	T4Optionsi%  	T6Options(  r=  i)  
PageNumber,  ColorResponseUniti-  TransferFunctioni1  r%  i2  r&  i;  Artisti<  HostComputer=  r(  i>  
WhitePointi?  PrimaryChromaticities@  r4  iA  HalftoneHintsiB  r+  iC  r,  r  r  r  r  iF  BadFaxLinesiG  CleanFaxDataiH  ConsecutiveBadFaxLinesiJ  SubIFDsiL  InkSetiM  InkNamesiN  NumberOfInksiP  DotRangeiQ  TargetPrinterR  r8  S  r2  iT  SMinSampleValueiU  SMaxSampleValueiV  TransferRangeiW  ClipPathiX  XClipPathUnitsiY  YClipPathUnitsiZ  Indexedi[  r  i_  OPIProxyi  GlobalParametersIFDi  ProfileTypei  
FaxProfilei  CodingMethodsi  VersionYeari  
ModeNumberi  Decodei  DefaultImageColori  
T82Optionsi  JPEGTables_i   JPEGProci  JPEGInterchangeFormati  JPEGInterchangeFormatLengthi  JPEGRestartIntervali  JPEGLosslessPredictorsi  JPEGPointTransformsi  JPEGQTablesi  JPEGDCTablesi	  JPEGACTablesi  YCbCrCoefficients  r}    YCbCrPositioningi  ReferenceBlackWhitei/  StripRowCountsi  XMPi  GDIGammai  ICCProfileDescriptori  SRGBRenderingIntenti   
ImageTitlei  USPTO_Miscellaneousr5  r4  i  AndorTemperaturei  AndorExposureTimei  AndorKineticCycleTimei  AndorAccumulationsi  AndorAcquisitionCycleTimei  AndorReadoutTimei  AndorPhotonCountingi  AndorEmDacLeveli  AndorFramesi   AndorHorizontalFlipi!  AndorVerticalFlipi"  AndorClockwisei#  AndorCounterClockwisei(  AndorVerticalClockVoltagei)  AndorVerticalShiftSpeedi+  AndorPreAmpSettingi,  AndorCameraSeriali/  AndorActualTemperaturei0  AndorBaselineClampi1  AndorPrescansi2  
AndorModeli3  AndorChipSizeXi4  AndorChipSizeYiP  AndorBaselineOffsetif  AndorSoftwareVersioniFG  RatingiGG  
XP_DIP_XMLiHG  
StitchInfoiIG  RatingPercentiP  ResolutionXUnitiP  ResolutionYUnitiP  ResolutionXLengthUnitiP  ResolutionYLengthUnitiP  
PrintFlagsiP  PrintFlagsVersioniP  PrintFlagsCropiP  PrintFlagsBleedWidthi	P  PrintFlagsBleedWidthScalei
P  HalftoneLPIiP  HalftoneLPIUnitiP  HalftoneDegreeiP  HalftoneShapeiP  HalftoneMisciP  HalftoneScreeniP  JPEGQualityiP  GridSizeiP  ThumbnailFormatiP  ThumbnailWidthiP  ThumbnailHeightiP  ThumbnailColorDepthiP  ThumbnailPlanesiP  ThumbnailRawBytesiP  ThumbnailSizeiP  ThumbnailCompressedSizeiP  ColorTransferFunctioniP  ThumbnailDatai P  ThumbnailImageWidthi!P  ThumbnailImageHeighti"P  ThumbnailBitsPerSamplei#P  ThumbnailCompressioni$P  ThumbnailPhotometricInterpi%P  ThumbnailImageDescriptioni&P  ThumbnailEquipMakei'P  ThumbnailEquipModeli(P  ThumbnailStripOffsetsi)P  ThumbnailOrientationi*P  ThumbnailSamplesPerPixeli+P  ThumbnailRowsPerStripi,P  ThumbnailStripBytesCounti-P  ThumbnailResolutionXi.P  ThumbnailResolutionYi/P  ThumbnailPlanarConfigi0P  ThumbnailResolutionUniti1P  ThumbnailTransferFunctioni2P  ThumbnailSoftwareUsedi3P  ThumbnailDateTimei4P  ThumbnailArtisti5P  ThumbnailWhitePointi6P  ThumbnailPrimaryChromaticitiesi7P  ThumbnailYCbCrCoefficientsi8P  ThumbnailYCbCrSubsamplingi9P  ThumbnailYCbCrPositioningi:P  ThumbnailRefBlackWhitei;P  ThumbnailCopyRightiAP  InteroperabilityIndexiBP  InteroperabilityVersioniP  LuminanceTableiP  ChrominanceTablei Q  
FrameDelayiQ  	LoopCountiQ  GlobalPaletteiQ  IndexBackgroundiQ  IndexTransparentiQ  	PixelUnitiQ  PixelPerUnitXiQ  PixelPerUnitYiQ  PaletteHistogrami p  SonyRawFileTypei2p  VignettingCorrParamsi5p  ChromaticAberrationCorrParamsi7p  DistortionCorrParamsi  ImageIDi  WangTag1i  WangAnnotationi  WangTag3i  WangTag4i  ImageReferencePointsi  RegionXformTackPointi  WarpQuadrilaterali  AffineTransformMati  Matteingi  DataTypei  r-  i  r.  i  ImageFullWidthi  ImageFullLengthi  TextureFormati  TextureWrapModesi  FieldOfViewCotangenti  MatrixWorldToScreeni  MatrixWorldToCamerai}  Model2i  CFARepeatPatternDimi  
CFAPatterni  BatteryLeveli  KodakIFDi  ExposureTimei  FNumberi  	CopyrightrO  rN  i  MDScalePixeli  MDColorTablei  	MDLabNamei  MDSampleInfoi  
MDPrepDatei  
MDPrepTimei  MDFileUnitsi  rH  i5  AdventScalei6  AdventRevision\  r#  ]  r  ^  r$  _  r%  黃  IPTCNAAiB  ExtendedTagsOffseti~  IntergraphPacketDatai  IntergraphFlagRegistersi  rF  i  INGRReservedi  rJ  郄  
LeicaMagici  Sitei  ColorSequencei  	IT8Headeri  RasterPaddingi  BitsPerRunLengthi  BitsPerExtendedRunLengthi  
ColorTablei  ImageColorIndicatori  BackgroundColorIndicatori  ImageColorValuei  BackgroundColorValuei  PixelIntensityRangei  TransparencyIndicatori  ColorCharacterizationi  HCUsagei  TrapIndicatori  CMYKEquivalentF  rJ  ih  	AFCP_IPTCi  PixelMagicJBIGOptionsiׅ  JPLCartoIFDiJ  IPLABi؅  rL  i  WB_GRGBLevelsi  LeafData9  r=  :  r>  ;  
MM_UnknowniI  ImageResourcesR  MM_UserBlockl  r  i  ExifTagis  InterColorProfilex  rE  z  rF  i{  	FEI_TITANi  FXExtensionsi  MultiProfilesi  
SharedDatai  
T88Optionsi  MarCCDi  
ImageLayeri  rA  鰇  GeoDoubleParamsTagrE  GeoAsciiParamsTagi  JBIGOptionsi  PIXTIFFi"  ExposureProgrami$  SpectralSensitivity%  GPSTagi'  ISOSpeedRatingsi(  OECFi)  	Interlacei*  TimeZoneOffseti+  SelfTimerModei0  SensitivityTypei1  StandardOutputSensitivityi2  RecommendedExposureIndexi3  ISOSpeedi4  ISOSpeedLatitudeyyyi5  ISOSpeedLatitudezzzi\  HylaFAXFaxRecvParamsi]  HylaFAXFaxSubAddressi^  HylaFAXFaxRecvTimei_  FaxDcsiq  FedexEDRi  
LeafSubIFDi  	Aphelion1i  	Aphelion2i  AphelionInternali   ExifVersioni  DateTimeOriginali  DateTimeDigitizedi	  GooglePlusUploadCodei  
OffsetTimei  OffsetTimeOriginali  OffsetTimeDigitizedi  ComponentsConfigurationi  CompressedBitsPerPixeli  ShutterSpeedValuei  ApertureValuei  BrightnessValuei  ExposureBiasValuei  MaxApertureValuei  SubjectDistancei  MeteringModei  LightSourcei	  Flashi
  FocalLengthi  FlashEnergy_i  SpatialFrequencyResponse_i  Noisei  FocalPlaneXResolutioni  FocalPlaneYResolutioni  FocalPlaneResolutionUniti  ImageNumberi  SecurityClassificationi  ImageHistoryi  SubjectLocationi  ExposureIndexi  TIFFEPStandardIDi  SensingMethodi:  CIP3DataFilei;  	CIP3Sheeti<  CIP3Sidei?  StoNitsi|  	MakerNotei  UserCommenti  
SubsecTimei  SubsecTimeOriginali  SubsecTimeDigitizedi/  MODITexti0  MODIOLEPropertySetStoragei1  MODIPositioningJ  rY  iK  TVIPS1iL  TVIPS2\  ImageSourceDatai   Temperaturei  Humidityi  Pressurei  
WaterDepthi  Accelerationi  CameraElevationAngleiA  MC_IpWinScal餜  MC_IdOld  InteroperabilityTagi  XPTitlei  	XPCommenti  XPAuthori  
XPKeywordsi  	XPSubjecti   FlashpixVersioni  
ColorSpacei  PixelXDimensioni  PixelYDimensioni  RelatedSoundFilei  SamsungRawPointersOffseti  SamsungRawPointersLengthi  SamsungRawByteOrderi  SamsungRawUnknowni  FlashEnergyi  SpatialFrequencyResponsei  Noise_i  FocalPlaneXResolution_i  FocalPlaneYResolution_i  FocalPlaneResolutionUnit_i  ImageNumber_i  SecurityClassification_i  ImageHistory_i  SubjectLocation_i  zExposureIndex_ i  zTIFF-EPStandardIDi  SensingMethod_i   
FileSourcei  	SceneTypei  CFAPattern_i  CustomRenderedi  ExposureModei  WhiteBalancei  DigitalZoomRatioi  FocalLengthIn35mmFilmi  SceneCaptureTypei  GainControli  Contrasti	  
Saturationi
  	Sharpnessi  DeviceSettingDescriptioni  SubjectDistanceRangei   ImageUniqueIDi0  CameraOwnerNamei1  BodySerialNumberi2  LensSpecificationi3  LensMakei4  	LensModeli5  LensSerialNumberi  GDAL_METADATAi  GDAL_NODATAi   Gamma2  rB  i  ExpandSoftwarei  
ExpandLensi¯  
ExpandFilmiï  ExpandFilterLensiį  ExpandScanneriů  ExpandFlashLampi  PixelFormati  Transformationi  Uncompressedi  	ImageTypei  ImageWidth_i  ImageHeight_i  WidthResolutioni  HeightResolutioni  ImageOffseti  ImageByteCounti¼  AlphaOffsetiü  AlphaByteCountiļ  ImageDataDiscardiż  AlphaDataDiscardi'  OceScanjobDescriptioni(  OceApplicationSelectori)  OceIdentificationNumberi*  OceImageLogicCharacteristicsiO  Annotationsp  r  iq  MC_XYPositionir  MC_ZPositionis  MC_XYCalibrationit  MC_LensCharacteristicsiu  MC_ChannelNameiv  MC_ExcitationWavelengthiw  MC_TimeStampx  MC_FramePropertiesi  PrintImageMatchingi?  PCO_RAWis  OriginalFileNamei  USPTO_OriginalContentTypei  USPTO_RotationCodei  CR2CFAPatternr   
DNGVersioni  DNGBackwardVersioni  UniqueCameraModeli  LocalizedCameraModeli  CFAPlaneColori  	CFALayouti  LinearizationTablei  BlackLevelRepeatDimi  
BlackLeveli  BlackLevelDeltaHi  BlackLevelDeltaVi  
WhiteLeveli  DefaultScalei  DefaultCropOrigini   DefaultCropSizei!  ColorMatrix1i"  ColorMatrix2i#  CameraCalibration1i$  CameraCalibration2i%  ReductionMatrix1i&  ReductionMatrix2i'  AnalogBalancei(  AsShotNeutrali)  AsShotWhiteXYi*  BaselineExposurei+  BaselineNoisei,  BaselineSharpnessi-  BayerGreenSpliti.  LinearResponseLimiti/  CameraSerialNumberi0  LensInfoi1  ChromaBlurRadiusi2  AntiAliasStrengthi3  ShadowScalei4  DNGPrivateDatai5  MakerNoteSafetyi@  RawImageSegmentationiZ  CalibrationIlluminant1i[  CalibrationIlluminant2i\  BestQualityScalei]  RawDataUniqueIDi`  AliasLayerMetadatai  OriginalRawFileNamei  OriginalRawFileDatai  
ActiveAreai  MaskedAreasi  AsShotICCProfilei  AsShotPreProfileMatrixi  CurrentICCProfilei  CurrentPreProfileMatrix  r    r9  i  rP  i  ColorimetricReferencei  SRawTypei  PanasonicTitlei  PanasonicTitle2i  CameraCalibrationSignaturei  ProfileCalibrationSignaturei  
ProfileIFDi  AsShotProfileNamei  NoiseReductionAppliedi  ProfileNamei  ProfileHueSatMapDimsi  ProfileHueSatMapData1i  ProfileHueSatMapData2i  ProfileToneCurvei  ProfileEmbedPolicyi  ProfileCopyrighti  ForwardMatrix1i  ForwardMatrix2i  PreviewApplicationNamei  PreviewApplicationVersioni  PreviewSettingsNamei  PreviewSettingsDigesti  PreviewColorSpacei  PreviewDateTimei  RawImageDigesti  OriginalRawFileDigesti  SubTileBlockSizei  RowInterleaveFactori%  ProfileLookTableDimsi&  ProfileLookTableDatai@  OpcodeList1iA  OpcodeList2iN  OpcodeList3iO  	FibicsXMLia  NoiseProfileic  	TimeCodesid  	FrameRateir  TStopi  ReelNamei  OriginalDefaultFinalSizei  OriginalBestQualitySizei  OriginalDefaultCropSizei  CameraLabeli  ProfileHueSatMapEncodingi  ProfileLookTableEncodingi  BaselineExposureOffseti  DefaultBlackRenderi  NewRawImageDigesti  RawToPreviewGaini  DefaultUserCropre  PaddingOffsetSchemaFlexXML	PerSample)  i  i  i  i  r   r   r"   r    rP  z	TIFF.TAGS  s$   k	
$k	
!k	
 k	
 	k	

 k	
 k	
 k	
 ,k	
 k	
 k	
 k	
 k	
 k	
 #k	
 k	
  !k	
" #k	
 k	
$ %k	
& "'k	
( )k	
* "+k	
, !-k	
. !/k	
0 1k	
2 3k	
4 &5k	
6 7k	
8 9k	
: ;k	
< =k	
> !?k	
@ #Ak	
B $Ck	
D Ek	
 k	
 k	
F Gk	
H !Ik	
J Kk	
L $Mk	
N #Ok	
P Qk	
R Sk	
T Uk	
V Wk	
X Yk	
Z [k	
\ (]k	
^ _k	
` ak	
b ck	
d ek	
f gk	
 k	
 k	
h !ik	
j kk	
l mk	
n )ok	
p qk	
r sk	
t uk	
v wk	
x yk	
z {k	
| }k	
~ k	
@ "Ak	
B "Ck	
D Ek	
F Gk	
H !Ik	
 k	
 k	
J !Kk	
L Mk	
N Ok	
P Qk	
R &Sk	
T Uk	
V Wk	
X Yk	
Z [k	
\ ]k	
^ _k	
` $ak	
b ck	
d ek	
f gk	
h (ik	
j .kk	
 k	
 k	
l &mk	
n )ok	
p &qk	
r sk	
t uk	
v wk	
x $yk	
z #{k	
| #}k	
~ &k	
@ !Ak	
B Ck	
D Ek	
F 'Gk	
H &Ik	
J Kk	
L &Mk	
 k	
 k	
N )Ok	
P $Qk	
R %Sk	
T )Uk	
V &Wk	
X -Yk	
Z $[k	
\ ']k	
^ #_k	
` -ak	
b 'ck	
d %ek	
f "gk	
h )ik	
j -kk	
l +mk	
n &ok	
 k	
 k	
p %qk	
r *sk	
t &uk	
v /wk	
x ,yk	
z "{k	
| "}k	
~ 'k	
@ (Ak	
B 8Ck	
D <Ek	
F <Gk	
H ?Ik	
J $Kk	
L $Mk	
N *Ok	
P *Qk	
 k	
 k	
R <Sk	
T &Uk	
V #Wk	
X )Yk	
Z .[k	
\ =]k	
^ $_k	
` #ak	
b ?ck	
d >ek	
f #gk	
h =ik	
j :kk	
l $mk	
n #ok	
p $qk	
r (sk	
 k	
 k	
t $uk	
v &wk	
x ?yk	
z ,{k	
| *}k	
~ ?k	
@ (Ak	
B )Ck	
D +Ek	
F )Gk	
H /Ik	
J .Kk	
L 'Mk	
N (Ok	
P *Qk	
R )Sk	
T -Uk	
 k	
 k	
V *Wk	
X -Yk	
Z )[k	
\ )]k	
^ *_k	
` ,ak	
b .ck	
d *ek	
f &gk	
h $ik	
j (kk	
l 3mk	
n /ok	
p .qk	
r .sk	
t +uk	
v 'wk	
 k	
 k	
x *yk	
z ,{k	
| #}k	
~ %k	
@ <Ak	
B ;Ck	
D ?Ek	
F $Gk	
H %Ik	
J ;Kk	
L ?Mk	
N ?Ok	
P %Qk	
R $Sk	
T )Uk	
V 2Wk	
X )Yk	
 k	
 k	
\ 9]k	
^ :_k	
` #ak	
b :ck	
d :ek	
f )gk	
h )ik	
j &kk	
l 'mk	
n :ok	
p :qk	
r <sk	
t ;uk	
v #wk	
x $yk	
z ?{k	
| %}k	
 k	
 k	
~ )k	
@ (Ak	
B (Ck	
D 8Ek	
F (Gk	
H <Ik	
J >Kk	
L :Mk	
N >Ok	
P 9Qk	
R ;Sk	
T ;Uk	
V >Wk	
X >Yk	
Z ;[k	
\ >]k	
^ <_k	
 k	
 k	
` <ak	
b =ck	
d 'ek	
f =gk	
h #ik	
j 9kk	
l 9mk	
n 9ok	
p 9qk	
r 9sk	
t 'uk	
v )wk	
x ,yk	
z ({k	
| >}k	
~ %k	
@ <Ak	
 k	
 k	
B 6Ck	
D ?Ek	
F ;Gk	
H ?Ik	
J %Kk	
L -Mk	
N <Ok	
P (Qk	
R -Sk	
T $Uk	
V )Wk	
X (Yk	
Z *[k	
\ *]k	
^ 9_k	
` ?ak	
b #ck	
 k	
 k	
d 8ek	
f ;gk	
h *ik	
j =kk	
l 7mk	
n +ok	
p ?qk	
r :sk	
t ;uk	
v :wk	
x <yk	
z #{k	
| >}k	
~ <k	
@	 9A	k	
B	 &C	k	
D	 :E	k	
 k	
 k	
F	 <G	k	
H	 ;I	k	
J	 >K	k	
L	 ?M	k	
N	 <O	k	
P	 <Q	k	
R	 8S	k	
T	 <U	k	
V	 'W	k	
X	 'Y	k	
Z	 &[	k	
\	 =]	k	
^	 9_	k	
`	 $a	k	
b	 (c	k	
d	 8e	k	
f	 $g	k	
 k	
 k	
h	 6i	k	
j	 ;k	k	
l	 #m	k	
n	 ?o	k	
p	 $q	k	
r	 .s	k	
t	 -u	k	
v	 :w	k	
x	 (y	k	
z	 ({	k	
|	 )}	k	
~	 )	k	
@
 'A
k	
B
 8C
k	
D
 :E
k	
F
 <G
k	
H
 ;I
k	
 k	
 k	
J
 ;K
k	
L
 %M
k	
N
 =O
k	
P
 %Q
k	
R
 &S
k	
T
 )U
k	
V
 <W
k	
X
 'Y
k	
Z
 ([
k	
|
 ,}
k	
~
 +
k	
@ &Ak	
B ?Ck	
D $Ek	
F &Gk	
H %Ik	
J $Kk	
 k	
 k	
L >Mk	
N =Ok	
P 7Qk	
R =Sk	
T >Uk	
V .Wk	
X 7Yk	
Z *[k	
\ *]k	
^ -_k	
` =ak	
b +ck	
d >ek	
f $gk	
h ?ik	
j %kk	
l ?mk	
 k	
 k	
n >ok	
p ;qk	
r :sk	
t 9uk	
v ;wk	
x =yk	
z <{k	
| '}k	
~ (k	
@ :Ak	
B .Ck	
D $Ek	
F 7Gk	
H 8Ik	
J 8Kk	
L $Mk	
N =Ok	
 k	
 k	
P :Qk	
R :Sk	
T <Uk	
V >Wk	
X )Yk	
Z >[k	
\ :]k	
^ (_k	
` 9ak	
b ;ck	
d :ek	
f <gk	
h ;ik	
j $kk	
l <mk	
n $ok	
p $qk	
 k	
 k	
r %sk	
t -uk	
v -wk	
x (yk	
z &{k	
| =}k	
~ -k	
@ 8Ak	
B +Ck	
D +Ek	
F .Gk	
H >Ik	
J ,Kk	
L ?Mk	
N %Ok	
P $Qk	
R &Sk	
 k	
 k	
T #Uk	
V <Wk	
X ;Yk	
Z =[k	
\ #]k	
^ >_k	
` >ak	
b %ck	
d *ek	
f %gk	
h =ik	
j :kk	
l <mk	
n ;ok	
p -qk	
r )sk	
t ?uk	
 k	
 k	
v $wk	
x %yk	
z &{k	
| :}k	
~ ;k	
@ %Ak	
B ?Ck	
D =Ek	
F 7Gk	
H #Ik	
J #Kk	
L <Mk	
N <Ok	
P %Qk	
R ?Sk	
T $Uk	
V =Wk	
 k	
 k	
X #Yk	
Z >[k	
\ ;]k	
^ =_k	
` >ak	
b $ck	
d %ek	
f =gk	
h #ik	
j =kk	
l #mk	
n %ok	
p %qk	
r *sk	
t +uk	
v ,wk	
x 1yk	
 k	
 k	
z ={k	
| 7}k	
~ ?k	
@ >Ak	
B %Ck	
D +Ek	
F #Gk	
H ,Ik	
J >Kk	
L 'Mk	
N 'Ok	
P 9Qk	
R %Sk	
T .Uk	
V 'Wk	
X ?Yk	
Z <[k	
 k	
 k	
\ ']k	
^ &_k	
` )ak	
b ?ck	
d ;ek	
f 'gk	
h (ik	
j <kk	
l %mk	
n %ok	
p <qk	
r >sk	
t &uk	
v $wk	
x >yk	
z >{k	
| '}k	
 k	
 k	
~ 'k	
@ %Ak	
B %Ck	
D ?Ek	
F ?Gk	
H ?Ik	
J %Kk	
L ?Mk	
N &Ok	
P $Qk	
R (Sk	
T 'Uk	
V :Wk	
X %Yk	
Z &[k	
\ =]k	
^ #_k	
 k	
 k	
` $ak	
b )ck	
d +ek	
f +gk	
h %ik	
j $kk	
l 'mk	
n (ok	
p (qk	
r <sk	
t =uk	
v %wk	
x +yk	
z &{k	
| ,}k	
~ )k	
@ <Ak	
 k	
 k	
B &Ck	
D *Ek	
F :Gk	
H #Ik	
J $Kk	
L /Mk	
N 0Ok	
P <Qk	
R &Sk	
T *Uk	
V =Wk	
X )Yk	
Z *[k	
\ *]k	
^ %_k	
` 'ak	
b %ck	
 k	
 k	
d #ek	
f #gk	
h +ik	
j .kk	
l (mk	
n *ok	
p &qk	
r $sk	
t #uk	
v *wk	
x %yk	
z ({k	
| )}k	
~ )k	
@ =Ak	
B =Ck	
D =Ek	
 k	
 k	
F ;Gk	
H >Ik	
J ;Kk	
L ;Mk	
N 7Ok	
P :Qk	
R -Sk	
T ,Uk	
V ,Wk	
X =Yk	
Z -[k	
\ -]k	
^ +_k	
` 'ak	
b &ck	
d %ek	
f $gk	
 k	
h *!& Uk	
 k	
 k	
 k		
r"   c                  R    d t           j                                        D             S )Nc                     i | ]\  }}||	S r   r   )r   r1  r  s      r    
<dictcomp>z"TIFF.TAG_NAMES.<locals>.<dictcomp>  s    333A1333r"   )rO   rP  r  r   r"   r    r   zTIFF.TAG_NAMES  s"    33!2!23333r"   c                     i dt           dt          dt          dt          dt          dt
          dt          dt          d	t          d
t          dt          dt          dt          dt          dt          dt          dt          t          t          t          t          t          t          t          t           t"          d	S )Nr  rQ  rM  rN  rO  rP  rj  rq  rr  rs  rv  rx  r|  r}  r  r  rW  )	r  r  r*  r2  rm  r  ry  r  r  )read_colormapr  r  read_uic2tagread_uic3tagread_uic4tagread_cz_semread_mm_headerread_mm_stampr  read_cz_lsminforead_fei_metadataread_tvips_headerread_nih_image_header	read_jsonread_exif_ifdread_gps_ifdread_interoperability_ifdr   r"   r    r  zTIFF.TAG_READERS  s   

 :	
 <
 <
 <
 <
 ;
 >
 =
 :
 :
 ?
  $!
" $#
$ $%
& :'
( :)
* ) ,=
 
 
 	
r"   c                       t          d          S )N)r  r  r  r  r  r  r  )	frozensetr   r"   r    r  zTIFF.TAG_TUPLE4  s    >???r"   c                  x    i ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&S )'Nr)  r  r*  r  r7  r<  r'  r  r6  rx  rt  r  r3  rw  r4  r}  r#  r~  ImageDescription1r  r5  r  r?  r{  r%  r  r(  r|  r+  r  r,  r  r8  r  r  r  r  )r2  r-  r.  r   r   r"   r    r  zTIFF.TAG_ATTRIBUTES8  s    
,
=
 _
 =	

 ">
 
 (
 

 
  
 0
 N
 

 
 
  ,!
" N#
$ +&$)
 
 
 	
r"   c                  &   t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j	        t           j
        t           j        t           j        t           j        dS )N)r  rm  rn  ro  rs  rx  r|  r  r  r  r  r  r  )rO   	OFILETYPEr^  rT  
THRESHHOLD	FILLORDERORIENTATIONrY  GRAYRESPONSEUNITrm  COLORRESPONSEUNIT	PREDICTORr  r'  r   r"   r    r  zTIFF.TAG_ENUMQ  s^     !!!"& '!"!
 
 	
r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdZdZdZdS )TIFF.FILETYPE.<locals>.FILETYPEr   r&   r   r   N)rh   rp   rq   	UNDEFINEDREDUCEDIMAGEPAGEMASKr   r"   r    FILETYPEr  h  s"        ILDDDDr"   r  )enumIntFlag)r  s    r    r  zTIFF.FILETYPEg  s5    	 	 	 	 	t| 	 	 	 r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdZdZdZdS )!TIFF.OFILETYPE.<locals>.OFILETYPEr   r&   r   r   N)rh   rp   rq   r  IMAGEr  r  r   r"   r    r  r  r  s"        IELDDDr"   r  r  IntEnum)r  s    r    r  zTIFF.OFILETYPEq  s6    	 	 	 	 	 	 	 	 r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0S )1%TIFF.COMPRESSION.<locals>.COMPRESSIONr&   r   r   r   r   r   r  r   r   r\  c   rn  i  i  i  i  i  i    i)  i  i  i  i  i  i  鲀  i  i  i  ie  it  iu  i  i  i  i  i  i  L  m  n  iu  iv  i]  r7  i  N)2rh   rp   rq   NONECCITTRLECCITT_T4CCITT_T6LZWOJPEGJPEGr   JBIG_BW
JBIG_COLORJPEG_99	KODAK_262NEXTSONY_ARW
PACKED_RAWSAMSUNG_SRWCCIRLEWSAMSUNG_SRW2PACKBITSTHUNDERSCANIT8CTPADIT8LWIT8MPIT8BL	PIXARFILMPIXARLOGDEFLATEDCSAPERIO_JP2000_YCBCAPERIO_JP2000_RGBJBIGSGILOGSGILOG24JPEG2000	NIKON_NEFJBIG2
MDI_BINARYMDI_PROGRESSIVE
MDI_VECTOR
JPEG_LOSSYr   r   OPS_PNG
OPS_JPEGXRr  	KODAK_DCR
PENTAX_PEFr   r"   r    r^  r  {  s        DHHHCEDMGJGIDHJKG LHKHEEEIHGC!& %DFHHIEJ#OJJDDGJGIJJJr"   r^  r  )r^  s    r    r^  zTIFF.COMPRESSIONz  s7    /	 /	 /	 /	 /	$, /	 /	 /	d r"   c                  6     G d dt           j                  } | S )Nc                   F    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdS )%TIFF.PHOTOMETRIC.<locals>.PHOTOMETRICr   r&   r   r   r   r   r   r   r   r\  i#  iL  iM  r  N)rh   rp   rq   rc  rU  rV  rX  r  r  YCBCRCIELABICCLABITULABrW  LOGLLOGLUV
LINEAR_RAWr   r"   r    rT  r
    sT        JJCGDIEFFFCDFJJJr"   rT  r  )rT  s    r    rT  zTIFF.PHOTOMETRIC  s6    	 	 	 	 	$, 	 	 	  r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdZdZdS )#TIFF.THRESHHOLD.<locals>.THRESHHOLDr&   r   r   N)rh   rp   rq   BILEVELHALFTONEERRORDIFFUSEr   r"   r    r  r    s        GHLLLr"   r  r  )r  s    r    r  zTIFF.THRESHHOLD  s6    	 	 	 	 	 	 	 	
 r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdZdS )!TIFF.FILLORDER.<locals>.FILLORDERr&   r   N)rh   rp   rq   MSB2LSBLSB2MSBr   r"   r    r  r    s        GGGGr"   r  r  )r  s    r    r  zTIFF.FILLORDER  s6    	 	 	 	 	 	 	 	 r"   c                  6     G d dt           j                  } | S )Nc                   .    e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
%TIFF.ORIENTATION.<locals>.ORIENTATIONr&   r   r   r   r   r   r  r   N)rh   rp   rq   TOPLEFTTOPRIGHTBOTRIGHTBOTLEFTLEFTTOPRIGHTTOPRIGHTBOTLEFTBOTr   r"   r    r  r    s6        GHHGGHHGGGr"   r  r  )r  s    r    r  zTIFF.ORIENTATION  s6    	 	 	 	 	$, 	 	 	 r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdZdS )'TIFF.PLANARCONFIG.<locals>.PLANARCONFIGr&   r   N)rh   rp   rq   rZ  r[  r   r"   r    rY  r*    s        FHHHr"   rY  r  )rY  s    r    rY  zTIFF.PLANARCONFIG  s6    	 	 	 	 	4< 	 	 	 r"   c                  6     G d dt           j                  } | S )Nc                   "    e Zd ZdZdZdZdZdZdS )/TIFF.GRAYRESPONSEUNIT.<locals>.GRAYRESPONSEUNITr&   r   r   r   r   Nrh   rp   rq   _10S_100S_1000S_10000S_100000Sr   r"   r    r  r-    '        DEFGHHHr"   r  r  )r  s    r    r  zTIFF.GRAYRESPONSEUNIT  s6    	 	 	 	 	t| 	 	 	  r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdS )!TIFF.GROUP4OPT.<locals>.GROUP4OPTr   N)rh   rp   rq   UNCOMPRESSEDr   r"   r    	GROUP4OPTr7    s        LLLr"   r9  r  )r9  s    r    r9  zTIFF.GROUP4OPT  s6    	 	 	 	 	 	 	 	 r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdZdZdS )TIFF.RESUNIT.<locals>.RESUNITr&   r   r   N)rh   rp   rq   r  INCH
CENTIMETERr   r"   r    rm  r<    s        DDJJJr"   rm  r  )rm  s    r    rm  zTIFF.RESUNIT  s5    	 	 	 	 	dl 	 	 	 r"   c                  6     G d dt           j                  } | S )Nc                   "    e Zd ZdZdZdZdZdZdS )1TIFF.COLORRESPONSEUNIT.<locals>.COLORRESPONSEUNITr&   r   r   r   r   Nr.  r   r"   r    r  rA    r4  r"   r  r  )r  s    r    r  zTIFF.COLORRESPONSEUNIT  s6    	 	 	 	 	 	 	 	 ! r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdZdZdS )!TIFF.PREDICTOR.<locals>.PREDICTORr&   r   r   N)rh   rp   rq   r  
HORIZONTALFLOATINGPOINTr   r"   r    r  rD  	  s        DJMMMr"   r  r  )r  s    r    r  zTIFF.PREDICTOR  s6    	 	 	 	 	 	 	 	 r"   c                  6     G d dt           j                  } | S )Nc                       e Zd ZdZdZdZdS )%TIFF.EXTRASAMPLE.<locals>.EXTRASAMPLEr   r&   r   N)rh   rp   rq   UNSPECIFIED
ASSOCALPHA
UNASSALPHAr   r"   r    r  rI    s        KJJJJr"   r  r  )r  s    r    r  zTIFF.EXTRASAMPLE  s6    	 	 	 	 	$, 	 	 	
 r"   c                  6     G d dt           j                  } | S )Nc                   &    e Zd ZdZdZdZdZdZdZdS )'TIFF.SAMPLEFORMAT.<locals>.SAMPLEFORMATr&   r   r   r   r   r   N)	rh   rp   rq   UINTINTIEEEFPVOID
COMPLEXINTCOMPLEXIEEEFPr   r"   r    r'  rO    s,        DCFDJMMMr"   r'  r  )r'  s    r    r'  zTIFF.SAMPLEFORMAT  s6    	 	 	 	 	4< 	 	 	 r"   c                  6     G d dt           j                  } | S )Nc                   Z    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdS )!TIFF.DATATYPES.<locals>.DATATYPESr   r&   r   r   r   r   r   r  r   r   r\  r^  r      r  r  r         N)rh   rp   rq   NOTYPEBYTEASCIISHORTLONGRATIONALSBYTEr  SSHORTSLONG	SRATIONALFLOATDOUBLEr  UNICODECOMPLEXLONG8SLONG8IFD8r   r"   r    	DATATYPESrX  %  sm        FDEEDHEIFEIEFCGGEFDDDr"   rm  r  )rm  s    r    rm  zTIFF.DATATYPES$  s6    	 	 	 	 	 	 	 	* r"   c                  f    i ddddddddd	d
ddddddddddddddddddddddS )Nr&   r  r   1sr   1Hr   1Ir   r;  r   1br  r   1hr   1ir\  2ir^  1fr   1drY  r   1QrZ  1qr[  r   r   r"   r    r  zTIFF.DATA_FORMATS<  s    
t
t
 t	

 t
 t
 t
 t
 t
 t
 
" #
$ %
& '
, -
. /
0 1
 	
r"   c                  "    ddddddddd	d
ddddS )Nr&   r   r   r   r   r   r   r   r\  r^  r   r   rZ  )r   r   r   r   r;  bhr   ru  r!  r  r   qr   r   r"   r    r   zTIFF.DATA_DTYPESY  s:     
 
 	
r"   c                      i ddddddddddddd	dd
dddddddddddddddddddi ddddddddddddddddddddd dd!dd"dd#dd$dd%d&d'd(d)d*d+d,d-d.d/d0dd1	S )2Nr>  r   r  r   )r&   r   )r&   r   )r&   r   )r&   r   )r&   r  )r&   r   )r&   r   r   )r&   r\  )r&   r^  )r&   r   )r&   rY  )r&   r  )r&   r  )r&   r   )r&   rZ  r   )r&   r[  )r&      )r&   r   )r&      )r&   r  )r&      )r&      )r&      )r&      )r&      )r&      )r&      )r&      )r&      )r&   r  )r&   r  r   )r   r   r{  r|  r   r}  rm   r!  r  FD)	)r   r   )r   r  )r   r  )r   r   r   r  )r   r  )r   r  )r   rZ  )r&   r   r   r   r   r   r"   r    r  zTIFF.SAMPLE_DTYPESk  s   ,
C,
C,
 C,
 C	,

 C,
 C,
 C,
 C,
 C,
 S,
 S,
 S,
 S,
 S,
 S,
  S!,
" S#,
 ,
$ S%,
& S',
( S),
* S+,
, S-,
. S/,
0 S1,
2 S3,
4 S5,
6 S7,
8 S9,
: S;,
< S=,
> S?,
@ SA,
B SC,
D CE,
 ,
F W,
 ,
 ,
 ,	
r"   c                  <     G d dt                     }  |             S )Nc                   $    e Zd ZdZd Zd Zd ZdS )$TIFF.COMPESSORS.<locals>.Compressorsz"Delay import compressor functions.c                 J    t           j        dft           j        dfd| _        d S )Nr   )r   r  )zlibr   _compressorsr  s    r    ra   z-TIFF.COMPESSORS.<locals>.Compressors.__init__  s'    )-(:DMSTCU$V$V!!!r"   c                 P   || j         v r| j         |         S |dk    rH	 dd ln-# t          $ r  	 dd lm n# t          $ r t          w xY wY nw xY wfd}|df| j         |<   |dfS |dk    r5	 dd l}n# t          $ r t          w xY w|j        df| j         |<   |j        dfS t          )Nr  r   c                 .                         |           S r   )r   )r   r   lzmas     r    lzma_compresszGTIFF.COMPESSORS.<locals>.Compressors.__getitem__.<locals>.lzma_compress  s    #}}Q///r"   r  r   )r  r  ImportErrorbackports.lzmar   zstdr   )r`   rC  r  r  r  s       @r    r  z0TIFF.COMPESSORS.<locals>.Compressors.__getitem__  s,   $+++,S11%<<+#& + + ++9999999* + + +"*N+ :9+0 0 0 0 0 .;A-=D%c*(!++%<<'#& ' ' '&'-1]A-=D%c*=!++s/   $ 
A6AAAA-A2 2Bc                 :    	 | |          dS # t           $ r Y dS w xY wNTFr   )r`   rC  s     r    __contains__z1TIFF.COMPESSORS.<locals>.Compressors.__contains__  s7    !II4 ! ! ! 55!    
Nrh   rp   rq   rr   ra   r  r  r   r"   r    Compressorsr    sJ        44W W W  :! ! ! ! !r"   r  object)r  s    r    r`  zTIFF.COMPESSORS  s;    (	! (	! (	! (	! (	!& (	! (	! (	!T {}}r"   c                  <     G d dt                     }  |             S )Nc                   $    e Zd ZdZd Zd Zd ZdS )(TIFF.DECOMPESSORS.<locals>.Decompressorsz$Delay import decompressor functions.c                 r    t           t           t          t          j        t          t          j        d| _        d S )N)Nr&   r   r   r  r  )r  r   r  r  decode_packbits_decompressorsr  s    r    ra   z1TIFF.DECOMPESSORS.<locals>.Decompressors.__init__  s-    &#!*?' '###r"   c                    || j         v r| j         |         S |dk    r2	 ddlmm n# t          $ r t
          w xY wdfd	}|| j         |<   |S |dk    rI	 dd l}n-# t          $ r  	 dd lm} n# t          $ r t
          w xY wY nw xY w|j        | j         |<   |j        S |dk    r1	 dd l	}n# t          $ r t
          w xY w|j        | j         |<   |j        S t
          )Nr  r   )jpegjpeg_12c                     |dk    r                     | ||          S |dk    r                    | ||          S t          d          )Nr   r   zbitspersample not supported)decode_jpegdecode_jpeg_12r,   )r   r  bpsr  r  r  s       r    r  zITIFF.DECOMPESSORS.<locals>.Decompressors.__getitem__.<locals>.decode_jpeg  sT    !88#'#3#3Auj#I#II BYY#*#9#9!UJ#O#OO",-J"K"KKr"   r  r  r   )
r  imagecodecsr  r  r  r   r  r  r  r  )r`   rC  r  r  r  r  r  s        @@r    r  z4TIFF.DECOMPESSORS.<locals>.Decompressors.__getitem__  s   $---.s33!88'=========& ' ' '&'L L L L L L L 0;D',&&%<<+#& + + ++9999999* + + +"*N+ :9+
 04D',?*%<<'#& ' ' '&'/3D',?*s>   ) ;A 
B(A/.B/BBB'B, ,B>c                 :    	 | |          dS # t           $ r Y dS w xY wr  r  )r`   items     r    r  z5TIFF.DECOMPESSORS.<locals>.Decompressors.__contains__  s7    !JJ4 ! ! ! 55!r  Nr  r   r"   r    Decompressorsr    sH        66  ' ' 'R! ! ! ! !r"   r  r  )r  s    r    r#  zTIFF.DECOMPESSORS  s;    ;	! ;	! ;	! ;	! ;	!F ;	! ;	! ;	!z }r"   c                  D    t          d                                          S )Nz#shape ndim size dtype axes is_final)r  r  r   r"   r    r  zTIFF.FRAME_ATTRS  s    8>>@@AAAr"   c                       t          d                                           t           fdt          t                    D                       S )Nz<reduced final memmappable contiguous tiled chroma_subsampledc              3   `   K   | ](}|d d         dk    |dd          v|dd          V  )d S )Nr   r{   r   )r   r|   excludes     r    r!   z"TIFF.FILE_FLAGS.<locals>.<genexpr>  sV       
 
AbqbEUNNquG?S?SAabbE?S?S?S?S
 
r"   )r  r  dirr  )r  s   @r    r  zTIFF.FILE_FLAGS  sa    MSSUU
 
  
 
 
 
x==
 
 
 
 
 	
r"   c                  D    t          d                                          S )NzBtif tiff ome.tif lsm stk qptiff pcoraw gel seq svs bif tf8 tf2 btf)r  r  r   r"   r    FILE_EXTENSIONSzTIFF.FILE_EXTENSIONS  s"    **/%''
 
 	
r"   c                  6    d t           j        D             dgz   S )Nc                 F    g | ]}d |                                 z  d|z  fS )z%s filesz*.%sr  )r   r+  s     r    rK  z(TIFF.FILEOPEN_FILTER.<locals>.<listcomp>"  s;     
 
 
9<Z#))++%v|4
 
 
r"   )allfiles*)rO   r  r   r"   r    FILEOPEN_FILTERzTIFF.FILEOPEN_FILTER   s1    
 
@D@T
 
 
  	 r"   c                      i ddddddddd	d
dddddddddddddddddddddd } |                      t          d! |                                 D                                  | S )"NXr  Yr  rB  depthr  sampler   rT   r@  timerM   channelAangler  phaseRry  r   lifetimeElambdaLexposureVeventr   rw  r  mosaicc              3   $   K   | ]\  }}||fV  d S r   r   r   r  r  s      r    r!   z#TIFF.AXES_LABELS.<locals>.<genexpr>:  s*      99DAq!Q999999r"   )rN   dictr  )r  s    r    r  zTIFF.AXES_LABELS&  s    


 
 	

 
 
 
 
 
 
 
 
 
 
 
  !
$ 	D99DJJLL99999:::r"   c                  <    t          t          dd                    S )Nr5  i  )r  rq  r   r"   r    
ANDOR_TAGSzTIFF.ANDOR_TAGS=  s    5t$$%%%r"   c                  f    ddddddddd	d
ddddd} |                      t          j                   | S )N	OwnerNameSerialNumberLensRawFile	Converterr  ExposureShadows
Brightnessr  r  r  
SmoothnessMoireFilter)r7  r9  r;  iL  iM  iN  iQ  iR  iS  iT  iU  iV  iW  iX  )rN   rO   rP  rx  s    r    	EXIF_TAGSzTIFF.EXIF_TAGSA  sU     !! 
 
" 	DIr"   c                      i ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2S )3Nr   GPSVersionIDr&   GPSLatitudeRefr   GPSLatituder   GPSLongitudeRefr   GPSLongituder   GPSAltitudeRefr   GPSAltituder  GPSTimeStampr   GPSSatellitesr   	GPSStatusr\  GPSMeasureModer^  GPSDOPr   GPSSpeedRefrY  GPSSpeedr  GPSTrackRefr  GPSTrackr   GPSImgDirectionRefGPSImgDirectionGPSMapDatumGPSDestLatitudeRefGPSDestLatitudeGPSDestLongitudeRefGPSDestLongitudeGPSDestBearingRefGPSDestBearingGPSDestDistanceRefGPSDestDistanceGPSProcessingMethodGPSAreaInformationGPSDateStampGPSDifferentialGPSHPositioningError)rZ  r[  r  r   r  r  r  r  r  r  r  r  r  r  r  r   r   r"   r    GPS_TAGSzTIFF.GPS_TAGSV  s   !
~!
!
 }!
  	!

 ~!
 !
 }!
 ~!
 !
 {!
  !
 !
 !
 
!
 !
  
!!
" $#!
$ "$!%"# $!%$!&A!
 !
 !
 !	
r"   c                      ddddddS )Nr  r  RelatedImageFileFormatRelatedImageWidthRelatedImageLength)r&   r   r      r   r   r"   r    IOP_TAGSzTIFF.IOP_TAGSz  s     &(*%&
 
 	
r"   c                      i ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdEdIdJdKdLdMdNdOdPdQdRS )SN   GTModelTypeGeoKeyi  GTRasterTypeGeoKeyi  GTCitationGeoKeyi   GeographicTypeGeoKeyi  GeogCitationGeoKeyi  GeogGeodeticDatumGeoKeyi  GeogPrimeMeridianGeoKeyi  GeogLinearUnitsGeoKeyi  GeogLinearUnitSizeGeoKeyi  GeogAngularUnitsGeoKeyi  GeogAngularUnitsSizeGeoKeyi  GeogEllipsoidGeoKeyi	  GeogSemiMajorAxisGeoKeyi
  GeogSemiMinorAxisGeoKeyi  GeogInvFlatteningGeoKeyi  GeogAzimuthUnitsGeoKeyi  GeogPrimeMeridianLongGeoKeyi  GeogTOWGS84GeoKeyi  "ProjLinearUnitsInterpCorrectGeoKeyi   ProjectedCSTypeGeoKeyi  PCSCitationGeoKeyi  ProjectionGeoKeyi  ProjCoordTransGeoKeyi  ProjLinearUnitsGeoKeyi  ProjLinearUnitSizeGeoKeyi  ProjStdParallel1GeoKeyi  ProjStdParallel2GeoKeyi  ProjNatOriginLongGeoKeyi	  ProjNatOriginLatGeoKeyi
  ProjFalseEastingGeoKeyi  ProjFalseNorthingGeoKeyi  ProjFalseOriginLongGeoKeyi  ProjFalseOriginLatGeoKeyi  ProjFalseOriginEastingGeoKeyProjFalseOriginNorthingGeoKeyProjCenterLongGeoKeyProjCenterLatGeoKeyProjCenterEastingGeoKeyProjScaleAtNatOriginGeoKeyProjScaleAtCenterGeoKeyProjAzimuthAngleGeoKeyProjStraightVertPoleLongGeoKeyProjRectifiedGridAngleGeoKeyVerticalCSTypeGeoKeyVerticalCitationGeoKeyVerticalDatumGeoKeyVerticalUnitsGeoKey)i  i  i  i  i  i  i  i  i  i  r  r	  r	  i  r   r   r"   r    rf  zTIFF.GEO_KEYS  s   1
%1
&1
 $1
 (	1

 &1
 +1
 +1
 )1
 ,1
 *1
 .1
 '1
 +1
 +1
 +1
  *!1
" /#1
 1
$ %%1
& 6'1
( ))1
* %+1
, $-1
. (/1
0 )11
2 ,31
4 *51
6 *71
8 +91
: *;1
< *=1
> +?1
@ -A1
B ,C1
D 0E1
 1
F 2('+1.+*20(*''a1
 1
 1
 1	
r"   c                      	 ddl m}  n8# t          t          f$ r$ 	 ddl m}  n# t          t          f$ r i } Y nw xY wY nw xY w| S )Nr&   rg  r   )tifffile_geodbrg  r  r,   r@	  s    r    rg  zTIFF.GEO_CODES  s    	1111111Z( 	 	 	4444444,   				
 s$   	 >">8>8>>c                  
    g dS )N):)MagicNumberu4)StructureSizei4)
DimensionXrF	  )
DimensionYrF	  )
DimensionZrF	  )DimensionChannelsrF	  )DimensionTimerF	  )r4  rF	  )
ThumbnailXrF	  )
ThumbnailYrF	  )
VoxelSizeXf8)
VoxelSizeYrO	  )
VoxelSizeZrO	  )OriginXrO	  )OriginYrO	  )OriginZrO	  )r  u2)SpectralScanrU	  )
TypeOfDatarD	  )OffsetVectorOverlayrD	  )OffsetInputLutrD	  )OffsetOutputLutrD	  )OffsetChannelColorsrD	  )TimeIntervallrO	  )OffsetChannelDataTypesrD	  )OffsetScanInformationrD	  )OffsetKsDatarD	  )OffsetTimeStampsrD	  )OffsetEventListrD	  )	OffsetRoirD	  )OffsetBleachRoirD	  )OffsetNextRecordingrD	  )DisplayAspectXrO	  )DisplayAspectYrO	  )DisplayAspectZrO	  )DisplayAspectTimerO	  )OffsetMeanOfRoisOverlayrD	  )OffsetTopoIsolineOverlayrD	  )OffsetTopoProfileOverlayrD	  )OffsetLinescanOverlayrD	  )ToolbarFlagsrD	  )OffsetChannelWavelengthrD	  )OffsetChannelFactorsrD	  )ObjectiveSphereCorrectionrO	  )OffsetUnmixParametersrD	  )OffsetAcquisitionParametersrD	  )OffsetCharacteristicsrD	  )OffsetPaletterD	  )TimeDifferenceXrO	  )TimeDifferenceYrO	  )TimeDifferenceZrO	  )InternalUse1rD	  )r  rF	  )r  rF	  )DimensionsReserved16i4)OffsetTilePositionsrD	  )r,  9u4)OffsetPositionsrD	  r   r   r"   r    r  zTIFF.CZ_LSMINFO  s    >
 >
 >
 >	
r"   c            	          i dt           dt          dt          dt          dt          dt          dd dd d	d d
d dd dd dd dd dd dd dd d d d d d d d dS )NScanInformation
TimeStamps	EventListChannelColors	PositionsTilePositionsVectorOverlayInputLut	OutputLutr\	  ChannelDataTypesKsDataRoi	BleachRoiNextRecordingMeanOfRoisOverlayTopoIsolineOverlay)TopoProfileOverlayChannelWavelengthSphereCorrectionChannelFactorsUnmixParametersAcquisitionParametersCharacteristics)read_lsm_scaninforead_lsm_timestampsread_lsm_eventlistread_lsm_channelcolorsread_lsm_floatpairsr   r"   r    CZ_LSMINFO_READERSzTIFF.CZ_LSMINFO_READERS  s    
0
-
 +
 3	

 ,
 0
 T
 
 
 T
 
 d
 4
 
 T
   !
" !$#
$ #'!% $"#%)#1
 
 
 	
r"   c                      ddddddddddddS )NXYZCTXYTCZXYZTCXYCTZXYCZT)r   r&   r   r   r   r   r   r  r   r   r\  r   r   r"   r    r  zTIFF.CZ_LSMINFO_SCANTYPE   s4     
 
 	
r"   c                      ddddddddS )	NrG	  rH	  rI	  rJ	  rK	  r  r  )r  r  rB  rM   r@  r  r  r   r   r"   r    r  zTIFF.CZ_LSMINFO_DIMENSIONS0  s(     $ 
 
 	
r"   c                      dddddS )Nzvarying data typesz8 bit unsigned integerz12 bit unsigned integerz32 bit float)r   r&   r   r   r   r   r"   r    CZ_LSMINFO_DATATYPESzTIFF.CZ_LSMINFO_DATATYPES<  s     $'(	
 
 	
r"   c                      dddddS )NzOriginal scan datazCalculated dataz3D reconstructionzTopography height map)r   r&   r   r   r   r   r"   r    CZ_LSMINFO_TYPEOFDATAzTIFF.CZ_LSMINFO_TYPEOFDATAE  s     $ "&	
 
 	
r"   c            	          ddddddddd	S )
NTracksLasersDetectionChannelsIlluminationChannelsBeamSplittersDataChannelsTimersMarkers)i    i   0i   `l        l      @ l        i   i   r   r   r"   r    CZ_LSMINFO_SCANINFO_ARRAYSzTIFF.CZ_LSMINFO_SCANINFO_ARRAYSN  s)      +.'& !	
 	
 		
r"   c            	          ddddddddd	S )
NTrackLaserDetectionChannelIlluminationChannelBeamSplitterDataChannelTimerMarker)i   @i   Pi   pl        l      ` l        i   i   r   r   r"   r    CZ_LSMINFO_SCANINFO_STRUCTSz TIFF.CZ_LSMINFO_SCANINFO_STRUCTSZ  s+      *-&% 

 

 
	
r"   c                  Z   i ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDi dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfi dgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddÓddœddǓddɓdd˓i dd͓ddϓddѓddӓddՓddדddٓddۓddݓddߓddddddddddddddi dddddddddddddddddddddd ddddddddd	d
ddi dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,i d-dd.dd/dd0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKi dLdMdNdOdPddQddRdSdTddUddVddWdXdYddZdd[d\d]d^d_dd`ddaddbdS (c  Ni  r  i  rk  i  Notesi  	Objectivei  ProcessingSummaryi  SpecialScanModei  r  i  ScanModei	  NumberOfStacksi
  LinesPerPlanei  SamplesPerLinei  PlanesPerVolumei  ImagesWidthi  ImagesHeighti  ImagesNumberPlanesi  ImagesNumberStacksi  ImagesNumberChannelsi  LinscanXySizei  ScanDirectioni  
TimeSeriesi  OriginalScanDatai  ZoomXi  ZoomYi  ZoomZi  Sample0Xi  Sample0Yi  Sample0Zi  SampleSpacingi  LineSpacingi  PlaneSpacingi  
PlaneWidthi   PlaneHeighti!  VolumeDepthi#  Nutationi4  Rotationi5  
Precessioni6  Sample0timei7  StartScanTriggerIni8  StartScanTriggerOuti9  StartScanEventi@  StartScanTimeiA  StopScanTriggerIniB  StopScanTriggerOutiC  StopScanEventiD  StopScanTimeiE  UseRoisiF  UseReducedMemoryRoisiG  UseriH  UseBcCorrectioniI  PositionBcCorrection1iP  PositionBcCorrection2iQ  InterpolationYiR  CameraBinningiS  CameraSupersamplingiT  CameraFrameWidthiU  CameraFrameHeightiV  CameraOffsetXiW  CameraOffsetYiY  	RtBinningiZ  RtFrameWidthi[  RtFrameHeighti\  RtRegionWidthi]  RtRegionHeighti^  	RtOffsetXi_  	RtOffsetYi`  RtZoomia  RtLinePeriodib  Prescanic  ScanDirectionZi  @MultiplexTypei  @MultiplexOrderi  @SamplingModei  @SamplingMethodi  @SamplingNumberi  @Acquirei  @SampleObservationTimei  @TimeBetweenStacksi  @i  @Collimator1Namei  @Collimator1Positioni  @Collimator2Namei  @Collimator2Positioni  @IsBleachTracki  @IsBleachAfterScanNumberi  @BleachScanNumberi  @	TriggerIni  @
TriggerOuti  @IsRatioTracki  @BleachCounti  @SpiCenterWavelengthi  @	PixelTimei!  @CondensorFrontlensi#  @FieldStopValuei$  @IdCondensorAperturei%  @CondensorAperturei&  @IdCondensorRevolveri'  @CondensorFilteri(  @IdTransmissionFilter1i)  @IdTransmission1i0  @IdTransmissionFilter2i1  @IdTransmission2i2  @RepeatBleachi3  @EnableSpotBleachPosi4  @SpotBleachPosxi5  @SpotBleachPosyi6  @SpotBleachPoszi7  @
IdTubelensi8  @IdTubelensPositioni9  @TransmittedLighti:  @ReflectedLighti;  @SimultanGrabAndBleachi<  @BleachPixelTimei  Pi  Pi  PPoweri  pIntegrationModei  pSpecialModei  pDetectorGainFirsti  pDetectorGainLasti  pAmplifierGainFirsti  pAmplifierGainLasti  pAmplifierOffsFirsti  pAmplifierOffsLasti	  pPinholeDiameteri
  pCountingTriggeri  pi  pPointDetectorNamei  pAmplifierNamei  pPinholeNamei  pFilterSetNamei  p
FilterNamei  pIntegratorNamei  pChannelNamei  pDetectorGainBc1i  pDetectorGainBc2i  pAmplifierGainBc1i  pAmplifierGainBc2i  pAmplifierOffsetBc1i   pAmplifierOffsetBc2i!  pSpectralScanChannelsi"  pSpiWavelengthStarti#  pSpiWavelengthStopi&  pDyeNamei'  p	DyeFolderl       l       l       
Wavelengthl       Aquirel       DetchannelNamel       PowerBc1l       PowerBc2l     ` 	FilterSetl     ` Filterl     ` l       l       l       Colorl       
SampleTypel       r7  l       	RatioTypel       RatioTrack1l   	    RatioTrack2l   
    RatioChannel1l       RatioChannel2l       RatioConst1l       RatioConst2l       RatioConst3l       RatioConst4l       RatioConst5l       RatioConst6l       RatioFirstImages1l       RatioFirstImages2l       l       l       Spectruml       i  i  i  Intervali  i  i  ActivationTimei  ActivationNumberi  i  i  i  r   r   r"   r    CZ_LSMINFO_SCANINFO_ATTRIBUTESz#TIFF.CZ_LSMINFO_SCANINFO_ATTRIBUTESg  s   E
E
 E
 	E

 E
 +E
 )E
 
E
 
E
 (E
 E
 (E
 )E
 E
 E
  ,!E
" ,#E
$ .%E
 E
& 'E
( )E
* +E
, *-E
. /E
0 1E
2 3E
4 
5E
6 
7E
8 
9E
: ;E
< =E
> ?E
@ AE
B CE
D EE
F 
GE
 E
 E
H 
IE
J KE
L ME
N ,OE
P -QE
R (SE
T UE
V +WE
X ,YE
Z [E
\ ]E
^ 	_E
` .aE
b cE
d )eE
f /gE
h /iE
 E
 E
j (kE
l mE
n -oE
p *qE
r +sE
t uE
v wE
x yE
z {E
| }E
~ E
@ (AE
B CE
D EE
F GE
H IE
J 	KE
 E
 E
L (ME
P QE
R (SE
T UE
V (WE
X (YE
Z 	[E
\ /]E
^ +_E
` aE
b )cE
d -eE
f )gE
h -iE
j kE
l 1mE
n *oE
 E
 E
p qE
r sE
t uE
v wE
x -yE
z {E
| ,}E
~ (E
@ -AE
B +CE
D -EE
F )GE
H /IE
J )KE
L /ME
N )OE
P QE
 E
 E
R -SE
T (UE
V (WE
X (YE
Z [E
\ ,]E
^ *_E
` (aE
b /cE
d )eE
h iE
j 	kE
l mE
p )qE
r sE
t +uE
v *wE
 E
 E
x ,yE
z +{E
| ,}E
~ +E
@ )AE
B )CE
D 	EE
F +GE
H IE
J KE
L ME
N OE
P (QE
R SE
T )UE
V )WE
X *YE
 E
 E
Z *[E
\ ,]E
^ ,_E
` .aE
b ,cE
d +eE
f 	gE
h iE
l mE
n oE
p qE
r sE
t (uE
v 
wE
x 
yE
| }E
~ E
 E
 E
@ AE
D EE
F 	GE
H IE
J KE
L ME
N OE
P QE
R SE
T UE
V WE
X YE
Z [E
\ ]E
^ _E
` aE
b cE
 E
 E
d +eE
f +gE
h 	iE
j kE
l 
mE
n 	oE
r sE
t uE
v 
wE
x yE
z {E
| (}E
~ *E
B CE
D EE
F GE
H IE
 E
 E	
r"   c                      g ddddddddd	d
ddddddddddgfdddgfddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0S )1N)FileIDa8)nLinesi2)PixelsPerLinerd
  )Versionrd
  )
OldLutModerd
  )
OldnColorsrd
  )Colorsu1r  )OldColorStartrd
  )
ColorWidthrd
  )ExtraColorsrU	  )r   r   )nExtraColorsrd
  )ForegroundIndexrd
  )BackgroundIndexrd
  )XScalerO	  )Unused2rd
  )Unused3rd
  )UnitsIDrd
  p1)r   rd
  )rt  rd
  p2)CurveFitTyperd
  )nCoefficientsrd
  )CoeffrO	  r   )UMsizerj
  )UMa15)UnusedBooleanrj
  )	BinaryPicb1)
SliceStartrd
  )SliceEndrd
  )ScaleMagnificationf4)nSlicesrd
  )SliceSpacingr
  )CurrentSlicerd
  )FrameIntervalr
  )PixelAspectRatior
  )
ColorStartrd
  )ColorEndrd
  )nColorsrd
  )Fill13u2)Fill2r
  )Tablerj
  )LutModerj
  )InvertedTabler
  )ZeroClipr
  )	XUnitSizerj
  )XUnita11)	StackTyperd
  r   r   r"   r    NIH_IMAGE_HEADERzTIFF.NIH_IMAGE_HEADER/  s   0
0
0
 $0
 	0

 !0
 !0
 &0
 $0
 !0
 *0
 #0
 &0
 &0
 0
 0
  !0
" #0
$ K-.%0
& K-.'0
( #)0
* $+0
, -0
. /0
0 10
2 $30
4  50
6 !70
8 90
: );0
< =0
> #?0
@ #A0
B $C0
D 'E0
F !G0
H I0
J K0
L M0
N O0
P Q0
R S0
T $U0
V W0
X  Y0
Z [0
\  ]0
 0	
r"   c                      dS )N)
CustomTableAppleDefaultPseudo20Pseudo32RainbowFire1Fire2IceGraysr[
  r   r   r"   r    NIH_COLORTABLE_TYPEzTIFF.NIH_COLORTABLE_TYPEb  s    
 
r"   c                      dS )N)PseudoColorOldAppleDefaultOldSpectrum	GrayScaleColorLutCustomGrayscaler   r   r"   r    NIH_LUTMODE_TYPEzTIFF.NIH_LUTMODE_TYPEp  s    
 
r"   c                      dS )N)StraightLinePoly2Poly3Poly4Poly5ExpoFitPowerFitLogFit
RodbardFit	SpareFit1UncalibratedUncalibratedODr   r   r"   r    NIH_CURVEFIT_TYPEzTIFF.NIH_CURVEFIT_TYPEz  s    
 
r"   c                      dS )N)
NanometersMicrometersMillimetersCentimetersMeters
KilometersInchesFeetMilesr  
OtherUnitsr   r   r"   r    NIH_UNITS_TYPEzTIFF.NIH_UNITS_TYPE  s    
 
r"   c                      dS )N)VolumeStackRGBStack
MovieStackHSVStackr   r   r"   r    NIH_STACKTYPE_TYPEzTIFF.NIH_STACKTYPE_TYPE  s    DDr"   c                  
    g dS )N)*)rf
  rF	  )	CommentV1a80)HighTensionrF	  )SphericalAberrationrF	  )IlluminationAperturerF	  )MagnificationrF	  )PostMagnificationrF	  )r  rF	  )DefocusrF	  )AstigmatismrF	  )AstigmatismDirectionrF	  )BiprismVoltagerF	  )SpecimenTiltAnglerF	  )SpecimenTiltDirectionrF	  )IlluminationTiltDirectionrF	  )IlluminationTiltAnglerF	  )	ImageModerF	  )EnergySpreadrF	  )ChromaticAberrationrF	  )ShutterTyperF	  )DefocusSpreadrF	  )	CcdNumberrF	  )CcdSizerF	  )	OffsetXV1rF	  )	OffsetYV1rF	  )PhysicalPixelSizerF	  )BinningrF	  )ReadoutSpeedrF	  )GainV1rF	  )SensitivityV1rF	  )ExposureTimeV1rF	  )FlatCorrectedrF	  )DeadPxCorrectedrF	  )	ImageMeanrF	  )ImageStdrF	  )DisplacementXrF	  )DisplacementYrF	  )DateV1rF	  )TimeV1rF	  )ImageMinrF	  )ImageMaxrF	  )ImageStatisticsQualityrF	  r   r   r"   r    TVIPS_HEADER_V1zTIFF.TVIPS_HEADER_V1  s    +
 +
 +
 +	
r"   c                  
    g dS )N)6)rP  V160)ImageFolderr
  )
ImageSizeXrF	  )
ImageSizeYrF	  )
ImageSizeZrF	  )
ImageSizeErF	  )ImageDataTyperF	  )DaterF	  )TimerF	  )CommentV1024)r  r  )Scaling16f4)ImageStatistics16c16)r  rF	  )ImageDisplaTyperF	  )
PixelSizeXr
  )
PixelSizeYr
  )ImageDistanceZr
  )ImageDistanceEr
  )	ImageMisc32f4)TemTyper
  )TemHighTensionr
  )TemAberrationsr  )	TemEnergyr  )TemModerF	  )TemMagnificationr
  )TemMagnificationCorrectionr
  )r
  r
  )TemStageTyperF	  )TemStagePosition5f4)TemImageShift2f4)TemBeamShiftr  )TemBeamTiltr  )TilingParameters7f4)TemIllumination3f4)
TemShutterrF	  )TemMiscr  )
CameraTyper
  )PhysicalPixelSizeXr
  )PhysicalPixelSizeYr
  )OffsetXrF	  )OffsetYrF	  )BinningXrF	  )BinningYrF	  )rA  r
  )Gainr
  )ReadoutRater
  )FlatfieldDescriptionr
  )Sensitivityr
  )Doser
  )CamMiscr  )FeiMicroscopeInformationr  )FeiSpecimenInformationr  )MagicrD	  r   r   r"   r    TVIPS_HEADER_V2zTIFF.TVIPS_HEADER_V2  s    8
 8
 8
 8	
r"   c                  F    g d} dddddddd	d
d| dfdddddddddd| fdddgS )N))r  a16)r  rF	  )OriginrO	  )
ResolutionrO	  )Unita64)
HeaderFlagrd
  )r  rj
  )rP  a257)
OffsetDatarD	  )PaletteSizerF	  )OffsetPalette0rD	  )OffsetPalette1rD	  )CommentSizerF	  )OffsetCommentrD	  rL  r\  )OffsetPositionrD	  )MapTyperd
  )MapMinrO	  )MapMaxrO	  )MinValuerO	  )MaxValuerO	  )	OffsetMaprD	  )r  rO	  )OffsetrO	  GrayChannel)OffsetThumbnailrD	  )
VoiceFieldrF	  )OffsetVoiceFieldrD	  r   )MM_DIMENSIONs    r    	MM_HEADERzTIFF.MM_HEADER  sp    
 
 
 !! !$$!#<,$L)% &/
 	
r"   c                      ddddddddddd	
S )
Nr  r  rB  r@  rM   r  r  r  )
r  r  rB  r@  CH
WAVELENGTHTIMEr  EVENTEXPOSUREr   r   r"   r    rN  zTIFF.MM_DIMENSIONS)  s1     
 
 	
r"   c                     ddl m}  g dt          fdt          fdt          fdt          fd| fd| fd	t          fd
t          fdt          fdt          fddt          fdt          fdt          fdt          fdt          fdt          fdt          fdt          fddd| fd| fd| fd| fdt          fdt          fdt          fdd d!d"d#d$d%d&d't
          fd(d)| fd*| fd+d,d-d.d/d0d1d2t          fd3d4t          fd5d6t          fd7| fd8| fd9t          fd:t          fd;t          fd<| fd=| fd>t          fd?t          fd@t          fdA| fdB| fdCt          fdDt          fS )ENr   r  	AutoScaleMinScaleMaxScaleSpatialCalibrationXCalibrationYCalibrationCalibrationUnitsr  ThreshStateThreshStateRed)tagid_10NThreshStateGreenThreshStateBlueThreshStateLoThreshStateHiZoom
CreateTimeLastSavedTimecurrentBuffer)grayFitN)grayPointCountNgrayXgrayYgrayMingrayMaxgrayUnitNameStandardLUT
wavelength)StagePosition
(%i,2,2)u4)CameraChipOffsetrq  )OverlayMaskN)OverlayCompressN)OverlayN)SpecialOverlayMaskN)SpecialOverlayCompressN)SpecialOverlayNImageProperty)
StageLabel%ipAutoScaleLoInfoAutoScaleHiInfo)	AbsoluteZz(%i,2)u4)AbsoluteZValidz(%i,)u4)r  r   )GammaRedr   )
GammaGreenr   )	GammaBluer   )	CameraBinr;  NewLUT)ImagePropertyExNPlaneProperty)UserLutTablez	(256,3)u1RedAutoScaleInfoRedAutoScaleLoInfoRedAutoScaleHiInfoRedMinScaleInfoRedMaxScaleInfoGreenAutoScaleInfoGreenAutoScaleLoInfoGreenAutoScaleHiInfoGreenMinScaleInfoGreenMaxScaleInfoBlueAutoScaleInfoBlueAutoScaleLoInfoBlueAutoScaleHiInfoBlueMinScaleInfoBlueMaxScaleInfo)r  r  r   r   r+  read_uic_image_propertyr  s    r    UIC_TAGSzTIFF.UIC_TAGS8  s    	'&&&&&D
#D
D
 D
 "3'	D

 X&D
 X&D
  %D
 SMD
 C D
 s#D
 D
  %D
 $D
 c"D
 c"D
  SM!D
" ?+#D
$ o.%D
& c"'D
( )D
* %+D
, h-D
. h/D
0 !1D
2 !3D
4 S!5D
6 C 7D
8 39D
: ,;D
< /=D
> "?D
@ &AD
B CD
D )ED
F -GD
H %ID
J 56KD
L "MD
N )OD
P )QD
R &SD
T *UD
V WD
X YD
Z  [D
\ ]D
^  _D
` sOaD
b &cD
d c"eD
f *gD
h  %iD
j "8,kD
l "8,mD
n $oD
p $qD
r "3'sD
t $X.uD
v $X.wD
x !#&yD
z !#&{D
| !#&}D
~ #H-D
@ #H-AD
B  %CD
D  %ED
 D	
r"   c                     i dt          dd           gt          fdddgt          fddgt          fddgt          fddgt          fd	dgt          fd
dgt          fddgt          fdddgt          fddgt          fddgt          fddgt          fddgt          fddgt          fddgt          fdddgt          fddgt          fi ddgt          fdddgt          fddgt          fddgt          fddgt          fddgt          fddgt          fddgt          fddgt          fddgt          fd dgt          fd!dgt          fd"dgt          fd#dgt          fd$t          dd           gt          fd%dgt          fd&dgt          fdgt          fdgt          fdgt          fdgt          fd'S )(NDetectorr&   
Pixel_sizer   Siliconr   Exposure_timeExposure_periodTauCount_cutoffThreshold_settingGain_settingr   N_excluded_pixelsExcluded_pixels
Flat_field	Trim_file
Image_pathrE
  Energy_rangeDetector_distanceDetector_VoffsetBeam_xyFluxFilter_transmissionStart_angleAngle_incrementDetector_2thetaPolarizationAlphaKappaPhiPhi_incrementChiChi_incrementOscillation_axisN_oscillationsStart_position)Position_incrementShutter_timeOmegaOmega_increment)r  r   r  r   r   r"   r    PILATUS_HEADERzTIFF.PILATUS_HEADER  s   (
%4..)3/(
Aq65/(
 U|(
 qc5\	(

 U|(
 QC<(
 aS#J(
  1#u(
 aVSM(
  1#s(
 Sz(
 A3*(
 1#s(
 A3*(
  A3,!(
" aVUO#(
$  1#u%(
 (
& !e'(
( A)(
* aS#J+(
, "QC<-(
. QC</(
0 U|1(
2 U|3(
4 aS%L5(
6 qc5\7(
8 qc5\9(
: QC<;(
< qc5\=(
> QC<?(
@ qc5\A(
B %4..!13 7C(
D sCjE(
F sElG(
 (
H %&3,S%Lc5\!"U|O(
 (
 (
 (	
r"   c                      	 dS )Ns    @ `P0pH(hX8xD$dT4tL,l\<|B"bR2r
J*jZ:zF&fV6vN.n^>~A!aQ1q	I)iY9yE%eU5uM-m]=}C#cS3sK+k[;{G'gW7wO/o_?r   r   r"   r    REVERSE_BITORDER_BYTESzTIFF.REVERSE_BITORDER_BYTES  s    !	
 	
r"   c                  B    t          j        t          j        d          S )Nr   r   )r<   r  rO   r  r   r"   r    REVERSE_BITORDER_ARRAYzTIFF.REVERSE_BITORDER_ARRAY  s     ;7KKKKr"   c                      dd l } | j        S rA  )mmaprP   )r  s    r    rP   zTIFF.ALLOCATIONGRANULARITY  s    ))r"   N)Brh   rp   rq   rr   rP  r   r  r  r  r  r  r  r^  rT  r  r  r  rY  r  r9  rm  r  r  r  r'  rm  r  r   r  r`  r#  r  r  r  r  r  r  r  r	  r	  rf  rg  r  r	  r  r  r	  r	  r	  r	  r_
  r
  r
  r
  r
  r
  r
  r
  r1  rM  rN  r  r  r  r  rP   r   r"   r    rO   rO     s       ))m	
 m	
 m	
^4 4 4!
 !
 !
F@ @ @
 
 
2
 
 
,    3 3 3j  &                 ! ! !    	 	 	  0
 
 
:
 
 
$.
 .
 .
`- - -^@ @ @DB B B
 
 

 
 
       .& & &  *"
 "
 "
H
 
 
2
 2
 2
h  ?
 ?
 ?
B
 
 
<
 
 
 

 

 


 
 

 
 


 

 


 
 
F
 F
 F
P1
 1
 1
f
 
 

 
 

 
 
 
 
 
E E E-
 -
 -
^9
 9
 9
v!
 !
 !
F
 
 
I
 I
 I
V+
 +
 +
Z
 
 
$L L L* * * * *r"   rO   c                 &	   |dk    r|dz   }d}|dz   }d}	|dz   }
|dz   }n.|dk    r|d	z   }d}|d	z   }d
}	|dz   }
|dz   }nt          d          |i }|d}g }t          j        }|                                 }t	          |          |k     r	  |||                     |                    d         }|dk    rt          d          n(# t          $ r t          j        d|z             Y nw xY wi }|                     |	|z            }|                                 }d}t          |          D ]} ||
|||dz                      \  }} ||||dz   ||	z                      \  }}||	z  }|
                    |t          |                    }	 t          j        |         }n+# t          $ r t                              d|z            w xY wd||t#          |d                   z  |d         fz  }t          j        |          }||k    s||v r |||          d         }|dk     s|| j        |z
  k    rt                              d|z            |                     |           ||v r||         d         } || ||||          }n|dk    s|dk    r |d         dk    rt+          | ||||          }nu||v s|d         dk    r  |||                     |                    }nEt-          | ||||          }n1|d         dk    s|dk    r|d|         }n |||d|                   }||vr)|t          j        vrt	          |          dk    r|d         }|dk    rx|d         dk    rlt1          |t2                    rW	 t5          t7          |                                                    }n'# t:          $ r t          j        d|z             Y nw xY w|||<   |                    |           |                     |            |||                     |                    d         }|dk    rnL|| j        k    rt          j        d|z             n)|                     |           t	          |          |k     |r|dk    r|d         }|S )z|Read tags from chain of IFDs and return as list of dicts.

    The file handle position must be at a valid IFD header.

    r   r   r   r   r   r   r  r   r   r   r  zinvalid offset sizeNr  r   r  r  r  r  r  r&   zinvalid tag value offset %ir  r   r   r   r  zinvalid page offset %i)r,   r   r  r   r.   r  r@   r   r   rq  rA   r   rO   r  r   r  r  r   r  rH   r%   r  r  r  r(   r   r  r  r  r  r7   )r   r9   r  tagnames
customtagsmaxifdsr  r  r  r  r  r  rZ   r  rU   r  r  rD   r   r  r[   r  r  r  rl   r  r=   r   rH   r  s                                 r    	read_tagsr    sR    Q 3	#o%
&

	q 3	#o%
&

.///
F]FWWYYF
f++

	F;	(:(:;;A>Et|| !<===  	 	 	M;fDEEEE	 www''ggiiu *	 *	A &T%%!)2C-DEEKD%!6*d519uw3N.OPPLE5WE<<c$ii00DH)%0 H H Hmm$>$FGGGH iU1X)>aIIC?3''Dj  DJ$6$6e44Q7A::"'D.!8!8!--(E(NOOO:%%)$/2H$HRE5*MMEEaZZEAII%)s2B2B&r9eUJOOEEX%%rc)9)9"F366EE&r9eUJOOEErc!!UaZZetesE%4%L11:%%$dn*D*Du::??!!HEzzeBi3..:eU3K3K.T%j&7&7&=&=&?&?@@EE) T T TM"Kd"RSSSSST DJJd
bggj&9&9::1=Q;;RWM2V;<<<
G f++

J  'Q,,Ms0   :C !C-,C-F%%(G.N11!OOc                    t          | ||t          j        d          }dD ]+}	 t          ||                   ||<   # t          $ r Y (w xY wd|v ru|d         dd         }	 |dk    r!t          |d         dd                   |d<   n,|dk    r&|d         dd                             d	          |d<   n# t          $ r Y nw xY w|S )
z,Read EXIF tags from file and return as dict.r&   r  )r  r  r  Nr   s   ASCII   s   UNICODE utf-16)r  rO   r  r  r@   r  )r   r9   r=   r  r  exifr  idcodes           r    r  r  6  s   RJJJJD2  	"4:..DJJ 	 	 	D	m$RaR(	---&/]0CABB0G&H&H]##>))&*=&9!""&=&D&DX&N&N]# 	 	 	D	Ks"   =
A
	A
"AB6 6
CCc                 >    t          | ||t          j        d          S )z+Read GPS tags from file and return as dict.r&   r  )r  rO   r	  r   r9   r=   r  r  s        r    r  r  J  s    RJqIIIIr"   c                 2    ddi}t          | |||d          S )z8Read Interoperability tags from file and return as dict.r&   r  r  )r  )r   r9   r=   r  r  	tag_namess         r    r  r  O  s&    +,IRJ	1EEEEr"   c                    |d         dk    rdn
||d         z   }|t          j        |          j        z  }|                     |          }t	          |          |k    r&t          j        dt	          |          |fz             |S )z2Read tag data from file and return as byte string.r   r   r   z failed to read all bytes: %i, %i)r<   r=   r>   r  r.   r   r   r   r9   r=   r  r  rD   s         r    r  r  U  s    9##CCU2Y)>E	U[((E775>>D
4yyE8CIIu;MMNNNKr"   c                 R    |                      |                              d          S )z5Read tag data from file and return as unicode string.r  )r  r  r  s        r    	read_utf8r  _  s     775>>  )))r"   c                 `    |d         dk    rdn
||d         z   }|                      ||          S )z2Read tag data from file and return as numpy array.r   r   r{  r  r  s        r    r  r  d  s6    9##CCU2Y)>E==&&&r"   c                 R    |                      ||d         z   |          }d|_        |S )z7Read ColorMap data from file and return as numpy array.r   )r   r   )r  rE   )r   r9   r=   r  r  cmaps         r    r  r  j  s*    ==U2Y.66DDJKr"   c                     |                      |          }	 t          j        t          t	          |          d                    S # t
          $ r t          j        d|z             Y dS w xY w)z2Read JSON tag data from file and return as object.r  invalid JSON '%s'N)r  jsonloadsunicoder   r,   r   r   r  s         r    r  r  q  sp    775>>D2z')D//7;;<<< 2 2 2)D01111112s   .A !A+*A+c                 l   |                      t          j        |          }t          |          }d |d         D             |d<   |d         }t	          |d                                                   |d         |d         |d         t	          |d	                                                   f|d<   |S )
z9Read FluoView mm_header tag from file and return as dict.r:  c           
          g | ]e}t          |d                                                    |d         |d         |d         t          |d                                                   ffS )r   r&   r   r   r   )r  r  )r   r  s     r    rK  z"read_mm_header.<locals>.<listcomp>~  sk        
1Q4			 	 !A$!adIadOO4I4I4K4KL  r"   rL  rH  r   r&   r   r   r   )r>  rO   rM  recarray2dictr  r  )r   r9   r=   r  r  mmhr  s          r    r  r  z  s    
..9.
=
=C


C \"  C 	MA!A$	!	!	!!A$C Jr"   c                 4    |                      |dz   d          S )zARead FluoView mm_stamp tag from file and return as numpy.ndarray.rO	  r   r  r  s        r    r  r    s    ==T)1---r"   c                    |dv r|dk    sJ i }|dk    rI|                      dd|z                                |d          }d|dddf         |ddd	f         z  i}nw|rut          |          D ]e}t          j        d
|                     d                    d         }	|	dv r|                     d           Jt          | |	|d          \  }
}|||
<   f|S )zuRead MetaMorph STK UIC1Tag from file and return as dict.

    Return empty dictionary if planecount is unknown.

    )r;  rq  r   r;  <u4r   r&  Nr   r&   <Ir   )r  r  %   (   )   Tr  )r  rd  rq  r   r  r  read_uic_tag)r   r9   r=   r  r  
planecountrZ   r   r[   rm  r  rl   s               r    r  r    s    L  Y#%5%5%5%5F}}ua%i0088BBvaaad|fQQQTl:;	 !u 	! 	!AM$

33A6E,,,


&r5*TJJJKD% F4LLMr"   c                    |dk    r|dk    sJ |                      dd|z                                |d          }|dddf         |dddf         z  |dddf         |ddd	f         |ddd
f         |dddf         dS )z8Read MetaMorph STK UIC2Tag from file and return as dict.r;  r   r  r   Nr   r&   r   r   r   r   )r&  r/  r'  r2  r(  r  rd  r   r9   r=   r  r  r   s         r    r  r    s    D==Y#----]]5!j.1199*aHHFAAAqD\F111a4L0aaad|aaad|qqq!tqqq!t  r"   c                     |dk    r|dk    sJ |                      dd|z                                |d          }d|dddf         |dddf         z  iS )	z8Read MetaMorph STK UIC3Tag from file and return as dict.r;  r   r  r   WavelengthsNr   r&   r  r  s         r    r  r    sj    D==Y#----]]5!j.1199*aHHF6!!!Q$<&A,677r"   c                     |dk    r|dk    sJ i }	 t          j        d|                     d                    d         }|dk    rnt          | ||d          \  }}|||<   Q|S )	z8Read MetaMorph STK UIC4Tag from file and return as dict.rq  r   Tz<Hr   r   Fr  )r   r  r  r  )	r   r9   r=   r  r  rZ   rm  r  rl   s	            r    r  r    s    D==Y#----FdBGGAJJ//2A::"2ujGGGet Mr"   c                     d fd	}	 t           j        |         \  }}n# t          $ r d|z   |            fcY S w xY wt           j        d         d         }|rn                                 }|t          dfvrO |            }	|	dk     r*|t
          u r|dfS t          j        d||	fz             ||	fS                      |	           |d	|z   } |            }
n|t          u r |            }
ns||u r |d
          }
|
d         |
d         z  }
nQ|t          u rt           |d
           }
n4|t          u rt                     }
n|t
          u r |            }d|cxk    rdk     rZn nWt          j        d|z                       |                    d         dd         }
t          t          |
                    }
n|rd}
t          j        d|z             nt!          d|z            |dk    rg }
t#          |          D ]} |            }d|cxk    rdk     rnn nkt          j        d|z                       |                    d         dd         }t          t          |                    }|
                    |           |rt          j        d|z             t!          d|z            nd|z   }d|v r||z  }d|v r?                     |d          d         }
|
j        d         d
k    r|
d         |
d         z  }
nUt          j        |                     t          j        |                              }
t-          |
          dk    r|
d         }
|r                     |dz              ||
fS )zgRead a single UIC tag value from file and return tag name and value.

    UIC1Tags use an offset.

    r&   c                     t          j        d| z                      d| z                      }| dk    r|d         n|S )Nz<%iIr   r&   r   )r   r  r  )r  rl   r   s     r    read_intzread_uic_tag.<locals>.read_int  s>    funbgga%i.@.@AA A::uQxx50r"   z_TagId%ir   Nr   r,  z#invalid offset for uic tag '%s': %ir[   r   r   r	  %isr   zcorrupt string in uic tag '%s'zinvalid string size: %ir{  r   z%i(r  ).r&   r   )rO   r  r  r   r   r   r   r   r%   r+  r  r   r  r  r  r   r,   rq  r7   r  rE   r  r.   )r   rm  r  rU   r  r  r=   r  r   offrl   rH   r[   strings   `             r    r  r    s   1 1 1 1 1 1.mE*ee . . .E!88::----. }Q"H 	ggiid##(**CQwwC<<8OCtSkQRRRSy GGCLLL}Tz

	#

	(		a58#	/	!	!!-	)	)	)'++	#xzzuM%$,>>qA#2#FEi..//EE 	?EM:TABBBB6=>>>	%z"" 		C 		CA8::DD    5     ut|RWWT]]CCAFssK"9V#4#455V$$$$ C>EFFFF !:T!ABBB		C e5==J&E%<<MM%++A.E{2!##ff5 M%1G1G)H)HIIE5zzQa 
a;s    ;;c                    t          j        d|                     d                    d         }t          j        d|z  |                     |                    d         dd         }t          j        d|                     d                    \  }}|dk    r:t          j        d	|                     d
                    }|d         |d         z  }n_t          j        d|                     d                    d         }t          j        d|z  |                     |                    d         }t          |||          S )z:Read UIC ImagePropertyEx tag from file and return as dict.r   r&   r   r  Nr   z<IBr   IIr   )r  r   rl   )r   r  r  r  )r   rH   r  r   proprl   s         r    r  r  )  s    =bggajj))!,D=rwwt}}55a8"=D-rwwqzz22KE4qyydBGGAJJ//a58#}S"''!**--a0edlBGGDMM::1=Te4444r"   c                 
   |dk    sJ t          j        d|                     d                    \  }}|dvrt          d          |                     dd           |t          j        t          j                  j	        k     rRg }d}t          j        D ]@\  }	}|t          j        |          j	        z  }||k    r n|
                    |	|f           Ant          j        }|                     ||	          }t          |          }t          j                                        D ]\\  }	}
|
|                    d|	z   d          }|dk     r(|                     |           	  |
|           ||	<   M# t          $ r Y Yw xY w|S )z1Read CZ_LSMINFO tag from file and return as dict.r   <IIr   )iLI iLI zinvalid CZ_LSMINFO structureir&   r   r:  NrG  )r   r  r  r,   r%   r<   r=   rO   r  r>   r7   r>  r  r	  r  rA   )r   r9   r=   r  r  magic_numberstructure_sizelsminforH   r  readerrU   s               r    r  r  8  s   #)=

#C#C L.///7888GGBNNNDO44===? 	* 	*KD%EK&&//Dn$$NND%=))))/nnW	n::GG$$G /5577 
 
f>X_a00A::
	"F2JJGDMM 	 	 	D	Ns   $E33
F ?F c                     t          j        d|                     d                    d         }|                     d|          S )z>Read LSM sequence of float pairs from file and return as list.<ir   r   <2f8r  r   r  r  r  r   rH   s     r    r	  r	  ^  8    =rwwqzz**1-D==t=,,,r"   c                     t          j        d|                     d                    d         }|                     d|          S )z0Read LSM positions from file and return as list.r  r   r   r  r  r  r	  s     r    read_lsm_positionsr  d  r
  r"   c                     t          j        d|                     d                    \  }}|dd|z  z   k    rt          j        d           g S |                     d|          S )z2Read LSM time stamps from file and return as list.z<iir   zinvalid LSM TimeStamps blockz<f8r  )r   r  r  r   r   r  )r   rH   r  s      r    r	  r	  j  s`    -rwwqzz22KD%AI4555	==e=,,,r"   c                 t   t          j        d|                     d                    d         }g }|dk    rt          j        d|                     d                    \  }}}t          t	          |                     |dz
                                }|                    |||f           |dz  }|dk    |S )zCRead LSM events from file and return as list of (time, type, text).r  r   r&   r   z<IdIr   )r   r  r  r  r   r7   )r   r  eventsesizeetimeetypeetexts          r    r	  r	  t  s    M%,,Q/EF
!))$mFBGGBKK@@ue)BGGEBJ$7$78899ueU+,,,
	 !))
 Mr"   c                 $   dg g d}|                                  }t          j        d|                     d                    \  }}}}}}||k    rt	          j        d           |S t          |          |d<   |                     ||z              |                     d|dz  	          	                    |df          }	|	
                                |d
<   |                     ||z              |                     ||z
            }
g }t          |
          dk    rpt          j        d|
dd                   d         }|                    t          |
dd|z                                 |
d|z   d         }
t          |
          dk    p||d<   |S )z>Read LSM ChannelColors structure from file and return as dict.F)Monori
  
ColorNamesz<IIIIIIr  z#invalid LSM ChannelColors structurer  r   r   r  ri
  r  Nr   r   r  )r   r   r  r  r   r   r   r%   r  rd  rh  r.   r7   r  )r   rZ   r   rH   ncolorsnnamescoffsetnoffsetmonocolorsbuffernamess               r    r	  r	    s   r<<F
''))C6<m2772;;7 73T7FGWd &;<<<$ZZF6NGGC'M]]7'A+]66>>|LLF}}F8GGC'MWWTG^$$FE
f++//}T6"1":..q1Yva!d(l344555D

# f++// !F<Mr"   c                    i }|g}t           j        }t          j        d|                     d                    d         dk    rt          j        d           |S |                     d           	  |d|                     d	                    \  }}}|d
k    r0t          t          |                     |                              }nZ|dk    r& |d|                     d                    d         }n.|dk    r& |d|                     d                    d         }nd}|t          j        v r1|	                    |           t          j        |         }g }	|	||<   |	}n|t          j
        v r/|	                    |           i }	|	                    |	           |	}nI|t          j        v rt          j        |         }|||<   n#|dk    r|                                }n||d|z  <   |sn}|S )z9Read LSM ScanInfo structure from file and return as dict.r  r   r   i   zinvalid LSM ScanInfo structurer   Tz<IIIr   r   r  r   z<dr  z	Entry0x%x)r   r  r  r   r   r  r   rO   r	  r7   r	  r_
  pop)
r   blockblocksr  entryr=   rH   rl   r  newobjs
             r    r	  r	    s   EWF]F}T2771::&&q)Z776777GGAJJJ"#VFBGGBKK88udA::i6677EEaZZF4,,Q/EEaZZF4,,Q/EEED333MM%   259DF E$KEEd666MM%   FLL   EEd9996u=DE$KKj  JJLLEE */E+%& 	E"F Lr"   c                    i }|                      t          j        |          }t          j        D ]"\  }}||                                         ||<   #|d         dk    r|                      t          j        |          }|d         t          d          k    rt          j        d           i S t          j        D ]{\  }}|                    d          rD||         	                                
                    dd	
          }	t          |	d          ||<   ^||                                         ||<   |dD ](}
|d|
z   xx         dz  cc<   |d|
z   xx         dz  cc<   )n!|j        dk    rt          j        d           i S |S )z.Read TVIPS EM-MENU headers and return as dict.r:  rf
  r   r0  l   *UU zinvalid TVIPS v2 magic numberr  utf16ro  )errorsr!  )nullr  r
  g    eA	PixelSizer&   zunknown TVIPS header version)r>  rO   r
  rh  r1  r   r   r   r  r  r  r   rf  )r   r9   r=   r  r  rZ   headerr  typestrr   r   s              r    r  r    s   F^^D0I^FFF- - -gd|**,,tiA 4	JJ'?c*oo--M9:::I!1 	5 	5MD'!!#&& 54L))++22782LL(666t%d|2244t 	. 	.D&-...#5...;%&&&#-&&&&	. 
1		4555	Mr"   c                 j   i }i }t          |                     |                    }|                                D ]w}|                                }|                    d          ri }|||dd         <   ;	 |                    d          \  }	}
n# t          $ r Y aw xY wt          |
          ||	<   x|S )z0Read FEI SFEG/HELIOS headers and return as dict.[r&   r   r   )r  r  
splitlinesr  r  r  r,   r_  )r   r9   r=   r  r  rZ   sectionrD   r  rC  rl   s              r    r  r    s    FGRWWU^^$$D!! 
% 
%zz||??3 	G!(F4":	CJC 	 	 	H	e}}Ms   7B
BBc           	         ddi}d}t          |                     |                    }|                                D ]I}|                                r|                                },|r	 |                    d          \  }	}
n# t          $ r Y Tw xY w|
                                }
d}	 |
                                \  }}t          |t          t          f          }||k    r|}
|}nA# t          $ r4 t          |
t          t          f          }||
k    r|}
|
dv rd}
n|
dv rd}
Y nw xY w|	                                |
f||<   |r||xx         |fz  cc<   d}|dxx         t          |t          t          f          fz  cc<   K|S )	z&Read Zeiss SEM tag and return as dict.r,  r   Nr   )NoOffF)YesOnT)r  r  r.  isupperr	  r  r,   r  r_  r   r  r@   )r   r9   r=   r  r  rZ   rC  rD   r  r  rl   r  r  r0  numbers                  r    r  r    s   "XF
CRWWU^^$$D!! 8 8<<>> 	8**,,CC 	8"jjooee   KKMMED!{{}}1C<00Q;;"ED ! ! !U|44U??"EM))!EEm++ E!  ::<</F3K 'sw&CC2JJJ6$e5577JJJJMs$   ,B
BB,=C**;D('D(c                 $   |                      t          j        |          }|                    |j                            |                    }t          |          }|d         d|d                  |d<   |d         d|d                  |d<   |S )z7Read NIH_IMAGE_HEADER tag from file and return as dict.r:  r
  Nr
  r{
  rz
  )r>  rO   r
  r  r=   rM  r  )r   r9   r=   r  r  r|   s         r    r  r     s    
t,	BBA	qw##I..//AaA7,an,-AgJgm(m$AdGHr"   c                 <   |                      d           	 t          j        d|                     d                    \  }}|dk    s|dk    rt          |                      d           t          j        d|                     d                    \  }}}}|dk    s|d	k    rt          n# t          $ r t          d
          w xY wt          t          |                     |          dd                             }|dk    rt          | dd|d          ni }||fS )a;  Read ScanImage BigTIFF v3 static and ROI metadata from open file.

    Return non-varying frame data as dict and ROI group data as JSON.

    The settings can be used to read image data and metadata without parsing
    the TIFF file.

    Raise ValueError if file does not contain valid ScanImage v3 metadata.

    r   z<2sHr   r   r   r   z<IIIIir   znot a ScanImage BigTIFF v3 fileNr   r&   r   )	r%   r   r  r  r@   r,   matlabstr2pyr  r  )r   r9   rf  magicsize0size1
frame_dataroi_datas           r    rm  rm  *  s!    GGAJJJ	<#]62771::>>	7BO
'-}Wbggbkk'J'J$wuIAO ". < < <:;;;< iss(;<<==J8=		yS$t444rHxs   BB+ +Cc                 N   |                      d           	 ddd|                     d                   }n# t          $ r t          d          w xY wi }|                      d           t	          j        |dz   |                     d	                    \  }}}}}}}	}
|	d
k    rt          d          t          | |d|
d          |d<   |dk    rt          d          |                      |           t	          j        |dz   |                     d                    \  }}|dk    rt          d          t	          j        |d|z  z   |                     d|z                      }|ddd         |ddd         |ddd         |ddd         |ddd         d|d<   |dk    rt          d          |                      |           t	          j        |dz   |                     d                    \  }}|dk    rt          d          t          | |d|d          |d<   |dk    rt          d          |                      |           t	          j        |dz   |                     d                    \  }}|d k    rt          d          t          | |d|d          |d!<   |S )"zRead MicroManager non-TIFF settings from open file and return as dict.

    The settings can be used to read image data without parsing the TIFF file.

    Raise ValueError if the file does not contain valid MicroManager metadata.

    r   r   r   r  r   znot a MicroManager TIFF filer   IIIIIIIIr  i$# z#invalid MicroManager summary headerNSummaryiCz!invalid MicroManager index headerr  i4 IIIIIr   r   r&   r   r   )r  SliceFramePositionrG  IndexMapiz#invalid MicroManager display headeridDisplaySettingsi}z$invalid MicroManager comments headerieComments)r%   r  r  r,   r   r  r  )r   r9   rZ   index_headerindex_offsetdisplay_headerdisplay_offsetcomments_headercomments_offsetsummary_headersummary_lengthr*  r  rD   s                 r    rg  rg  F  s    GGAJJJ9,,RWWQZZ8		 9 9 978889 FGGAJJJ 	i*,bggbkk::	   >???!"i~tLLF9x<===GGLM)d"2BGGAJJ??MFE<====Wu_4bggb5j6I6IJJD!9addaddAJqt!t* F: "">???GGNM)d"2BGGAJJ??MFE>??? )"iud K KF(""?@@@GGOM)d"2BGGAJJ??MFE?@@@"2y$tDDF:Ms	   6 Ac                     t                      )zRead MetaSeries non-TIFF hint catalog from file.

    Raise ValueError if the file does not contain a valid hint catalog.

    )r  )r   s    r    read_metaseries_catalogrR    s     

r"   c           
      l   ddd|         g}dg}g }d }d }d }d }d	d
d|fddd|fddd|fddd|fddd|fddd|fddd|ff}	|	D ]\  }
}}}|
                                 | v r|
                                 }
n|
| vr7|dk    r|ddd         }| |
         }|t          |          }n|g}|                    |t          j        |dz   |          z              |D ]E} |||          }|                    |           |                    t          |                     F|sdS d                    |          }d                    |          }||z   }t          |          |d<   t          j        |dt          |          z  z   g|R  }ddt          |          |d fd!dt          |          d"z  |d ffS )#a  Return IJMetadata and IJMetadataByteCounts tags from metadata dict.

    The tags can be passed to the TiffWriter.save function as extratags.

    The metadata dict may contain the following keys and values:

        Info : str
            Human-readable information as string.
        Labels : sequence of str
            Human-readable labels for each channel.
        Ranges : sequence of doubles
            Lower and upper values for each channel.
        LUTs : sequence of (3, 256) uint8 ndarrays
            Color palettes for each channel.
        Plot : bytes
            Undocumented ImageJ internal format.
        ROI: bytes
            Undocumented ImageJ internal region of interest format.
        Overlays : bytes
            Undocumented ImageJ internal format.

       IJIJ   JIJIr   r   r   c                 D    |                      dddd|         z             S Nr  belerV  r  rD   r9   s     r    _stringz%imagej_metadata_tags.<locals>._string  &    {{8Dt&<&<Y&GGHHHr"   c                 L    t          j        |dt          |           z  z   g| R  S )Nr  )r   r   r.   r\  s     r    _doublesz&imagej_metadata_tags.<locals>._doubles  s)    {9c$ii8@4@@@@r"   c                 *    |                                  S r   )tobytesr\  s     r    _ndarrayz&imagej_metadata_tags.<locals>._ndarray  s    ||~~r"   c                     | S r   r   r\  s     r    _bytesz$imagej_metadata_tags.<locals>._bytes  r  r"   Info   infor&   Labels   lablNRanges   rangLUTs   lutsPlot   plotROI   roi Overlays   overr   r   r   r   r"   rm  r   Trl  r   )r	  r.   r7   r   r   r  )r  r9   r*  r  bodyr]  r`  rc  re  metadata_typesrC  mtyper  r^   r   rl   rD   s                    r    rn  rn    sj   . '**956FJDI I IA A A     
!W%	7D'*	7Ax(	$)	!V$	F#	WdF+N $2 ) )UE499;;(""))++CC  $$B$KE#=KKEEXFefk)c/5AAABBB 	) 	)E4y))DKKc$ii((((	)
  r88D>>DXXfFD=DKKJqMY#J*?@N:NNNJ	SYYd+	S__):t< r"   c           	      p   d }d }d }d }d|fd|fd|fd|fd	|fd
|fd|fd}|                     t          d |                                D                                  |st          d          | dd         dvrt          d          |d         }|dk     s|dk    rt          d          |dz
  dz  }	t	          j        |d|	z  z   | dd|	dz  z                      }
d|	dz  z   }d}i }t          |
ddd         |
ddd                   D ]\  }}g }|                    |t          |          t          f          \  }}t          |          D ];}|dz  }|||         z   }|                     || ||         |                     |}<|dk    r|d         n|||                                <   |S )zReturn IJMetadata tag value as dict.

    The 'Info' string can have multiple formats, e.g. OIF or ScanImage,
    that might be parsed into dicts using the matlabstr2py or
    oiffile.SettingsFile functions.

    c                 D    |                      dddd|         z             S rX  )r  r\  s     r    r]  z imagej_metadata.<locals>._string  r^  r"   c                 X    t          j        |dt          |           dz  z  z   |           S )Nr  r   )r   r  r.   r\  s     r    r`  z!imagej_metadata.<locals>._doubles  s(    }Y#Ta*@A4HHHr"   c                 T    t          j        | d                              dd          S )Nr   r   rk  )r<   r  rd  r\  s     r    _lutzimagej_metadata.<locals>._lut  s%    g..66r3???r"   c                     | S r   r   r\  s     r    re  zimagej_metadata.<locals>._bytes  r  r"   rf  rh  rj  rl  Plotsrp  rr  )rg  ri  rk  rm  ro  rq  rs  c              3   6   K   | ]\  }}|d d d         |fV  d S r  r   r  s      r    r!   z"imagej_metadata.<locals>.<genexpr>    s4      ==daa"gq\======r"   zno ImageJ metadataNr   )rT  rU  zinvalid ImageJ metadatar   r   i$  z#invalid ImageJ metadata header sizer   4sIr   r&   )rN   r  r  r,   r   r  r5  rA   r  r  rq  r7   r  )rD   r  r9   r]  r`  r{  re  ru  header_sizentypesr*  r   counterrZ   rv  r  r   r  r^   r[   pos1s                        r    rG  rG    sg   I I II I I@ @ @   '"G$H%$6"f% N ==n&:&:&<&<=====    /-...BQBx)))2333Q-KR;,,>???Ao!#F]9uv~5tAFQJ<N7OPPF
fqj.CGFF33Q3K166 C Cu#''	%0@0@*/MNN
du 	 	AqLGG,,DMM$$tCH~y99:::CC,1QJJvayyFtzz||Mr"   c                 p   d }i }|                                  D ]}	 |                    d          \  }}n# t          $ r Y (w xY w|                                }|                                }t          t
          |fD ]}	  ||          } n# t          $ r Y w xY w|||<   d|vrt          d          |S )a8  Return metatata from ImageJ image description as dict.

    Raise ValueError if not a valid ImageJ description.

    >>> description = 'ImageJ=1.11a\nimages=510\nhyperstack=true\n'
    >>> imagej_description_metadata(description)  # doctest: +SKIP
    {'ImageJ': '1.11a', 'images': 510, 'hyperstack': True}

    c                 <    ddd|                                           S )NTF)truefalse)r	  )r   s    r    _boolz*imagej_description_metadata.<locals>._bool)   s    u--ciikk::r"   r   rF  znot a ImageJ image description)r.  r  r@   r  r   r  r,   )r~  r  rZ   r  rC  r   r=   s          r    r;  r;     s    ; ; ; F&&((  	zz#HC 	 	 	H	iikkiikk5%( 	 	EeCjj   sv9:::Ms!   6
AA B
BBF1.11ac                    |rt          d          t          | |          } | d         dv }d|z  g}g }	|                    dt          | dd                   z             |d	}|	                    d
           n%|	                    dt	          |          z             | d         dk    r|                    d| d         z             ||sd}|r|r|	                    d|z             | d         dk    r|                    d| d         z             | d         dk    r5|                    d| d         z             ||	                    d           |%|	                    dt	          |          z             |                                D ]1\  }
}|	                    |
                                d|           2d                    ||	z   dgz             S )a5  Return ImageJ image description from data shape.

    ImageJ can handle up to 6 dimensions in order TZCYXS.

    >>> imagej_description((51, 5, 2, 196, 171))  # doctest: +SKIP
    ImageJ=1.11a
    images=510
    channels=2
    slices=5
    frames=51
    hyperstack=true
    mode=grayscale
    loop=false

    z!ImageJ colormapping not supported)rgbr   r   z	ImageJ=%sz	images=%iNr   Tzhyperstack=truezhyperstack=%sr   r&   zchannels=%i	grayscalezmode=%sz	slices=%ir   z	frames=%iz
loop=falsezloop=%sr   r  r,  )r  r_  r7   r   r   r  r	  r  )rE   r  
colormapedrf  rD  rY   loopr0   rZ   r7   rC  rl   s               r    rh  rh  A   s   2  G!"EFFFC(((E
)v
CG#$FF
MM+crc
 3 33444
'((((oZ(8(88999Qx!||meAh.///|C| (d (i$&'''Qx!||kE!H,---Qx!||kE!H,---<MM,'''i$t**,---llnn 6 6
Uee4555599Vf_t+,,,r"   c                 ~   t          d | D                       } t          |           }d|cxk    rdk    rn nt          d          || d         dv o|dk    }|r| d         dvrt          d	          |s!|dk    r| d         dk    rt          d
          |s| d         dk    rdd|z
  z  | z   S dd|z
  z  | z   dz   S )zReturn shape normalized to 6D ImageJ hyperstack TZCYXS.

    Raise ValueError if not a valid ImageJ hyperstack shape.

    >>> imagej_shape((2, 3, 4, 5, 3), False)
    (2, 3, 4, 5, 3, 1)

    c              3   4   K   | ]}t          |          V  d S r   r   r   s     r    r!   zimagej_shape.<locals>.<genexpr>   s(      ((Q#a&&((((((r"   r&   r   z1invalid ImageJ hyperstack: not 2 to 6 dimensionalNr   r   r   z*invalid ImageJ hyperstack: not a RGB imagez.invalid ImageJ hyperstack: not a non-RGB imager   r   )r  r.   r,   )rE   r  r  s      r    r_  r_  {   s    ((%(((((Eu::D4||||!|||||LMMM
{Bi6!.dQh
 GuRy&&EFFF K4199raIJJJ
 )eBi1nnq4x 5((1t8u$t++r"   c                 V    |                     |            t          j        |          S )zReturn JSON image description from data shape and other meta data.

    Return UTF-8 encoded JSON.

    >>> json_description((256, 256, 3), axes='YXS')  # doctest: +SKIP
    b'{"shape": [256, 256, 3], "axes": "YXS"}'

    rE   )rN   r  dumps)rE   r  s     r    ri  ri     s(     OO%O   :hr"   c                 &   | dd         dk    rDt          d | dd                             d          D                       }t          |          S | dd	         d
k    r"| dd         dk    rt          j        |           S t          d|           )a  Return metatata from JSON formatted image description as dict.

    Raise ValuError if description is of unknown format.

    >>> description = '{"shape": [256, 256, 3], "axes": "YXS"}'
    >>> json_description_metadata(description)  # doctest: +SKIP
    {'shape': [256, 256, 3], 'axes': 'YXS'}
    >>> json_description_metadata('shape=(256, 256, 3)')
    {'shape': (256, 256, 3)}

    Nr   r  c              3   4   K   | ]}t          |          V  d S r   r   r   s     r    r!   z,json_description_metadata.<locals>.<genexpr>   s(      CCc!ffCCCCCCr"   r  r   ,r  r&   r  }zinvalid JSON image description)r  r  r  r  r  r,   )r~  rE   s     r    r/  r/     s     2A2(""CCk!B$&7&=&=c&B&BCCCCC%    2A2#+bcc"2c"9"9z+&&&
5{
C
CCr"   c                    |                      d          st          d          |ddh}i }|g}d}|                                 D ]}|s|                                }|s|d         dk    r|dd         d	k    rl|d
= |d
         }|dd         }|rd                    ||                   ||<   |dd         dk    r(t          j        ||         d          }d|_        |||<   d}|dd
         }|dd         dk    rg }n||v rg }d}ni }|                    |           |||<   |r|                    |           |	                    dd          }t          |          dk    rd||d                                         <   E|\  }	}
|	dd         dk    r3|                    d |
	                                D                        t          |
                                          ||	                                <   |S )al  Return metatata from FluoView image description as dict.

    The FluoView image description format is unspecified. Expect failures.

    >>> descr = ('[Intensity Mapping]\nMap Ch0: Range=00000 to 02047\n'
    ...          '[Intensity Mapping End]')
    >>> fluoview_description_metadata(descr)
    {'Intensity Mapping': {'Map Ch0: Range': '00000 to 02047'}}

    r-  z"invalid FluoView image descriptionNzRegion Info (Fields)zProtocol DescriptionFr   z End]r   r&   r  r   zLUT r   r   )r   r   Tr   zRGB c              3   4   K   | ]}t          |          V  d S r   r   )r   r  s     r    r!   z0fluoview_description_metadata.<locals>.<genexpr>   s(      ==3s88======r"   )r  r,   r.  r  r  r<   r
  rE   r7   r  r.   rH  r_  )r~  ignoresectionsrZ   sectionscommentr  r/  r  r|   rC  rl   s              r    fluoview_description_metadatar     sR    !!#&& ?=>>>02HIFxHG&&(( +9 +9 	 ::<<D 	7c>>BCCyG##RL"2,AbDz =$(IIgdm$<$<GDM8v%%GDMAAAA#AG$%GDMG":DBQBx6!!''OOG$$$"F4L 	NN4   zz#q!!t99>>'+GDGMMOO$
Urr7fNN==u{{}}=======#)%++--#8#8GCIIKK  Mr"   c                    i }|                      d          s|S dD ]}|                     |d          } |                     d          D ]rdd         dk    r                                d         }d         t          j        vri	 t
          j                            d                              d	          |d
<   n0# t          $ r# d                    dd                   ||<   Y nw xY wt          j        d                  \  }t          |d         t                    r|d                  }nfd|D             }t          u r|d         dk    rdg}t          fd|D                       }t          k    rd                    |          }nt          |          dk    r|d         }|||<   t|S )a  Return metatata from Pilatus image description as dict.

    Return metadata from Pilatus pixel array detectors by Dectris, created
    by camserver or TVX software.

    >>> pilatus_description_metadata('# Pixel_size 172e-6 m x 172e-6 m')
    {'Pixel_size': (0.000172, 0.000172)}

    r  z#:=,()r  r  Nr   r  r   z%Y-%m-%dT%H %M %S.%fr&  r&   c                      g | ]
}|         S r   r   )r   r   r  s     r    rK  z0pilatus_description_metadata.<locals>.<listcomp>!  s    ///!d1g///r"   notNaNc              3   .   K   | ]} |          V  d S r   r   )r   r  r=   s     r    r!   z/pilatus_description_metadata.<locals>.<genexpr>!  s+      00AuuQxx000000r"   )r  r  r  rO   r  r  strptimer  r@   r(   r  r  r  r   r.   )r~  rZ   r1  r  r  r   r=   r  s         @@r    rb  rb     s    F!!$''  2 2!))!S11!!$''  8tzz||Aw7$---2%-%6%?%?HHTNN$:& &z""  2 2 2"xxQRR11t2,T!W5gaj%(( 	0'!*%FF////w///FE>>fQi500WF000000000C<<XXf%%FF[[AAYFtMs   6C*C32C3c                    |                      d          st          d          i }|                     d          }|d                                                             dd          \  }}|                                ||                                <   t          |          dk    r|S |d                             d          }|d                                         |d<   |dd         D ]P}|                    d	          \  }}t          |                                          ||                                <   Q|S )
zReturn metatata from Aperio image description as dict.

    The Aperio image description format is unspecified. Expect failures.

    >>> svs_description_metadata('Aperio Image Library v1.0')
    {'Aperio Image Library': 'v1.0'}

    zAperio Image Library z invalid Aperio image descriptionr  r   Nr&   r   r,  z = )r  r,   r  r  rsplitr.   r_  )r~  rZ   linesrC  rl   r  r  s          r    svs_description_metadatar  %!  s    !!"9:: =;<<<Fd##Eq!!((q11JC++--F399;;
5zzQ!HNN3Eq!!F2Jabb	 4 4ZZ&&
U$U[[]]33syy{{Mr"   c                    |                                  } | sg S 	 t          |           } n&# t          $ r t          j        d           g cY S w xY wg }|                     d          D ]}i }|                    d          D ]}|                    dd          }t          |          dk    r<|\  }}t          |                                           ||                                 <   g|d                                          }|r&d|v r|d                             |           |g|d<   |                    |           |S )zReturn metadata from MetaMorph image description as list of dict.

    The MetaMorph image description format is unspecified. Expect failures.

    z+failed to parse MetaMorph image descriptionr!  
r>  r&   r   r,  )	r  r  r  r   r   r  r.   r_  r7   )r~  rZ   r  r  r  r  rl   s          r    stk_description_metadatar  >!  s^    ##%%K 	,,   CDDD			 F""6**  KK'' 	( 	(D::c1%%D4yy1}}"e"("7"7$**,,Q (Qww"U++++!&"aMs   *  AAc                    |                      d          st          d          ddlm} |                    |           }t
          t          d dfd |i           }d|v r|d                             d	d
          |d<   |S )z:Return metatata from MetaSeries image description as dict.r  z$invalid MetaSeries image descriptionr   rm  c                 $    t          | dd          S )Nonr  )asboolr   s    r    r   z1metaseries_description_metadata.<locals>.<lambda>g!  s    6!T5;Q;Q r"   )r  r   r   c                     | D ]Z}|j         }|s |i           ||j        <    d|v r6|d         }|d         }|d         }|v r |         |          ||<   U|||<   [|S )Nidtyperl   )r  rJ  )	r  rZ   childr  r   rG  r  parsetypess	          r    r  z.metaseries_description_metadata.<locals>.parsei!  s     	" 	"E\F $)E%$4$4uy!v~~4L6N7O:: (aF1II !F1Ir"   rk  z
&#13;&#10;r  )r  r,   r  rn  r  r  r   r  )r~  r  r  adictr  r  s       @@r    r^  r^  _!  s    !!,// A?@@@//////K((DC1Q1QRRE     " E$OOE$]3;;L$OOmLr"   c                      t          |           S )z9Return metatata from ScanImage image description as dict.)r9  r  s    r    rn  rn  !  s    $$$r"   c                 |    	 t          j        |           S # t          $ r t          j        d| z             Y dS w xY w)z2Return metatata from ScanImage artist tag as dict.r  N)r  r  r,   r   r   )artists    r    scanimage_artist_metadatar  !  sQ    4z&!!! 4 4 4)F23333334s    !;;r[   c                     d S )z2Try replace decorated function by module.function.c                     | S r   r   )r!  s    r    r   z_replace_by.<locals>.<lambda>!  s    Q r"   )	importlibimport_moduler  r  )module_functionpackager   prefixrm   decorate_warnr  s    ` `  @@r    _replace_byr  !  s    ;r"   c                    | j         }| j        }t          |          dk     rt          d          |j        dvrt          d          | j        j        dk    pt          j        dk    o| j        j        dk    }|                     d          } |d	d
         dz   |dd	         z   | _         t          j	        | d
d|            |r|d	d
         dz   |d
d	         z   | _         t          j
        | dd
          } t          j
        | d
d          } | dd	d	df         } t          j        |           } |                     |          } || _         | S )a  Decode floating point horizontal differencing.

    The TIFF predictor type 3 reorders the bytes of the image values and
    applies horizontal byte differencing to improve compression of floating
    point images. The ordering of interleaved color channels is preserved.

    Parameters
    ----------
    data : numpy.ndarray
        The image to be decoded. The dtype must be a floating point.
        The shape must include the number of contiguous samples per pixel
        even if 1.

    r   zinvalid data shapedfeznot a floating point imager   r   r   r   Nr   r   r   r  r   .)rE   r=   r.   r,   rV   r9   r   r  r<   r  swapaxesascontiguousarray)rD   rE   r=   littleendians       r    r  r  !  sX    JEJE
5zzA~~-...z5666:'3. !Adj&:c&A  99WDsse#eBCCj0DJ	LBg48888 53B3Z%'%*4
>$B''D>$B''DTTrT	?D"4((D99UDDJKr"   z_tifffile.decode_packbitsc                    t           j        d         dk    rt          nt          }g }|j        }d}	 	  || |                   dz   }|dz  }|dk     r || |||z                       ||z  }n'|dk    r! || ||dz            d|z
  z             |dz  }c# t
          $ r Y nw xY wt           j        d         dk    rd                    |          nt          |          S )zuDecompress PackBits encoded byte string.

    PackBits is a simple byte-oriented run-length compression scheme.

    r   r   Tr&      r  r"   )r   rf  ordr  rH  r  r  r   )encodedr^   rZ   result_extendr   ns         r    r  r  !  s    +a.C''33\DFMM	A	WQZ  1$AFA3wwga!a%i0111QSga!a%i0C!G<===Q	    "{1~44388F%--Gs   A$B 
B"!B"z_tifffile.decode_lzwc           	      P    t                     }|dz  }t          j        t          j        d         dk    rd t          d          D             }nd t          d          D             }|                    d            fd}d	d
t          dd          fddt          dd          fddt          dd          fddt          dd          fd}|d         \  }d|dk     rt          d           |            dk    rt          d          d}d}g }	|	j	        }
	  |            }|z  |dk    s|k    rn|dk    rG|dd         }|j	        }d}|d         \  } |            }|z  |dk    rny |
||                    nT||k     r||         }||         |dd         z   }n||         }||dd         z  }|} |
|            ||           |dz  }|}||v r||         \  }|dk    rt          j        d |z             d!                    |	          S )"a+  Decompress LZW (Lempel-Ziv-Welch) encoded TIFF strip (byte string).

    The strip must begin with a CLEAR code and end with an EOI code.

    This implementation of the LZW decoding algorithm is described in (1) and
    is not compatible with old style LZW compressed files like quad-lzw.tif.

    r   r   r   c                 ,    g | ]}t          |          S r   )chrr   s     r    rK  zdecode_lzw.<locals>.<listcomp>"  s    ///qCFF///r"   rk  c                 .    g | ]}t          |g          S r   )r   r   s     r    rK  zdecode_lzw.<locals>.<listcomp>	"  s     3331E1#JJ333r"   )r   r   c            
          dz  } | | dz            }	  d|          d         }n8# t           $ r+  d|ddt          |          z
  z  z             d         }Y nw xY w|dz  z  }|z  }|z	  S )z@Return integer of 'bitw' bits at 'bitcount' position in encoded.r   r   z>Ir   r   )r@   r.   )r  r   r  bitcountr  maskshrr  s      r    	next_codezdecode_lzw.<locals>.next_code"  s    AEEAI%&	?6$??1%DD 	? 	? 	?6$Gq3q66z$: :;;A>DDD	?As{s   ( 2AAr   r   11111111100000000000000000000000r   r\  r   11111111110000000000000000000000r^  r   11111111111000000000000000000000r   r    11111111111100000000000000000000)r  i  i  i  r  r   z(strip must be at least 4 characters longz strip must begin with CLEAR codeTrl  Nr  r&   z&unexpected end of LZW stream (code %i)r"   )r.   r   r  r   rf  rq  rH  r   r,   r7   r   r   r  )r  len_encodedbitcount_maxnewtabler  switchbitchbitwr  oldcoderZ   result_appendr  table_appendlentabledecodednewcoder  r  r  r  s   `               @@@@r    r   r   !  s    g,,K?L]F
{1~//E#JJ///33c

333OOF
 
 
 
 
 
 
 
 
 S+Q//0"c-q1122s.2232s.223	 K "#&OD#tHQCDDDy{{c;<<<DGFMM4y{{D3;;(l223;;QQQKE <LH)#.OD#t9;;DHs{{M%+&&&&h+.72A2;6.72A2;&!M'"""L!!!MH{"")(3OD#t94< s{{>EFFF88Fr"   z_tifffile.unpack_intsc                    dk    rt          j        | d          } t          j        |           } |dz  r@|                     d|d|dz  z
  z             } | ddd|f                             d          } |                     |          S t          j        |          }dv rt          j        | |          S dvrt          dz            |j        d	vrt          d
          t          fddD                       }||j	        k    rt          d          |dk    rdt          |           z  z  }|z  dz  }|rd|z
  }|dz  z
  }t          dz  d|z  z   d          }d|j        z   }t          j        }	|t          |           dz  |z  |z   z  z  }
t          j        |
f|          }d}t!          |
          D ]}|dz  }| |||z            }	  |	||          d         }n8# t"          $ r+  |	||d|t          |          z
  z  z             d         }Y nw xY w||dz  z  }||z  }||z	  ||<   |z  }|dz   |z  dk    r||z  }|S )a  Decompress byte string to array of integers of any bit size <= 32.

    This Python implementation is slow and only handles itemsizes 1, 2, 4, 8,
    16, 32, and 64.

    Parameters
    ----------
    data : byte str
        Data to decompress.
    dtype : numpy.dtype or str
        A numpy boolean or integer type.
    itemsize : int
        Number of bits per integer.
    runlen : int
        Number of consecutive integers, after which to start at next byte.

    Examples
    --------
    >>> unpack_ints(b'a', 'B', 1)
    array([0, 1, 1, 0, 0, 0, 0, 1], dtype=uint8)
    >>> unpack_ints(b'ab', 'B', 2)
    array([1, 2, 0, 1, 1, 2, 0, 2], dtype=uint8)

    r&   z|Br   r   Nr  )r&   r   r   r   r   r  zitemsize not supported: %ibiuzinvalid dtypec              3   .   K   | ]}d |z  k    |V  dS r   Nr   )r   r   r>   s     r    r!   zunpack_ints.<locals>.<genexpr>y"  s1      BB1A0A0AQ0A0A0A0ABBr"   )r&   r   r   r   zdtype.itemsize too smallr   10r   r   r   )r<   r  
unpackbitsrd  r_  r=   r,   ra  nextr>   r.   r   rV   r   r  ro  rq  r@   )rD   r=   r>   r  	itembytesskipbitsshrbitsbitmaskdtypestrr  rH   rZ   r  r   r  r   r  s     `              r    r  r  O"  s   4 1}}d++%%A: 	0<<Fa&1*n$=>>D7F7
#++B//D{{5!!!KE?""e,,,+++5@AAAz)))BBBBBBBBBIEN""3444{{c$ii-H, 1$H  x<!mh&G(S.3=0!44GUZH]FSYY]v'88'CDED[$%((FH4[[ ! !A**+	K6(A&&q)DD 	K 	K 	K6(A9s1vv3E(F$FGGJDDD	KAGOq	HEVq   HMs   G))2HH<Br  Tc           	      z  
 t          j                  t          t          j        |                    

dk    rt	          fd|D                       st          dt          |          z            t          
fddD                       }t          j        | j	        |z             } t          j
        | j        t          |          fj                  }t          |          D ]\  }}| t          t          j        ||dz   d                             z	  }|t          dd	|z  z   d
          z  }|rbj        dz  |z  dz   |z  }	|	| j        j        dz  k    r|                    d          }|d
|	z  dz
  d
|z  dz
  z  z  }|d
|	j        dz  z
  z  z  }||dd|f<   |                    d          S )a  Return array from byte string containing packed samples.

    Use to unpack RGB565 or RGB555 to RGB888 format.

    Parameters
    ----------
    data : byte str
        The data to be decoded. Samples in each pixel are stored consecutively.
        Pixels are aligned to 8, 16, or 32 bit boundaries.
    dtype : numpy.dtype
        The sample data type. The byteorder applies also to the data stream.
    bitspersample : tuple
        Number of bits for each sample in a pixel.
    rescale : bool
        Upscale samples to the number of bits in dtype.

    Returns
    -------
    result : ndarray
        Flattened array of unpacked samples of native dtype.

    Examples
    --------
    >>> data = struct.pack('BBBB', 0x21, 0x08, 0xff, 0xff)
    >>> print(unpack_rgb(data, '<B', (5, 6, 5), False))
    [ 1  1  1 31 63 31]
    >>> print(unpack_rgb(data, '<B', (5, 6, 5)))
    [  8   4   8 255 255 255]
    >>> print(unpack_rgb(data, '<B', (5, 5, 5)))
    [ 16   8   8 255 255 255]

    r  c              3   4   K   | ]}|j         d z  k    V  dS r  )r>   )r   r   r=   s     r    r!   zunpack_rgb.<locals>.<genexpr>"  s/      NN1qENQ$66NNNNNNr"   zsample size not supported: %sc              3   \   K   | ]&}t          j        |          j        d z  k    "|V  'dS r  )r<   r=   r>   )r   r   bitss     r    r!   zunpack_rgb.<locals>.<genexpr>"  s=      FFA%+a.."9A"="E"Ea"E"E"E"EFFr"   BHIr&   N0br  r   r   r   r   )r<   r=   r   rv  r  r,   r   r  r  r9   ro  rH   r.   rV   rr  r>   r_  rd  )rD   r=   r<  rescaler-  rZ   r   r  rG  or  s    `        @r    r  r  "  s   B KEuy''((DBJJ3NNNNNNNNNJ83};M;MMNNN	FFFFFFF	F	FBD%/B"677D[$)S%7%78%*EEFM** 	 	3C	-A"899:::	Sc	!1%%% 	2.1$,q0C7A4:&***HHSMM!Q$(3
++A!U^a/011Aqqq!t>>"r"   z_tifffile.reverse_bitorderc                    	 |                      d          }t          j        t          j        ||           dS # t
          $ r" |                     t          j                  cY S t          $ r t          d          w xY w)aj  Reverse bits in each byte of byte string or numpy array.

    Decode data where pixels with lower column values are stored in the
    lower-order bits of the bytes (FillOrder is LSB2MSB).

    Parameters
    ----------
    data : byte string or ndarray
        The data to be bit reversed. If byte string, a new bit-reversed byte
        string is returned. Numpy arrays are bit-reversed in-place.

    Examples
    --------
    >>> reverse_bitorder(b'\x01\x64')
    b'\x80&'
    >>> data = numpy.array([1, 666], dtype='uint16')
    >>> reverse_bitorder(data)
    >>> data
    array([  128, 16473], dtype=uint16)

    r   r  zslices of arrays not supportedN)
r  r<   takerO   r  rc   	translater  r,   r  )rD   r  s     r    r  r  "  s    .Dyy!!
4.$?????? ; ; ;~~d9::::: D D D!"BCCCDs   6: )A>%A>c                     t          j        || d          } t          j        | d| j                  } |rt          j        |           } | S )a  Return palette-colored image.

    The image values are used to index the colormap on axis 1. The returned
    image is of shape image.shape+colormap.shape[0] and dtype colormap.dtype.

    Parameters
    ----------
    image : numpy.ndarray
        Indexes into the colormap.
    colormap : numpy.ndarray
        RGB lookup table aka palette of shape (3, 2**bits_per_sample).
    contig : bool
        If True, return a contiguous array.

    Examples
    --------
    >>> image = numpy.arange(256, dtype='uint8')
    >>> colormap = numpy.vstack([image, image, image]).astype('uint16') * 256
    >>> apply_colormap(image, colormap)[-1]
    array([65280, 65280, 65280], dtype=uint16)

    r&   r   r   )r<   r  rollaxisr  r  )imager}  contigs      r    r  r  "  sL    . JxQ///EN5!UZ00E /'..Lr"   c                 r   t           j        }t          ||          }||j        k    r| S ||j        k    r| ddddddf         S ||j        k    r| ddddddddf         S ||j        k    r| dddddddddf         S ||j        k    rt          j	        | dd          S ||j
        k    r$t          j	        | dd          ddddddf         S ||j        k    r't          j	        | dd          ddddddddf         S ||j        k    r(t          j	        | dd          dddddddddf         S dS )a+  Return reoriented view of image array.

    Parameters
    ----------
    image : numpy.ndarray
        Non-squeezed output of asarray() functions.
        Axes -3 and -2 must be image length and width respectively.
    orientation : int or str
        One of TIFF.ORIENTATION names or values.

    .Nr   r   r   )rO   r  r\  r   r!  r#  r"  r$  r<   r  r%  r&  r'  )r  orientationr  s      r    reorientr  #  s    "K+{33Kk)))	,	,	,S$$B$\""	+	+	+S$$B$111_%%	,	,	,S$$B$"aaa'((	+	+	+~eR,,,	,	,	,~eR,,S$$B$\::	,	,	,~eR,,S$$B$111_==	+	+	+~eR,,S$$B$"aaa-?@@ 
,	+r"   c                 |   t          j        |           } g }g }g }t          | j        | j        |          D ]L\  }}}|                    ||f           |                    |df           |                    ||z             Mt           j        j        	                    | ||d          
                    |          S )a   Return read-only view into input array with elements repeated.

    Zoom nD image by integer factors using nearest neighbor interpolation
    (box filter).

    Parameters
    ----------
    a : array_like
        Input array.
    repeats : sequence of int
        The number of repetitions to apply along each dimension of input array.

    Example
    -------
    >>> repeat_nd([[1, 2], [3, 4]], (2, 2))
    array([[1, 1, 2, 2],
           [1, 1, 2, 2],
           [3, 3, 4, 4],
           [3, 3, 4, 4]])

    r   F)	writeable)r<   r/   r5  stridesrE   rH  r7   libstride_tricks
as_stridedrd  )r|   repeatsrd  rE   r
  r   r7  r  s           r    r   r   -#  s    , 	aAGEGqy!'733  1aaV1vq1u9"--	5'U .  ggr"   c                     t          | t                    }|r| n| j        }t          |          |k    r| S d|t          |          z
  z  |z   }|r|n|                     |          S )a  Return image array or shape with at least ndim dimensions.

    Prepend 1s to image shape as necessary.

    >>> reshape_nd(numpy.empty(0), 1).shape
    (0,)
    >>> reshape_nd(numpy.empty(1), 2).shape
    (1, 1)
    >>> reshape_nd(numpy.empty((2, 3)), 3).shape
    (1, 2, 3)
    >>> reshape_nd(numpy.empty((3, 4, 5)), 3).shape
    (3, 4, 5)
    >>> reshape_nd((2, 3), 3)
    (1, 2, 3)

    r   )r(   r  rE   r.   rd  )data_or_shaper  is_shaperE   s       r    rb  rb  P#  sr    " -//H%>MM=+>E
5zzTD3u::%&.E>55-"7"7">">>r"   r  c                     t          |           t          |          k    rt          d          t          fdt          | |          D              \  } }t          |           d                    |          fS )zReturn shape and axes with single-dimensional entries removed.

    Remove unused dimensions unless their axes are listed in 'skip'.

    >>> squeeze_axes((5, 1, 2, 1, 1), 'TZYXC')
    ((5, 2, 1), 'TYX')

    z)dimensions of axes and shape do not matchc              3   H   K   | ]}|d          dk    s
|d         v |V  dS )r   r&   Nr   )r   r   r  s     r    r!   zsqueeze_axes.<locals>.<genexpr>t#  s7      PPaqtaxx1Q44<<<<<<PPr"   r,  )r.   r,   r5  r  r  )rE   r  r  s     `r    r  r  i#  ss     5zzSYYDEEEPPPP3ud#3#3PPPQKE4<<&&r"   CTZYXc                     D ]}||vrt          d|z            | j        }t          |          D ]}|vr
|z   d|z   }|                     |          } |                     fd|D                       } | S )zReturn image with its axes permuted to match specified axes.

    A view is returned if possible.

    >>> transpose_axes(numpy.zeros((2, 3, 4, 5)), 'TYXC', asaxes='CTZYX').shape
    (5, 2, 1, 3, 4)

    zunknown axis %sr   c                 :    g | ]}                     |          S r   r{  )r   r  r  s     r    rK  z"transpose_axes.<locals>.<listcomp>#  s#    ===TZZ^^===r"   )r,   rE   rT  rd  	transpose)r  r  asaxesr  rE   s    `   r    transpose_axesr  x#  s      5 5V.3444  KEv ! !T>>9D5LEMM%  EOO====f===>>ELr"   r   c                 T   t          |          }t          |          }t          |           t          |          k    rt          d          t          |          }t          |          }||k    rt          d|d|          | r|sdS t	          dt          |          t          |          z
            }|r|d|z  z   }t          |          dz
  }d}d}	g }
|ddd	         D ]}||z  }|dk    r/||         dk    r#|dk    r|dz  }|dk    r||         dk    r|dk    |||         k    r;||	||         z  k    r,|	||         z  }	|
                    | |                    |dz  }|
                    |           d                    t          |
|d                             S )
zReturn axes matching new shape.

    Unknown dimensions are labelled 'Q'.

    >>> reshape_axes('YXS', (219, 301, 1), (219, 301))
    'YX'
    >>> reshape_axes('IYX', (12, 219, 301), (3, 4, 219, 1, 301, 1))
    'QQYQXQ'

    r-  zcannot reshape r	  r,  r   r   r&   Nr   )r  r.   r,   r   r  r7   r  rT  )r  rE   newshapeunknownrH   newsizelendiffr   prodnsprodsrZ   nss               r    r)  r)  #  s    %LLEXH
4yyCJJ23335>>DhGwjeeeXXFGGG x r!SZZ#h--/00G -dWn,E

QAFEFtttn 	# 	#"!eeaA"''FA !eeaA"''q>>fa(888U1XEMM$q'"""FAAMM'""""778F788,--...r"   r&   c                 R   t          |           }|dk    rt          d          |dk    r | d         j        |d|i|S t          d | D                       }|                    d           |f|j        j        z   }|j        j        }t          |||          }|t          j	                    dz  }|dk    |j
        j        _        t          t          d	|          |j
        j        j        
          }	||	||fd}
|dk     r"t          |           D ]\  }} |
||           n[t           j                            |          5 }|                    |
| t)          |                     ddd           n# 1 swxY w Y   |	                                 d|j
        j        _        |S )zRead data from sequence of TiffPage and stack them vertically.

    Additional parameters are passed to the TiffPage.asarray function.

    r   zno pagesr&   r  c              3      K   | ]}||V  	d S r   r   )r   r  s     r    r!   zstack_pages.<locals>.<genexpr>#  s"      33qQ]]]]]33r"   N)r  r   r   )rH   r  c                     | Y|                     | j        j                    | j        ||j        ddd|||<   |                    | j        j                   dS dS )z!Read, decode, and copy page data.NF)r  r  r  )r  r  r  r/   r  r  )rX   r  r  	filecacher	  r0   s         r    r^   zstack_pages.<locals>.func#  su    NN4;1222%DHY^EE LR CJ OODK233333 r"   )r.   r,   r/   r  r  rE   r=   r   multiprocessing	cpu_countr  r  r  rW  r  rr  
concurrentfuturesThreadPoolExecutormaprq  r!  )rQ   r  r  r	  r0   r5  rj  rE   r=   r%  r^   r   rX   executors                 r    r  r  #  s    ZZF{{$$${{uQx$9C9&99933E33333E	MM4M   I,,EN E
UE
*
*C$.00A5
#->EL Jel&=&B  I "YT& 4 4 4 4 A~~ '' 	 	GAtDqMMMM	 22:>> 	5(LLueFmm444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 OO#'EL Js   %E77E;>E;c                    t          |           } t          |          }t          |           t          |          k    sJ d}t          t          | |                    D ]Y\  }\  }}|dk    r|dk    r||k    r
|| |<   |||<   |dz  }*|dk    r|dk    rt	          d          t          j        d           Z|dk    rd}| d|         |d|         fS )zReturn cleaned offsets and byte counts.

    Remove zero offsets and counts. Use to sanitize _offsets and _bytecounts
    tag values for strips or tiles.

    r   r&   zinvalid offsetzempty byte countN)r  r.   rr  r5  r,   r   r   )r  countsr7  r   r  r{  s         r    r  r  #  s     7mmG&\\Fw<<3v;;&&&&	As7F3344 	. 	.	6Aqq55QUU1uu
q	FAAUUqAvv-...M,----Avv2A2;rr
""r"      c              #   p  K   t          |          }d}||k     rg }|5  d}||k     rg||k     ra|                     ||                    ||         }	|                    |                     |	                     ||	z  }|dz  }||k     r||k     addd           n# 1 swxY w Y   |D ]}
|
V  ||k     dS dS )z+Return iterator over blocks read from file.r   r&   N)r.   r%   r7   r  )r   r  r  r  
buffersizelengthr   rD   rH   	bytecountr!  s              r    r  r  $  s+     \\F	A
f** 	 	D##F


###&qM	BGGI..///	!Q ##F

	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  	 	EKKKK f******s   A0BB!Bw+.memmapc                    | t          j        ||          S t          | t                    rs| dd         dk    ret	          |           dk    r
| dd         nd}t          j        ||          5 }t          j        ||||          cddd           S # 1 swxY w Y   t          | t           j                  rrt          |          t          | j
                  k    rt          d          t          j        || j                  st          d          |                     |          S t          | t          j                  rt          |           } t          j        | |||          S )	a  Return numpy array where image data of shape and dtype can be copied.

    The 'out' parameter may have the following values or types:

    None
        An empty array of shape and dtype is created and returned.
    numpy.ndarray
        An existing writable array of compatible dtype and shape. A view of
        the same array is returned after verification.
    'memmap' or 'memmap:tempdir'
        A memory-map to an array stored in a temporary binary file on disk
        is created and returned.
    str or open file
        The file name or file object used to create a memory-map to an array
        stored in a binary file on disk. The created memory-mapped array is
        returned.

    Nr   r   r  )r  suffix)rE   r=   rY   zincompatible output shapezincompatible output dtype)r<   r  r(   r   r.   tempfileNamedTemporaryFiler   r  r   rE   r,   can_castr=   rd  r  r  )r  rE   r=   rY   r7  tempdirr   s          r    r   r   $  s   & {{5%(((#s IBQB8 3 3 XX\\#abb''t(WVDDD 	I<%u4HHH	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I#u}%% "5>>WSY////8999~eSY// 	:8999{{5!!!#w|$$ #hh<5DAAAAs   0BBBc                 ~   fdd ddfd}d| v sd| v ri }|                                  D ]|}|                                }|r|d         d	k    r%|                    d
d          \  }                                t          fddD                       rn ||          |<   }|S  ||           S )aE  Return Python object from Matlab string representation.

    Return str, bool, int, float, list (Matlab arrays or cells), or
    dict (Matlab structures) types.

    Use to access ScanImage metadata.

    >>> matlabstr2py('1')
    1
    >>> matlabstr2py("['x y z' true false; 1 2.0 -3e4; NaN Inf @class]")
    [['x y z', True, False], [1, 2.0, -30000.0], [nan, inf, '@class']]
    >>> d = matlabstr2py("SI.hChannels.channelType = {'stripe' 'stripe'}\n"
    ...                  "SI.hChannels.channelsActive = 2")
    >>> d['SI.hChannels.channelType']
    ['stripe', 'stripe']

    c                 D   dg}	  |           \  }}|nt|dk    r|                     d           nM|dk    r|                     d           n1|dk    r|                     d           n|                    |           | |d          } |                    d           |S )Nr-  T;)]r-  )r-  r-  r?  )r?  r?  )rH  r7   )r   tokensrG  r   
next_tokens       r    lexzmatlabstr2py.<locals>.lexS$  s    	:a==DAqyCxxj))))cj))))cj))))a   !""A	 	cr"   c                 ^   t          |           }|dk    rdS d}||k     r#| |         dk    r|dz  }||k     r| |         dk    ||k    rd |fS | |         dv r| |         |dz   fS | |         dk    r@|dz   }||k     r#| |         dk    r|dz  }||k     r| |         dk    | ||dz            |dz   fS | |         dk    r@|dz   }||k     r#| |         dk    r|dz  }||k     r| |         dk    | ||dz            |dz   fS |}||k     r| |         d	vr|dz  }||k     r
| |         d	v| ||         |fS )
Nr   rA  r  r&   z{[;]}r  r   r   z {[;]}r.   )r   r2  r   r7  s       r    rA  z matlabstr2py.<locals>.next_tokenf$  s   QQ;;7&jjQqTS[[FA &jjQqTS[[;;7NQ47??Q4Q;Q43;;AAf**1Q f**1QQY<Q&&Q43;;AAf**1Q f**1QQY<Q&&&jjQqT11FA &jjQqT111vqyr"   Fc                                                         s S t                     dk    r2	 t                     S # t          $ r |rt	                       cY S w xY w d         dk    r2|r d         dk    sd dd         v rt	                       dd         S  d         dk    r*|r d         dk    sd dd         v rt	                       S |r)t           fddD                       rt	                       d         d	k    r S  d
v rdS  dv rdS  d d         dk    rKt          j        d  dd                             d          D                       	                                S  d d         dk    rKt          j
        d  dd                             d          D                       	                                S d v sd v r 	 t                     S # t          $ r Y nw xY w	 t                     S # t          $ r Y nw xY w	 t                     S # t          $ r |rt	                      Y nw xY w S )Nr&   r   r  r   r   r   c              3       K   | ]}|v V  	d S r   r   )r   r   r   s     r    r!   z.matlabstr2py.<locals>.value.<locals>.<genexpr>$  s'      221Q222222r"   z ';[]{}@)r  TrueT)r  FalseFr   zzeros(c                 ,    g | ]}t          |          S r   r   r   s     r    rK  z/matlabstr2py.<locals>.value.<locals>.<listcomp>$  s    CCC1ACCCr"   r  r   zones(c                 ,    g | ]}t          |          S r   r   r   s     r    rK  z/matlabstr2py.<locals>.value.<locals>.<listcomp>$  s    BBB!s1vvBBBr"   .rm   )r  r.   r   r@   r,   r*   r<   r  r  rh  onesr  )r   fails   ` r    rl   zmatlabstr2py.<locals>.value$  s   GGII 	Hq66Q;;1vv    '$,,& Q43;; #"q2w ll"QrT7NQ43;; #"q2w ll"H 	C2222	22222 	,,Q43;;H   4"""5RaR5H;CC!B$c0B0BCCCDDKKMMMRaR5G:BBq2w}}S/A/ABBBCCJJLLL!88saxxQxx   	q66M 	 	 	D		#88O 	# 	# 	# # ll"# #	# sE   = AAG" "
G/.G/3H 
HHH" "H?>H?c                 j   |                                  } 	  | d          S # t          $ r Y nw xY wg x}}|g} |           D ]}|dv rg }|                    |           |dv ro|                                }t	          |          dk    r*t          |d         t          t          f          r|d         }|d         }|                    |           |                     |                     t	          |          dk    r*t          |d         t          t          f          r|d         }|S )NT)rN  z[{z]}r&   r   r   )r  r,   r7   r   r.   r(   r  r   )r   rZ   add2levelsrG  r   rB  rl   s         r    r  zmatlabstr2py.<locals>.parse$  sF   GGII	5&&&& 	 	 	D	Q 	& 	&ADyyd####dJJLLq66Q;;:adT3K#@#@;!AbzAEE!HH%%%%v;;!
6!9tSk B BAYFs   $ 
11r  r   %r   r&   c              3       K   | ]}|v V  	d S r   r   )r   r1  r  s     r    r!   zmatlabstr2py.<locals>.<genexpr>$  s'      //a16//////r"   z	 ';[]{}<>rL  )r.  r  r  r*   )	r  r  r  r  r  r  rB  rA  rl   s	        @@@@r    r9  r9  >$  s*   *    &  6. . . .`     2 v~~%%'' 	 	D::<<D 47c>>::c1%%DAq		A////;///// 588AaDD5==r"   r   c                 P    |                      |          }|dk     r| n	| d|         S )zReturn string truncated at first null character.

    Clean NULL terminated C strings. For unicode strings use null='\0'.

    >>> stripnull(b'string\x00')
    b'string'
    >>> stripnull('string\x00', null='\0')
    'string'

    r   N)r   )r  r(  r   s      r    r   r   $  s/     	DA!ee66&!*,r"   c                     t          |           }|r+|dz  }dt          | |                   cxk     rdk     rn nn|+d}| d|dz            S )zReturn string truncated at last byte that is 7-bit ASCII.

    Clean NULL separated and terminated TIFF strings.

    >>> stripascii(b'string\x00string\n\x01\x00')
    b'string\x00string\n'
    >>> stripascii(b'\x00')
    b''

    r&   r      r   N)r.   byte2int)r  r   s     r    r  r  $  st     	FA
 	Qxq	""((((S(((((  
 'AE'?r"   s   truer  s   falser  c                     |                                                                  } | |v rdS | |v rdS t                      )zdReturn string as bool if possible, else raise TypeError.

    >>> asbool(b' False ')
    False

    TF)r  r	  r  )rl   r  r  s      r    r  r  $  sC     KKMM!!E}}t~~u
++r"   c                     |t           t          t          t          f}|D ]2}	  ||           c S # t          t
          t          t          f$ r Y /w xY w| S )zReturn argument as one of types if possible.

    >>> astype('42')
    42
    >>> astype('3.14')
    3.14
    >>> astype('True')
    True
    >>> astype(b'Neee-Wom')
    'Neee-Wom'

    )r   r  r  r  r,   rc   r  UnicodeEncodeError)rl   r  typs      r    r_  r_  %  sn     }UFI-  	3u::NI7IJ 	 	 	D	Ls   
/AA   c                 N    | |k     rd| z  S dD ]}| dz  } | |k     r	d| |fz  c S dS )zReturn file size as string from byte size.

    >>> format_size(1234)
    '1234 B'
    >>> format_size(12345678901)
    '11.50 GiB'

    z%i B)KiBMiBGiBTiBPiBg      @z%.2f %sNr   )rH   	thresholdr  s      r    r   r   %%  s`     i}3 , ,)d|++++ , ,r"   c                     | S )zOSingle argument identity function.

    >>> identityfunc('arg')
    'arg'

    r   )r  s    r    r  r  6%  s	     Jr"   c                      dS )z<Null function.

    >>> nullfunc('arg', kwarg='kwarg')

    Nr   )r	  r0   s     r    nullfuncri  @%  s	     Fr"   c                 L    	 t          |            | S # t          $ r | fcY S w xY w)z{Return tuple containing value if value is not a sequence.

    >>> sequence(1)
    (1,)
    >>> sequence([1])
    [1]

    )r.   r  r  s    r    r<  r<  I%  s=    E


   xs    ##c                     d}| D ]}||z  }|S )zReturn product of sequence of numbers.

    Equivalent of functools.reduce(operator.mul, iterable, 1).
    Multiplying numpy integers might overflow.

    >>> product([2**8, 2**30])
    274877906944
    >>> product([])
    1

    r&   r   )iterableprodr   s      r    r   r   Y%  s(     D  	Kr"   c                 X    fd}t          j        d          t          | |          S )zReturn human sorted list of strings.

    E.g. for sorting file names.

    >>> natural_sorted(['f1', 'f2', 'f10'])
    ['f1', 'f2', 'f10']

    c                 B    d t          j        |           D             S )Nc                 X    g | ]'}|                                 rt          |          n|(S r   )isdigitr   )r   r1  s     r    rK  z3natural_sorted.<locals>.sortkey.<locals>.<listcomp>v%  s/    MMM1199;;-QAMMMr"   )r  r  )r   numberss    r    sortkeyznatural_sorted.<locals>.sortkeyu%  s#    MM!8L8LMMMMr"   z(\d+)rB  )r  r  rp  )rl  rs  rr  s     @r    r   r   k%  sE    N N N N N j""G(((((r"   iZ
 c                 0    |t          j        |           z   S )zReturn datetime object from timestamp in Excel serial format.

    Convert LSM time stamps.

    >>> excel_datetime(40237.029999999795)
    datetime.datetime(2010, 2, 28, 0, 43, 11, 999982)

    )r  	timedelta)	timestampepochs     r    excel_datetimerx  |%  s     8%i0000r"   c           	      <   | dk    rdS | dz   }|dk    r(t          j        |dz
  dz            }|d|z   |dz  z
  z  }||dk    rdnd	z   }t          j        |d
z
  dz            }t          j        d|z            }t          j        ||z
  dz            }||z
  t          j        d|z            z
  }||dk     rdndz
  }	||	dk    rdndz
  }
t          |d          \  }}t          |d          \  }}t          |d          \  }}t          j        |
|	|||||          S )zReturn datetime from days since 1/1/4713 BC and ms since midnight.

    Convert Julian dates according to MetaMorph.

    >>> julian_datetime(2451576, 54362783)
    datetime.datetime(2000, 2, 2, 15, 6, 2, 783)

    iOD Nr&   i# g   @}<Ag    @r   i  i  gfffff^@g     v@gaTR'>@g      +@rY  g      @il  ik  i6 i`  i  )mathtruncr0  r  )	julianday
milisecondr|   r  r{  r1  r  rm   daymonthyearhourminuteseconds                 r    r+  r+  %  sO    GtAA7{{
A
Nh677	QY!##	Q[[TTd+A
AI'((A
6A:A
AEW$%%A
a%$*Wq[))
)Ca$hhB'E.Dj.99D*
I66FJ
D11FJT5#tVVZPPPr"   c                     | dk    s| t           j        k    rdS ddd}|                    | |           |t           j                 k    S )zcReturn if byteorder matches the system's byteorder.

    >>> byteorder_isnative('=')
    True

    r   Tr   r   r  )r   r9   rA   )r9   r$  s     r    byteorder_isnativer  %  sM     C955t#&&D88Iy))T#--@@@r"   c                     i }t          | j        j        |           D ]_\  }}|dd         \  }}|d         dk    rt          t	          |                    }n|j        dk     r|                                }|||<   `|S )zReturn numpy.recarray as dict.Nr   r&   r  )r5  r=   descrr  r   r  rh  )recarrayrZ   r  rl   r  r=   s         r    r  r  %  s     FHN0(;;  uBQBie8s??i..//EEZ!^^LLNNEtMr"   c                     ddl m} dx|r|\  d fd |                    |                     S )zReturn XML as dict.

    >>> xml2dict('<?xml version="1.0" ?><root attr="name"><key>1</key></root>')
    {'root': {'key': 1, 'attr': 'name'}}

    r   rm  r,  c                 n    t           t          t          fD ]}	  ||           c S # t          $ r Y w xY w| S r   )r   r  r  r@   )rl   rG  s     r    r_  zxml2dict.<locals>.astype%  sS    uf% 	 	Aqxx   s   
%
22c                    | j         }r|                    dd          d         }|| j        ri nd i}t          |           }|rt	          j        t                    }t          |          D ]@}|                                D ])\  }}||                              	|                     *A|	fd|                                D             i}| j        r?||         	                    	
fd| j                                        D                        | j
        rJ| j
                                        }|s| j        r|r 	|          ||         dz   <   n 	|          ||<   |S )Nr  r&   r   c                 v    i | ]5\  }}|t          |          d k    r |d                   n
 |          6S r  rD  )r   r  r  r_  s      r    r  z0xml2dict.<locals>.etree2dict.<locals>.<dictcomp>%  sR       FJaAs1vv{{vvad|||q		  r"   c              3   >   K   | ]\  }}|z    |          fV  d S r   r   )r   r  r  r_  ats      r    r!   z/xml2dict.<locals>.etree2dict.<locals>.<genexpr>%  s8      KK$!Q2666!99-KKKKKKr"   rl   )rJ  r  r  r  r  defaultdictr+  r  r7   rN   r}  r  )rG  rC  r  childrendddcr  r  r}  r_  r  
etree2dictsanitizer  s            r    r  zxml2dict.<locals>.etree2dict%  s   e 	)**S!$$R(C*""d+77 		(..B*h// , ,HHJJ , ,DAqqELL++++,     NPhhjj  A
 8 	LcFMMKKKKK!(..:J:JKKKKKK6 	&6<<>>D &18 & 8+16$<<AcF2<(#r"   )r  rn  r  )r  r  r  r  r_  r  r  r  s    `  @@@@r    r   r   %  s     0/////LB B          8 :e&&s++,,,r"   K   r  r   r   ...c                 @   t          |           }|dk     s|dk     s|dk     rdS |dk    r6d}t          ||t          |          z
  dz  |z  z  |          }|dk     rdS d}	nldt          d|z            z  }t          ||t          |dz            z
  dz  |z  z  |          }|dk     rdS d|z  t          |dz            z   }|dz
  |z  dz   }	||dk    r|}nAd
t          |          cxk     rdk     r'n n$t          t	          j        ||z                      }|d
k     r||z  }|dk    s|	dk    rd
| d	|         fg}
d}d}d|z  }n||	|k    rd
| fg}
nr|d
k    r||	|z
  z  }|| |d	         fg}
nV||k    s|dk     r||z  }d
| d	|         fg}
n7||z  }|||z
  dz
  z  }d
| d	|         f||z
  |z
  d	f||z
  | ||z
  d	         fg}
t          |          }g }|
D ]\  }} | |                    |           t          j	        |           }t          j        dd|           }t          d
t          |           |          D ]}|d|z  d|z  |dz  z            |dk    r|||z   z  n|}|d                    fdt          d
d|z  d          D                       z  }|d|t          |          z
  z  z  }|||||z            z  }|                    |           d                    |          }t          j        d
         dk    r|                    d          }|S )zReturn hexdump representation of byte string.

    >>> hexdump(binascii.unhexlify('49492a00080000000e00fe0004000100'))
    '49 49 2a 00 08 00 00 00 0e 00 fe 00 04 00 01 00 II*.............'

    r&   r   r,  r"   r   s   %%0%ix: s   %xr   Nr   s   [^\x20-\x7f]   .    c              3   2   K   | ]}||d z            V  dS )r   Nr   )r   r   r|  s     r    r!   zhexdump.<locals>.<genexpr>9&  s/      OOA1QQY<OOOOOOr"      
r   )r.   rt  absr   rz  floorrj  r7   binasciihexlifyr  subrq  r  r   version_infor  )r  r  r  snipatrt  ellipsisrH   addrbytesperlinenlinesr"  r  endend1end2rZ   hexstrstrstrr   r1  r|  s                       @r    hexdumpr  %  s    w<<Daxx5199

r{{6us4yy'8Q&>6%IJDQQ!2S...6us4!8}}'<&Bv%MNPTUU!2L 3tax==0(|+a/~1	
S[[				1					TZ0011zz&{{fkkgm|m,-.L 	6V++g,	10'%&&/*+	6		VaZZV#gdsdm$%f$v23D[4&D['$+--01
 ""HF   w?MM(###!'**($88q#g,,55 	 	Aq1uq1u|a'7778A(.

U##AOOOOq!l:JA1N1NOOOOOOAQ((AA,,--AMM!	 ZZF
aw''Mr"   c                    |                                  } t          |           dk     rdS t          j        d         dk    r^	 |                                 S # t
          $ r Y nw xY w	 |                     d                                          S # t
          $ r Y dS w xY w|                                 rdS dt          fd| D                       S )	zReturn if all characters in string are printable.

    >>> isprintable('abc')
    True
    >>> isprintable(b'')
    False

    r&   Tr   r   r  zd0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 	
c              3       K   | ]}|v V  	d S r   r   )r   r1  	printables     r    r!   zisprintable.<locals>.<genexpr>_&  s'      22a1	>222222r"   N)	r  r.   r   r  isprintabler@   r  isalnumr  )r  r  s    @r    r  r  C&  s     \\^^F
6{{Qt
a	%%''' 	 	 	D		==))55777 	 	 	DD	 >> 	4F 	 22226222222s$   A 
A#"A#'&B 
BBc                     dD ]\  }}|                      ||          } |rdD ]\  }}|                      ||          } |                                 S )z)Return string with compressed whitespace.))r  r  )rR  r  )r  r  )	r  r  r  ))r  r  )z[ r-  r  r  r  )r  r  )r  compactr|   r{  s       r    clean_whitespacer  b&  sl     & &1 1%% *U 	* 	*DAq^^Aq))FF<<>>r"   c                     	 ddl m} t          | t                    s|                     d          } |                    t          j        |                     } |                    | dd| j	        j
                  } t          |           } nJ# t          $ r= t          | t                    rt          |           } |                     dd          } Y nw xY w|                     dd	                              d
d	          S )zReturn pretty formatted XML.r   Nr  T)pretty_printxml_declarationencodingz><z>
<r  r  r  )
lxml.etreer  r(   r   r  r  r  r  r  docinfor  r  r@   r  )r  r  s     r    pformat_xmlr  r&  s    (""""""#u%% 	&**W%%Ckk"*S//**nndD3;CW  
 
 nn ( ( (c5!! 	!C..Ckk$''( ;;tS!!))$444s   B	B ACCr  c                 .   ||dk     rd}||dk     rd}t          j                    }t          j        d|           t          | t                    r| dd                                         dv r$|dk    r| dd	|z           } nwt          |           } ngt          | t                    rRt          |           rt          |           } t          |           } n$t          j        di | t          | ||d
          S |                                 } nkt          | t           j                  r|                                 } n<ddl}t          j        d         dk    ri nt#          |          } |j        | fd|i|} t          j        di | |dk    rt          | d          } | d|         S t'          |                                           }t+          |          |k    r3d                    |d|dz           dgz   || dz  d         z             } | S )zcReturn pretty formatted representation of object as string.

    Whitespace might be altered.

    Nr&   r	  rk  d   )rf  	linewidthr   )z<?xmls   <?xmlr   )r  r  rt  r   r   )r  r  Tr  r  r   )r<   get_printoptionsset_printoptionsr(   r)   r	  r  r   r  r  r  r  rstripr=  pprintr   r  r  r  r  r.  r.   r  )r  r  r  r  npoptr  argls          r    r  r  &  s7    ~!}		"$$E	SE::::#z"" :rr7==??111{{+AI+&!#&&U## 	J3 Jnn&s++&/////s%qIIIIjjll	C	&	& :jjll(+q00""d76K6K6KfnS99999	##U###{{sD1116E6{  !!D
4yy6ii]v{]+ug5fW\^^8LLMMJr"         ?c                 :   |t          | t                    rd}nd}t          |          }|                                 }g }|D ]}||                    |           t          |          }||k    r|                    |            F|}	|	|	dk    r|}	nAdt          |	          cxk     rdk     r'n n$t          t          j        ||	z                      }	|	dk     r|	|z  }	|	dk     rd}	|dk    s	||dz   k     rC|	dk    r|                    | | d                    |                    | d|                    |	dk    r%|                    || ||z
  d         z              $|	|k    s	||dz   k     r%|                    | d||z
           |z              X||z
  |z   }
|	|
dz  z
  }||
z   }|                    | d|         |z   | |d         z              t          | t                    rd	                    |          S d		                    |          S )
zcReturn string cut to specified length.

    >>> snipstr('abcdefghijklmnop', 8)
    'abc...op'

    Ns   ...u   …r&   r   r   r   r  r  )
r(   r   r.   r.  r7   r  r   rz  r  r  )r  r  r  r  r  r.  rZ   r  linelenr  splitlenr  r  s                r    r  r  &  st    fe$$ 	 HHHMME""$$J F  D  D<MM(###d))eMM&!!!=EQJJEEUa
7U?3344E199WEqyyA::**zzfeVWWo....fVeVn----aZZMM(VEEMOO%<<====g!2!2MM&55=1H<====.H8q=(D(?DMM&$-(2VDEE]BCCCC&%   !zz&!!!yy   r"   c                     	  | |          S # t           $ r> 	 | |                                         cY S # t           $ r t          d|z            w xY ww xY w)zReturn enum member from its name or value.

    >>> enumarg(TIFF.PHOTOMETRIC, 2)
    <PHOTOMETRIC.RGB: 2>
    >>> enumarg(TIFF.PHOTOMETRIC, 'RGB')
    <PHOTOMETRIC.RGB: 2>

    zinvalid argument %s)r@   r]  r,   )r  r  s     r    r\  r\  &  s}    :tCyy : : :	:		$$$$ 	: 	: 	:2S8999	::s   
 
A4AAAc                     i }|D ]}|| v r| |         ||<   | |= |                                 D ]\  }}|| v r| |         ||<   | |= |||<   |S )aX  Return dict with keys from keys|keyvals and values from kwargs|keyvals.

    Existing keys are deleted from kwargs.

    >>> kwargs = {'one': 1, 'two': 2, 'four': 4}
    >>> kwargs2 = parse_kwargs(kwargs, 'two', 'three', four=None, five=5)
    >>> kwargs == {'one': 1}
    True
    >>> kwargs2 == {'two': 2, 'four': 4, 'five': 5}
    True

    r  )r0   r$  	keyvaluesrZ   rC  rl   s         r    r'   r'   '  s     F  &== +F3Ksoo''    
U&== +F3KsF3KKMr"   c                 L    |                                 D ]\  }}|| vr|| |<   dS )zUpdate dict with keys and values if keys do not already exist.

    >>> kwargs = {'one': 1, }
    >>> update_kwargs(kwargs, one=None, two=2)
    >>> kwargs == {'one': 1, 'two': 2}
    True

    Nr  )r0   r  rC  rl   s       r    update_kwargsr  '  s@      oo''    
UfF3K   r"   jhovezMore than 50 IFDsc                 @   ddl }|                    || ddg          }d|v rz|                                D ]g}|                                }|                    d          r:|dd                             d          }|D ]}||v r n	t          |           dS fdS dS )a2  Validate TIFF file using jhove -m TIFF-hul.

    Raise ValueError if jhove outputs an error message unless the message
    contains one of the strings in 'ignore'.

    JHOVE does not support bigtiff or more than 50 IFDs.

    See `JHOVE TIFF-hul Module <http://jhove.sourceforge.net/tiff-hul.html>`_

    r   Nz-mzTIFF-huls   ErrorMessage: r  utf8)
subprocesscheck_outputr.  r  r  r  r,   )rW   r  ro  r  r  r  errorr   s           r    validate_jhover  *'  s     

!
!5(D*"E
F
FCCNN$$ 		 		D::<<D011 RSS	((00 , ,AEzz " %U+++  		 		r"   rk  rk  c                    |rt           nt          }|| }n|                                dk    rd}|r|dz  } |ddd           t          j                    }t	          |           5 }|j        s |d|d	           t          d
          |j        d         }|j        }|j	        }|j
        }	t          |          |	j        z  }
 |dt          j                    |z
  z              |d|d|d|	dt          |
          d	           |j	                            d          st          d           |ddd           t          j                    }|d         |d         z  |d         |d         z  f}|r!||d         |d         |d         |d         fz  }ddt          |          z
  z  |z   }t!          j        |dd         |	          }t!          j        |d         |d         |d         |d         f|	          }t%          |j                  }t)          |d                   D ]
}t)          |d                   D ]}t)          |d                   D ]}t)          |d                   D ]&}t+          |                                          ||<   't)          |d                   D ]}t)          |d                   D ]m}|d||d         z  |dz   |d         z  ||d         z  |dz   |d         z  f         |dd<   |r|                    ||||||fz              |ddd           nڌ |d t          j                    |z
  z             ddd           dS # 1 swxY w Y   dS )!zConvert [MP]TZCYX LSM file to series of BIN files.

    One BIN file containing 'ZCYX' data are created for each position, time,
    and tile. The position, time, and tile indices are encoded at the end
    of the filenames.

    Nnonez*_(z%ic%iy%ix%i)_m%%ip%%it%%03iy%%ix%%i.binz
Opening LSM file... r,  T)r  ru  r  )ru  znot a LSM filer   z%.3f szImage
  axes:  z

  shape: z

  dtype: z

  size:  TZCYXznot a *TZCYX LSM filez#Copying image from LSM to BIN filesr   r   r   r   r&   r   r  r   r   r   .rL  z %.3f s)print_ri  r	  r  r	   r  r,   rT   rE   r  r=   r   r>   r   rs  r.   r<   ro  iterrQ   rq  r  r/   rA  )lsmfilebinfilery  verbose
start_timer}   rT   rE   r  r=   rH   r  rD   r  rQ   r  r  rG  ru  rt  r   s                        r    lsm2binr  E'  s3     -ffXG	F	"	" @??G$"D9999J	'		 .8cz 	/GD#T****-...A{u~~.DIKK*45666ttUUUEEE;t#4#4#46	
 	
 	
 	

 {##G,, 	6455552TJJJJY[[
b	T"X%uRyDH'<< 	IrE"ItAwQ HHGCJJ'%/{59E222k59eBia$q'B%PPPV\""uQx 	= 	=A58__ = =uQx = =A"58__ 8 8"&u++"5"5"7"7Q"58__ 	= 	=!&uQx = =A%) # !DGq1uQ.? ? !DGq1uQ.? ?!A&CF
  ' F #

7aAq!_+D E E E#GCRt<<<<<=	=== 		TY[[:56777].8 .8 .8 .8 .8 .8 .8 .8 .8 .8 .8 .8 .8 .8 .8 .8 .8 .8s   'K4M((M,/M,rV  `   o      c                    	 |dv } j         j        dk    rd}|r- j        d         dv s j        dk    r j        d         dv sd}d}                                  |d	v rt           d           nt           d
            j        dk     rt          d          dk    rdd}n|r< j        d         dv r-t          j         dd           t          j         dd           n}|s{ j        d          j        d         dz  k     r\ j        d          j        d         dz  k     r= j        d         dk     r,t          j         dd           t          j         dd           |o j        d         dv }|rd
ndz  |r dd|d|d|f          n dd|d|f          |dk    r8|r6 	                                }|dk    r dz	    
                    d           n j         j        dv r|r j         j        dk    r|g	 t          t          j        t          j         	                                d                              }nC# t           $ r  j         j        dz  }Y n(w xY wt#          |t$                    s j         j        dz  }d|z  }|r2|dk     r	 d|z
  z   n|dk    r |dz
  z	    
                    d           n j         j        dk    rM 	                                }|r6|dk    r0 j         j        dk    r 
                    d            |z   nQ |z   nK j         j        dk    rd}n8 j         j        dk    r(t          j                     	                                }|s||}|É j         j        dk    rPt          j         j                   j        }t          j                   }||k    rt          j         |k              } j         j        dk    rQt          j         j                   j        }t          j                   }||k    rt          j         |k              }nd}t0          j        d         	                    dddd                                |d!d"d#d$%          		 	j        j        j                            |           n# t           $ r Y nw xY w|r!tA          |!                                          nd}"                    d&dz   z  d'|d&z  z
  d(d)d*d+,           #                    |
          }
|r9	 tI          |d-          }n# tJ          $ r Y nw xY w                    |d./           |7 j         j        d0k    rd1}n j         j        d2v s|dk    rd3}nd4}|d5k    r|d6z  } j&        t          j'         d7z                                                     f||||d8||s(                                  fd9}d: }||
_)        |_*        |_+        rtY          d7z            d t[                                                             g fd;t]                    D             }|D ]	}d|_/        
| f	fd<	 ffd=	 ffd>	}	j        0                    d?|           tc          |          D ]\  }}|2                    |ffd@	            	|
fS )Aa  Plot n-dimensional images using matplotlib.pyplot.

    Return figure, subplot and plot axis.
    Requires pyplot already imported C{from matplotlib import pyplot}.

    Parameters
    ----------
    bitspersample : int or None
        Number of bits per channel in integer RGB images.
    photometric : {'MINISWHITE', 'MINISBLACK', 'RGB', or 'PALETTE'}
        The color space of the image data.
    title : str
        Window and subplot title.
    figure : matplotlib.figure.Figure (optional).
        Matplotlib to use for plotting.
    subplot : int
        A matplotlib.pyplot.subplot axis.
    maxdim : int
        maximum image width and length.
    kwargs : optional
        Arguments for matplotlib.pyplot.imshow.

    )rV  r{  Fr   r   r   r   rU  )rc  rU  Nr   znot an imager   r   r   r   .NrX  r  r   uir&   r!  rO  r  r1  r   matplotlib.pyplotfontz
sans-serifnormal)familyweightrH   )g$@g333333@Tz1.0w)dpifigsizeframeon	facecolor	edgecolorQ?g\(\?g?gffffff?g?rN  )bottomtopleftrighthspacewspacezWindows-1252r^  )rH   r   graybufviridiscoolwarmrc  _rr9  )vminvmaxr  interpolationc                     t          | dz             } t          |dz             }	 rdd         || f         || fz  S d|| f         || fz  S # t          $ r Y dS w xY w)Nr  z%s @ %s [%4i, %4i]r&   z%s @ [%4i, %4i]r,  )r   r  )r   rt  curaxdatcurrentrD   dimss     r    format_coordzimshow.<locals>.format_coord?(  s    CLLCLL	 Q+x{1a4/@'1a.PPP$QT
Aq'999 	 	 	22	s   A  A 
AAc                     dS )Nr,  r   )r  s    r    r  zimshow.<locals>.noneJ(  s    rr"   c                     g | ]Z}                                         d d|dz   z  ddg          d|z  dj        |         dz
  dddj        |         z  	          [S )
g      ?r  r&   g333333?g?zDimension %ir   z0.5z
%%.0f [%i])r  valfmt)Sliderr  rE   )r   r   rD   pyplots     r    rK  zimshow.<locals>.<listcomp>T(  s     
 
 
  MMUDD1H$5ueDEE%
4 1$#dj&66   
 
 
r"   c                 6   |t          |                                                    d<                       d                    t          ||           D ](\  }}d|_        |                    |           d|_        )j                                         d S )Nr&   FT)r  r  set_datar5  eventsonset_valcanvasdraw)r  slidersrD   ctrlr  r  figurer  s        r    	set_imagezimshow.<locals>.set_imagec(  s    uW~~.6688HQKNN8A;'''"7G44 % %e %U### $M     r"   c                     t          t          |                     } |d<   | ||         k    rd S | |j        |         k    rd} n| dk     r|j        |         dz
  } | ||<    |           d S )Nr   r&   )r   roundrE   )r  r   rD   r  r  r  s       r    
on_changedzimshow.<locals>.on_changedm(  s    e%%EHQK%%
4(((
4(1,!GDMIgr"   c                    | j         }d         }t          |          dv r ||           d S |dk    r ||         dz   |           d S |dk    r ||         dz
  |           d S |dk    r'|t          |j                  dz
  k    rdn|dz   d<   d S |dk    r'|dk    rt          |j                  dz
  n|dz
  d<   d S |dk    r |j        |         dz
  |           d S |d	k    r d|           d S d S )
Nr   
0123456789r  r&   r  updownr  home)rC  r   r.   rE   )r  rD   r  rC  r   r  r  s        r    on_keypressedzimshow.<locals>.on_keypressedz(  sN   )CA;D3xx<''
3%%%%%
74=1,d33333
74=1,d33333#'3tz??Q+>#>#>aaD1H59QYYc$*oo11D1H
4:d+a/66666
1d##### r"   key_press_eventc                      | |          S r   r   )r  r|   r  s     r    r   zimshow.<locals>.<lambda>(  s    jjA.>.> r"   )3r=   ra  rE   r  r  rb  r,   r<   r  r  r_  r>   r   rz  ceillogr@   r(   r  rV   absoluteiinfort  finfor   modulesrcr  r  managerwindowtitler.   r.  subplots_adjustsubplotr  r  r   
atleast_2dcolorbarr  get_cursor_dataformat_cursor_datar  r  rq  drawonmpl_connectrr  r  )rD   r+  r   r  r  r<  rw  r  r  r  r-  maxdimr0   r  datamaxdtminrH   r  r  r  sliderr  r   r  r  r  r  r  r  r  r  s   `        `              @@@@@@@r    r   r   '  s{   L 8#Ez# #
2&  TY]]tz"~7O7O"<<>>D888$""$""9Daxx(((	 		0TZ^v-->$B//D>$B//DD 	0JrNTZ^q000
2B1!444
2"">$B//D>$B//D2$*R.F2U!! +C&'6'7F723C&'6')*iE((**S==19D{{3	D	 	  	4$*-22}7L8 #DIdhtxxzz1.E.E$F$F G G 8 8 8 $
 3a 78M844 	4 J/!3M]" 	$q  M 12"" 12;;s##D	C		((** 	&Ws]]z#%%{{3''g~	C			C		~d##((** <D<z#%%DJ//3y5== 9TE\22Dz#%%DJ//3y5== 9TE\22D[,-F~		&hQ	GGG[$%SV  
 
	M!(..u5555 	 	 	D	*/6s5##%%&&&Q4!8$td{" 	 	
 	
 	
 nnW%%G %	E>22EE 	 	 	D	U$$$|:?c!!DDZ_%%DDD,&&DLDFMdTk*224455#   E  	 	 	 	 	 	 	 	   (G E#E >@td{##tE'NN+33556
 
 
 
 
 d
 
 
  	" 	"F!FMM'.T 	! 	! 	! 	! 	! 	! 	! 	! *.w 	 	 	 	 	 	 	 '+G 	$ 	$ 	$ 	$ 	$ 	$ 	$& 	!!"3]CCC#G,, 	@ 	@JD$OO>>>>>????7E!!s7   	AI I,+I,$R- -
R:9R:!T2 2
T?>T?c                  R    t           j        d         } |                                  dS )z)Block the GUI. For use as skimage plugin.r  N)r   r'  showr  s    r    	_app_showr;  (  s     [,-F
KKMMMMMr"   c                      	 ddl m} ddl}n# t          $ r ddlm}m} Y nw xY w |            }|                                 |                                  |j        di | }|	                                 |S )z4Return file name(s) from Tkinter's file open dialog.r   )TkN)r=  
filedialogr   )
Tkinterr=  tkFileDialogr  tkinterr>  withdrawrN   askopenfilenamedestroy)r0   r=  r>  r  	filenamess        r    rC  rC  (  s    +))))) + + +**********+244DMMOOOKKMMM*
*44V44ILLNNNs   
 ""c                 P   t          t          j        dd                   dk     r-t          d           t          dt          j        z             dS | t          j        } ddl}|                    ddd	t          z  
          }|j        } |dddddd            |dddddd            |ddddd            |ddddd            |d d!d"d#d$%            |d&d'dd(d)            |d*d+ddd,            |d-d.ddd/            |d0d1ddd2            |d3d4ddd5            |d6d7d8dd9:            |d;d<d=d>           |	                                \  }d?
                              |j        r!ddl}|                    |j        @           dS s2t          dAt          j        B          s|                    dC           t%          fdDdED                       r/t'          j                  st          dF           dS d         |j        st          dGd?H           t+          j                    }	 t-          |j         I          }nC# t0          $ r6}|j        r t          dJ|           t          j        d           Y d}~nd}~ww xY w|j        s)t          dKt+          j                    |z
  dLz  z             |j        rdM|_        g }	|j        dk    r|j        st          dNd?H           dO }
t+          j                    }	 |j        dk    r,|                    |j        P          ||j                 dfg}	n#|j         dk    rN|                    |j         Q           |
|j         |j                  j!                  |j         |j                  fg}	ng }	tE          |j         d|j                           D ]\  }}	 |	#                    |                    |Q           |
|j!                  |j         |         f           L# tH          $ rN}|	#                    d |
|j%                  df           |j        r t          dR||fz  dSH           Y d}~d}~ww xY w|j        s)t          dKt+          j                    |z
  dLz  z             n.# t0          $ r!}|j        r t          |           Y d}~nd}~ww xY w|j        sWt                       t          t,          &                    |tO          |j(                  T                     t                       |)                                 |	r|j        dk    r	 ddl*}|+                    dU           ddVl*m,} |	D ]_\  }}}|
|j-        |j.        }}dW|j/        v rM	 ta          j1        ||t          |j/        dW         j2                  k                       }n# tH          $ r Y nw xY w|j3        r@	 |j4        dX         }|j4        dY         }||k    r|j-        |j.        }}n# tj          $ r Y nw xY w|r2tm          |          dJtm          |          dJtm          |          }n!tm          |          dZtm          |          }d[}|j7        d\vr$t          8                    |j7                  j9        }tu          |||||j;        ||j<        |j=        ]           a|>                                 dS # t~          $ r"}t          jA        d^|z             Y d}~dS d}~ww xY wdS dS )_z!Command line usage main function.r   r   g@z2This script requires Python version 2.7 or better.zThis is Python version %sNzusage: %prog [options] pathz!Display image data in TIFF files.z	%%prog %s)usager~  rf  z-pz--pagerX   r   r   zdisplay single page)destr  defaulthelpz-sz--seriesrT   z%display series of pages of same shapez--nomultifilenomultifile
store_trueFz*do not read OME series from multiple files)rH  actionrI  rJ  z	--noplotsnoplotsr   zmaximum number of plotsz
--interpolinterpolINTERPOLbilinearzimage interpolation method)rH  metavarrI  rJ  z--dpir  r  zplot resolutionz--vminr   zminimum value for colormappingz--vmaxr  zmaximum value for colormappingz--debugdebugzraise exception on failuresz	--doctestdoctestzruns the docstring examplesz-vz--detailr  r   )rH  r  rI  z-qz--quietquiet)rH  rM  r  )optionflagszSelect a TIFF file)r+  	filetypeszNo file specifiedc              3       K   | ]}|v V  	d S r   r   )r   r   r  s     r    r!   zmain.<locals>.<genexpr>)  s'      
#
#19
#
#
#
#
#
#r"   r#   zno files match the patternz
Reading file structure...)r  )r   r  z%.3f msg     @@TzReading image data... c                 4    t          d | D                       S )Nc              3      K   | ]}||V  	d S r   r   r   s     r    r!   z(main.<locals>.notnone.<locals>.<genexpr>&)  s"      66a66r"   )r  r   s    r    notnonezmain.<locals>.notnone%)  s    661666666r"   rB  )rT   z
Series %i failed: %s... r,  )r  TkAggr:  r  rV  rW  z
 rU  )r   )r+  r   r  r<  rw  r  r  zfailed to import matplotlib.
%s)Br  r   rf  printargvoptparseOptionParser__version__
add_option
parse_argsr  rT  testmodELLIPSISrC  rO   r  r  r*   r+   rU  r  r	   rK  r@   rS  exitr   norgbrN  rX   r/   rT   r  rr  r7   r,   rQ   r  r   r  r  
matplotlibuser  r   r  r  r<   rt  rl   r4  r7  r   r   rw  rT  r  r   r<  rO  r  r9  r  r   r   )r^  r_  parseroptsettingsrT  r  r3   rm   r;  r[  r   r   rh  r  imgrX   rT   r   r  r+  rw  r  s                         @r    mainrn  (  s+	   S[1$$BCCC)CK7888q|xOOO""+7k) #  F
 
CChV%BWXXXXC4    C9    C&    C)    Ce%:KLLLLC-    C-    C*    C*    CjxeQ????Cigl;;;;&&((NHd88D>>D G$4555q .&$2F
 
 
  	.LL,---

#
#
#
#d
#
#
### y 	.///1Aw> 6+5555IKKEt8+?'?@@@   > 	$NNNHQKKKKKKKK > 9iDIKK%/367888
z F!~ 	5*4444	7 	7 	7 		}!!;;8=;993x};MtTUA%% 8?;;
8? ; BCC
8?3 %cj1C83C1C&DEE 
Q 
QDAq	Q [[[22GGAH4E4EszRS}U    & Q Q QtWWQW-=-=t&DEEE#> Q!!">!Q"GRPPPPPPPPPQ > AiDIKK%$73#>?@@@ 	 	 	~ a		 > hs3x+?+?@@AAAIIKKK .("Q&&-	NN7###)))))) &, $ $!T6;%]HMd DI--$yeDIm,D,J&K&K KL    &   : FF"/
;"/
;  4<<)1$D	 $   
  >,/HHHHc$iiiiVMEE),S3t999=E*#4//"&"2"243C"D"D"IK"&"4 +"*"3 	 	 	 	 	 KKMMMMMQ  	B 	B 	BM<q@AAAAAAAAA	B. .&&s   I$ $
J$.,JJ$"B8R- AP! R- !
Q9+AQ4/R- 4Q993R- -
S7SS[5  ;W
W)(W)4X##
X0/X05
\!?\\!c                      |                     dd          }t          | i | |r t          j                                         dS dS )z"Print function with flush support.ru  FN)r   r]  r   stdoutru  )r	  r0   ru  s      r    r  r  )  sT    

7E**tv 	J	 	r"   c                     | S )zReturn string from bytes.r   r{  r  r'  s      r    r  r  )      r"   c                     | S )zReturn bytes from string.r   r   r  s     r    rj  rj  )  rs  r"   c                      t          |           S zReturn value of byte as int.)r  r{  s    r    rX  rX  )  s    1vvr"   c                       e Zd ZdS )r   Nr  r   r"   r    r   r   )  r  r"   r   strictc                     ||                      ||          S 	 |                      d|          S # t          $ r |                      d|          cY S w xY w)z)Return unicode string from encoded bytes.Nr  cp1252)r  r  rr  s      r    r  r  )  sj    88Hf---	.88GV,,,! 	. 	. 	.88Hf-----	.s   0  AAr|  c                 ,    |                      |          S )z!Return bytes from unicode string.r[  ru  s     r    rj  rj  )  s    xx!!!r"   c                     | S rw  r   rx  s    r    rX  rX  )  rs  r"   __main__)NNNr5   )NNNr   rI   )NNr   )NFr  NNNr9  )r  r  Tr  )r  )r  )r   )Nr&   )r/  )r4  r5  )r   )rY  rZ  )r_  )TN)r  r  r   r   r  rL  )r  r  T)r  r  r  )r  r  )Nr  T)Nr   NNNrV  Nr  Nr  r  )Nrz  )r|  )rr   
__future__r   r   r   r  r  r  r+   rz  r  r  r  r  r   r  r   r  r8  r  rQ  r  r&  concurrent.futuresr(  r<   ra  __docformat____all__r   r   r   r  r   r
   r	   r  r  r  r  r,   r  r   r   r   r'  rW  r_  rO   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r	  r	  r	  r	  r  r  r  r  rm  rg  rR  rn  rG  r;  rh  r_  ri  r/  r  rb  r  r  r^  rn  r  __package__r  r  r  r   r  r  r  r  r  r   rb  r  r  r)  r  r  r  r   r9  r   r  r  r_  r   r  ri  r<  r   r   fromordinalrx  r+  r  r  r   r  r  r  r  r  r  r\  r'   r  r  r  r   r;  rC  rn  r  r   longr  r  r  rj  rX  r   r   r   r   r)   r  r]  rh   rf  r   r"   r    <module>r     s  DG GR
 0 / / / / / / / 



 				 				 				                             
 %,-+ -+ -+`C6 C6 C6 C6LOC OC OC OCd    v   4C C C C C C C CL"@* @* @* @* @*v @* @* @*F&f f f f f f f fRK1 K1 K1 K1 K1v K1 K1 K1\"AH AH AH AH AH AH AH AHHG G G G Gf G G GZ	 	 	 	 	J 	 	 	J9 J9 J9 J9 J9V J9 J9 J9Zj& j& j& j& j&6 j& j& j&ZsC sC sC sC sC sC sC sCl	    &   /? /? /? /? /?F /? /? /?d       ( n * n * n * n * n *6 n * n * n *bAf f f fR  (J J J
F F F  * * *
' ' '  2 2 2  &. . .
   0
 
 
8 8 8
 
 
[ [ [|5 5 5# # #L- - -- - -- - -	 	 	  6- - -`  8  &# # #L       8> > >B     M M M`: : :z     J 			7- 7- 7- 7-t, , , ,0
  
  
 D D D,? ? ? ?D* * *Z  2  B  B% % %
4 4 4 *54 % % % %P& & &R ())H H *)H2 #$$S S %$Sl $%%F F F &%FR2 2 2 2j )**D D +*D>   <A A AB     F? ? ?2' ' ' '   0*/ */ */ */Z. . . .b# # #4   $!B !B !B !BHY Y Yx- - - -  ,      ., , , ,"         $) ) )" %-$5$A$A&$I$I 	1 	1 	1 	1Q Q Q QB
A 
A 
A  2- 2- 2- 2-jG G G GT3 3 3>    5 5 5&- - - -`7! 7! 7! 7!t: : :$  6        6B8 B8 B8 B8N 	
		
G" G" G" G"T    T T T Tn A!DyH              G    IIHeJGF. . . ." " " "  
 zCHTTVV r"   