forked from 170010011/fr
				
			
		
			
				
	
	
		
			626 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			626 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
Metadata-Version: 2.1
 | 
						|
Name: tifffile
 | 
						|
Version: 2021.2.1
 | 
						|
Summary: Read and write TIFF(r) files
 | 
						|
Home-page: https://www.lfd.uci.edu/~gohlke/
 | 
						|
Author: Christoph Gohlke
 | 
						|
Author-email: cgohlke@uci.edu
 | 
						|
License: BSD
 | 
						|
Project-URL: Bug Tracker, https://github.com/cgohlke/tifffile/issues
 | 
						|
Project-URL: Source Code, https://github.com/cgohlke/tifffile
 | 
						|
Platform: any
 | 
						|
Classifier: Development Status :: 4 - Beta
 | 
						|
Classifier: License :: OSI Approved :: BSD License
 | 
						|
Classifier: Intended Audience :: Science/Research
 | 
						|
Classifier: Intended Audience :: Developers
 | 
						|
Classifier: Operating System :: OS Independent
 | 
						|
Classifier: Programming Language :: Python :: 3 :: Only
 | 
						|
Classifier: Programming Language :: Python :: 3.7
 | 
						|
Classifier: Programming Language :: Python :: 3.8
 | 
						|
Classifier: Programming Language :: Python :: 3.9
 | 
						|
Requires-Python: >=3.7
 | 
						|
Requires-Dist: numpy (>=1.15.1)
 | 
						|
Provides-Extra: all
 | 
						|
Requires-Dist: imagecodecs (>=2021.1.11) ; extra == 'all'
 | 
						|
Requires-Dist: matplotlib (>=3.2) ; extra == 'all'
 | 
						|
Requires-Dist: lxml ; extra == 'all'
 | 
						|
 | 
						|
Read and write TIFF(r) files
 | 
						|
============================
 | 
						|
 | 
						|
Tifffile is a Python library to
 | 
						|
 | 
						|
(1) store numpy arrays in TIFF (Tagged Image File Format) files, and
 | 
						|
(2) read image and metadata from TIFF-like files used in bioimaging.
 | 
						|
 | 
						|
Image and metadata can be read from TIFF, BigTIFF, OME-TIFF, STK, LSM, SGI,
 | 
						|
NIHImage, ImageJ, MicroManager, FluoView, ScanImage, SEQ, GEL, SVS, SCN, SIS,
 | 
						|
ZIF (Zoomable Image File Format), QPTIFF (QPI), NDPI, and GeoTIFF files.
 | 
						|
 | 
						|
Image data can be read as numpy arrays or zarr arrays/groups from strips,
 | 
						|
tiles, pages (IFDs), SubIFDs, higher order series, and pyramidal levels.
 | 
						|
 | 
						|
Numpy arrays can be written to TIFF, BigTIFF, OME-TIFF, and ImageJ hyperstack
 | 
						|
compatible files in multi-page, volumetric, pyramidal, memory-mappable, tiled,
 | 
						|
predicted, or compressed form.
 | 
						|
 | 
						|
A subset of the TIFF specification is supported, mainly 8, 16, 32 and 64-bit
 | 
						|
integer, 16, 32 and 64-bit float, grayscale and multi-sample images.
 | 
						|
Specifically, CCITT and OJPEG compression, chroma subsampling without JPEG
 | 
						|
compression, color space transformations, samples with differing types, 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 larger than 4 GB.
 | 
						|
STK, LSM, FluoView, SGI, SEQ, GEL, QPTIFF, NDPI, SCN, and OME-TIFF, are custom
 | 
						|
extensions defined by Molecular Devices (Universal Imaging Corporation),
 | 
						|
Carl Zeiss MicroImaging, Olympus, Silicon Graphics International,
 | 
						|
Media Cybernetics, Molecular Dynamics, PerkinElmer, Hamamatsu, Leica, and the
 | 
						|
Open Microscopy Environment consortium, respectively.
 | 
						|
 | 
						|
For command line usage run ``python -m tifffile --help``
 | 
						|
 | 
						|
:Author:
 | 
						|
  `Christoph Gohlke <https://www.lfd.uci.edu/~gohlke/>`_
 | 
						|
 | 
						|
:Organization:
 | 
						|
  Laboratory for Fluorescence Dynamics, University of California, Irvine
 | 
						|
 | 
						|
:License: BSD 3-Clause
 | 
						|
 | 
						|
:Version: 2021.2.1
 | 
						|
 | 
						|
Requirements
 | 
						|
------------
 | 
						|
This release has been tested with the following requirements and dependencies
 | 
						|
(other versions may work):
 | 
						|
 | 
						|
* `CPython 3.7.9, 3.8.7, 3.9.1 64-bit <https://www.python.org>`_
 | 
						|
* `Numpy 1.19.5 <https://pypi.org/project/numpy/>`_
 | 
						|
* `Imagecodecs 2021.1.28 <https://pypi.org/project/imagecodecs/>`_
 | 
						|
  (required only for encoding or decoding LZW, JPEG, etc.)
 | 
						|
* `Matplotlib 3.3.3 <https://pypi.org/project/matplotlib/>`_
 | 
						|
  (required only for plotting)
 | 
						|
* `Lxml 4.6.2 <https://pypi.org/project/lxml/>`_
 | 
						|
  (required only for validating and printing XML)
 | 
						|
* `Zarr 2.6.1 <https://pypi.org/project/zarr/>`_
 | 
						|
  (required only for opening zarr storage)
 | 
						|
 | 
						|
Revisions
 | 
						|
---------
 | 
						|
2021.2.1
 | 
						|
    Pass 4384 tests.
 | 
						|
    Fix multi-threaded access of ZarrTiffStores using same TiffFile instance.
 | 
						|
    Use fallback zlib and lzma codecs with imagecodecs lite builds.
 | 
						|
    Open Olympus and Panasonic RAW files for parsing, albeit not supported.
 | 
						|
    Support X2 and X4 differencing found in DNG.
 | 
						|
    Support reading JPEG_LOSSY compression found in DNG.
 | 
						|
2021.1.14
 | 
						|
    Try ImageJ series if OME series fails (#54)
 | 
						|
    Add option to use pages as chunks in ZarrFileStore (experimental).
 | 
						|
    Fix reading from file objects with no readinto function.
 | 
						|
2021.1.11
 | 
						|
    Fix test errors on PyPy.
 | 
						|
    Fix decoding bitorder with imagecodecs >= 2021.1.11.
 | 
						|
2021.1.8
 | 
						|
    Decode float24 using imagecodecs >= 2021.1.8.
 | 
						|
    Consolidate reading of segments if possible.
 | 
						|
2020.12.8
 | 
						|
    Fix corrupted ImageDescription in multi shaped series if buffer too small.
 | 
						|
    Fix libtiff warning that ImageDescription contains null byte in value.
 | 
						|
    Fix reading invalid files using JPEG compression with palette colorspace.
 | 
						|
2020.12.4
 | 
						|
    Fix reading some JPEG compressed CFA images.
 | 
						|
    Make index of SubIFDs a tuple.
 | 
						|
    Pass through FileSequence.imread arguments in imread.
 | 
						|
    Do not apply regex flags to FileSequence axes patterns (breaking).
 | 
						|
2020.11.26
 | 
						|
    Add option to pass axes metadata to ImageJ writer.
 | 
						|
    Pad incomplete tiles passed to TiffWriter.write (#38).
 | 
						|
    Split TiffTag constructor (breaking).
 | 
						|
    Change TiffTag.dtype to TIFF.DATATYPES (breaking).
 | 
						|
    Add TiffTag.overwrite method.
 | 
						|
    Add script to change ImageDescription in files.
 | 
						|
    Add TiffWriter.overwrite_description method (WIP).
 | 
						|
2020.11.18
 | 
						|
    Support writing SEPARATED color space (#37).
 | 
						|
    Use imagecodecs.deflate codec if available.
 | 
						|
    Fix SCN and NDPI series with Z dimensions.
 | 
						|
    Add TiffReader alias for TiffFile.
 | 
						|
    TiffPage.is_volumetric returns True if ImageDepth > 1.
 | 
						|
    Zarr store getitem returns numpy arrays instead of bytes.
 | 
						|
2020.10.1
 | 
						|
    Formally deprecate unused TiffFile parameters (scikit-image #4996).
 | 
						|
2020.9.30
 | 
						|
    Allow to pass additional arguments to compression codecs.
 | 
						|
    Deprecate TiffWriter.save method (use TiffWriter.write).
 | 
						|
    Deprecate TiffWriter.save compress parameter (use compression).
 | 
						|
    Remove multifile parameter from TiffFile (breaking).
 | 
						|
    Pass all is_flag arguments from imread to TiffFile.
 | 
						|
    Do not byte-swap JPEG2000, WEBP, PNG, JPEGXR segments in TiffPage.decode.
 | 
						|
2020.9.29
 | 
						|
    Fix reading files produced by ScanImage > 2015 (#29).
 | 
						|
2020.9.28
 | 
						|
    Derive ZarrStore from MutableMapping.
 | 
						|
    Support zero shape ZarrTiffStore.
 | 
						|
    Fix ZarrFileStore with non-TIFF files.
 | 
						|
    Fix ZarrFileStore with missing files.
 | 
						|
    Cache one chunk in ZarrFileStore.
 | 
						|
    Keep track of already opened files in FileCache.
 | 
						|
    Change parse_filenames function to return zero-based indices.
 | 
						|
    Remove reopen parameter from asarray (breaking).
 | 
						|
    Rename FileSequence.fromfile to imread (breaking).
 | 
						|
2020.9.22
 | 
						|
    Add experimental zarr storage interface (WIP).
 | 
						|
    Remove unused first dimension from TiffPage.shaped (breaking).
 | 
						|
    Move reading of STK planes to series interface (breaking).
 | 
						|
    Always use virtual frames for ScanImage files.
 | 
						|
    Use DimensionOrder to determine axes order in OmeXml.
 | 
						|
    Enable writing striped volumetric images.
 | 
						|
    Keep complete dataoffsets and databytecounts for TiffFrames.
 | 
						|
    Return full size tiles from Tiffpage.segments.
 | 
						|
    Rename TiffPage.is_sgi property to is_volumetric (breaking).
 | 
						|
    Rename TiffPageSeries.is_pyramid to is_pyramidal (breaking).
 | 
						|
    Fix TypeError when passing jpegtables to non-JPEG decode method (#25).
 | 
						|
2020.9.3
 | 
						|
    Do not write contiguous series by default (breaking).
 | 
						|
    Allow to write to SubIFDs (WIP).
 | 
						|
    Fix writing F-contiguous numpy arrays (#24).
 | 
						|
2020.8.25
 | 
						|
    Do not convert EPICS timeStamp to datetime object.
 | 
						|
    Read incompletely written Micro-Manager image file stack header (#23).
 | 
						|
    Remove tag 51123 values from TiffFile.micromanager_metadata (breaking).
 | 
						|
2020.8.13
 | 
						|
    Use tifffile metadata over OME and ImageJ for TiffFile.series (breaking).
 | 
						|
    Fix writing iterable of pages with compression (#20).
 | 
						|
    Expand error checking of TiffWriter data, dtype, shape, and tile arguments.
 | 
						|
2020.7.24
 | 
						|
    Parse nested OmeXml metadata argument (WIP).
 | 
						|
    Do not lazy load TiffFrame JPEGTables.
 | 
						|
    Fix conditionally skipping some tests.
 | 
						|
2020.7.22
 | 
						|
    Do not auto-enable OME-TIFF if description is passed to TiffWriter.save.
 | 
						|
    Raise error writing empty bilevel or tiled images.
 | 
						|
    Allow to write tiled bilevel images.
 | 
						|
    Allow to write multi-page TIFF from iterable of single page images (WIP).
 | 
						|
    Add function to validate OME-XML.
 | 
						|
    Correct Philips slide width and length.
 | 
						|
2020.7.17
 | 
						|
    Initial support for writing OME-TIFF (WIP).
 | 
						|
    Return samples as separate dimension in OME series (breaking).
 | 
						|
    Fix modulo dimensions for multiple OME series.
 | 
						|
    Fix some test errors on big endian systems (#18).
 | 
						|
    Fix BytesWarning.
 | 
						|
    Allow to pass TIFF.PREDICTOR values to TiffWriter.save.
 | 
						|
2020.7.4
 | 
						|
    Deprecate support for Python 3.6 (NEP 29).
 | 
						|
    Move pyramidal subresolution series to TiffPageSeries.levels (breaking).
 | 
						|
    Add parser for SVS, SCN, NDPI, and QPI pyramidal series.
 | 
						|
    Read single-file OME-TIFF pyramids.
 | 
						|
    Read NDPI files > 4 GB (#15).
 | 
						|
    Include SubIFDs in generic series.
 | 
						|
    Preliminary support for writing packed integer arrays (#11, WIP).
 | 
						|
    Read more LSM info subrecords.
 | 
						|
    Fix missing ReferenceBlackWhite tag for YCbCr photometrics.
 | 
						|
    Fix reading lossless JPEG compressed DNG files.
 | 
						|
2020.6.3
 | 
						|
    Support os.PathLike file names (#9).
 | 
						|
2020.5.30
 | 
						|
    Re-add pure Python PackBits decoder.
 | 
						|
2020.5.25
 | 
						|
    Make imagecodecs an optional dependency again.
 | 
						|
    Disable multi-threaded decoding of small LZW compressed segments.
 | 
						|
    Fix caching of TiffPage.decode method.
 | 
						|
    Fix xml.etree.cElementTree ImportError on Python 3.9.
 | 
						|
    Fix tostring DeprecationWarning.
 | 
						|
2020.5.11
 | 
						|
    Fix reading ImageJ grayscale mode RGB images (#6).
 | 
						|
    Remove napari reader plugin.
 | 
						|
2020.5.7
 | 
						|
    Add napari reader plugin (tentative).
 | 
						|
    Fix writing single tiles larger than image data (#3).
 | 
						|
    Always store ExtraSamples values in tuple (breaking).
 | 
						|
2020.5.5
 | 
						|
    Allow to write tiled TIFF from iterable of tiles (WIP).
 | 
						|
    Add method to iterate over decoded segments of TiffPage (WIP).
 | 
						|
    Pass chunks of segments to ThreadPoolExecutor.map to reduce memory usage.
 | 
						|
    Fix reading invalid files with too many strips.
 | 
						|
    Fix writing over-aligned image data.
 | 
						|
    Detect OME-XML without declaration (#2).
 | 
						|
    Support LERC compression (WIP).
 | 
						|
    Delay load imagecodecs functions.
 | 
						|
    Remove maxsize parameter from asarray (breaking).
 | 
						|
    Deprecate ijmetadata parameter from TiffWriter.save (use metadata).
 | 
						|
2020.2.16
 | 
						|
    Add method to decode individual strips or tiles.
 | 
						|
    Read strips and tiles in order of their offsets.
 | 
						|
    Enable multi-threading when decompressing multiple strips.
 | 
						|
    Replace TiffPage.tags dictionary with TiffTags (breaking).
 | 
						|
    Replace TIFF.TAGS dictionary with TiffTagRegistry.
 | 
						|
    Remove TIFF.TAG_NAMES (breaking).
 | 
						|
    Improve handling of TiffSequence parameters in imread.
 | 
						|
    Match last uncommon parts of file paths to FileSequence pattern (breaking).
 | 
						|
    Allow letters in FileSequence pattern for indexing well plate rows.
 | 
						|
    Allow to reorder axes in FileSequence.
 | 
						|
    Allow to write > 4 GB arrays to plain TIFF when using compression.
 | 
						|
    Allow to write zero size numpy arrays to nonconformant TIFF (tentative).
 | 
						|
    Fix xml2dict.
 | 
						|
    Require imagecodecs >= 2020.1.31.
 | 
						|
    Remove support for imagecodecs-lite (breaking).
 | 
						|
    Remove verify parameter to asarray method (breaking).
 | 
						|
    Remove deprecated lzw_decode functions (breaking).
 | 
						|
    Remove support for Python 2.7 and 3.5 (breaking).
 | 
						|
2019.7.26
 | 
						|
    ...
 | 
						|
 | 
						|
Refer to the CHANGES file for older revisions.
 | 
						|
 | 
						|
Notes
 | 
						|
-----
 | 
						|
The API is not stable yet and might change between revisions.
 | 
						|
 | 
						|
Tested on little-endian platforms only.
 | 
						|
 | 
						|
Python 32-bit versions are deprecated. Python <= 3.7 are no longer supported.
 | 
						|
 | 
						|
Tifffile relies on the `imagecodecs <https://pypi.org/project/imagecodecs/>`_
 | 
						|
package for encoding and decoding LZW, JPEG, and other compressed image
 | 
						|
segments.
 | 
						|
 | 
						|
Several TIFF-like formats do not strictly adhere to the TIFF6 specification,
 | 
						|
some of which allow file or data sizes to exceed the 4 GB limit:
 | 
						|
 | 
						|
* *BigTIFF* is identified by version number 43 and uses different file
 | 
						|
  header, IFD, and tag structures with 64-bit offsets. It adds more data types.
 | 
						|
  Tifffile can read and write BigTIFF files.
 | 
						|
* *ImageJ* hyperstacks store all image data, which may exceed 4 GB,
 | 
						|
  contiguously after the first IFD. Files > 4 GB contain one IFD only.
 | 
						|
  The size (shape and dtype) of the up to 6-dimensional image data can be
 | 
						|
  determined from the ImageDescription tag of the first IFD, which is Latin-1
 | 
						|
  encoded. Tifffile can read and write ImageJ hyperstacks.
 | 
						|
* *OME-TIFF* stores up to 8-dimensional data in one or multiple TIFF of BigTIFF
 | 
						|
  files. The 8-bit UTF-8 encoded OME-XML metadata found in the ImageDescription
 | 
						|
  tag of the first IFD defines the position of TIFF IFDs in the high
 | 
						|
  dimensional data. Tifffile can read OME-TIFF files, except when the OME-XML
 | 
						|
  metadata are stored in a separate file. Tifffile can write numpy arrays
 | 
						|
  to single-file OME-TIFF.
 | 
						|
* *LSM* stores all IFDs below 4 GB but wraps around 32-bit StripOffsets.
 | 
						|
  The StripOffsets of each series and position require separate unwrapping.
 | 
						|
  The StripByteCounts tag contains the number of bytes for the uncompressed
 | 
						|
  data. Tifffile can read large LSM files.
 | 
						|
* *STK* (MetaMorph Stack) contains additional image planes stored contiguously
 | 
						|
  after the image data of the first page. The total number of planes
 | 
						|
  is equal to the counts of the UIC2tag. Tifffile can read STK files.
 | 
						|
* *NDPI* uses some 64-bit offsets in the file header, IFD, and tag structures.
 | 
						|
  Tag values/offsets can be corrected using high bits stored after IFD
 | 
						|
  structures. JPEG compressed segments with dimensions >65536 or missing
 | 
						|
  restart markers are not readable with libjpeg. Tifffile can read NDPI
 | 
						|
  files > 4 GB. JPEG segments with restart markers and dimensions >65536 can
 | 
						|
  be decoded with the imagecodecs library on Windows.
 | 
						|
* *Philips* TIFF slides store wrong ImageWidth and ImageLength tag values for
 | 
						|
  tiled pages. The values can be corrected using the DICOM_PIXEL_SPACING
 | 
						|
  attributes of the XML formatted description of the first page. Tifffile can
 | 
						|
  read Philips slides.
 | 
						|
* *ScanImage* optionally allows corrupt non-BigTIFF files > 2 GB. The values
 | 
						|
  of StripOffsets and StripByteCounts can be recovered using the constant
 | 
						|
  differences of the offsets of IFD and tag values throughout the file.
 | 
						|
  Tifffile can read such files if the image data are stored contiguously in
 | 
						|
  each page.
 | 
						|
* *GeoTIFF* sparse files allow strip or tile offsets and byte counts to be 0.
 | 
						|
  Such segments are implicitly set to 0 or the NODATA value on reading.
 | 
						|
  Tifffile can read GeoTIFF sparse files.
 | 
						|
 | 
						|
Other libraries for reading scientific TIFF files from Python:
 | 
						|
 | 
						|
* `Python-bioformats <https://github.com/CellProfiler/python-bioformats>`_
 | 
						|
* `Imread <https://github.com/luispedro/imread>`_
 | 
						|
* `GDAL <https://github.com/OSGeo/gdal/tree/master/gdal/swig/python>`_
 | 
						|
* `OpenSlide-python <https://github.com/openslide/openslide-python>`_
 | 
						|
* `PyLibTiff <https://github.com/pearu/pylibtiff>`_
 | 
						|
* `SimpleITK <https://github.com/SimpleITK/SimpleITK>`_
 | 
						|
* `PyLSM <https://launchpad.net/pylsm>`_
 | 
						|
* `PyMca.TiffIO.py <https://github.com/vasole/pymca>`_ (same as fabio.TiffIO)
 | 
						|
* `BioImageXD.Readers <http://www.bioimagexd.net/>`_
 | 
						|
* `CellCognition <https://cellcognition-project.org/>`_
 | 
						|
* `pymimage <https://github.com/ardoi/pymimage>`_
 | 
						|
* `pytiff <https://github.com/FZJ-INM1-BDA/pytiff>`_
 | 
						|
* `ScanImageTiffReaderPython
 | 
						|
  <https://gitlab.com/vidriotech/scanimagetiffreader-python>`_
 | 
						|
* `bigtiff <https://pypi.org/project/bigtiff>`_
 | 
						|
* `Large Image <https://github.com/girder/large_image>`_
 | 
						|
 | 
						|
Some libraries are using tifffile to write OME-TIFF files:
 | 
						|
 | 
						|
* `Zeiss Apeer OME-TIFF library
 | 
						|
  <https://github.com/apeer-micro/apeer-ometiff-library>`_
 | 
						|
* `Allen Institute for Cell Science imageio
 | 
						|
  <https://pypi.org/project/aicsimageio>`_
 | 
						|
* `xtiff <https://github.com/BodenmillerGroup/xtiff>`_
 | 
						|
 | 
						|
Other tools for inspecting and manipulating TIFF files:
 | 
						|
 | 
						|
* `tifftools <https://github.com/DigitalSlideArchive/tifftools>`_
 | 
						|
* `Tyf <https://github.com/Moustikitos/tyf>`_
 | 
						|
 | 
						|
References
 | 
						|
----------
 | 
						|
* TIFF 6.0 Specification and Supplements. Adobe Systems Incorporated.
 | 
						|
  https://www.adobe.io/open/standards/TIFF.html
 | 
						|
* TIFF File Format FAQ. https://www.awaresystems.be/imaging/tiff/faq.html
 | 
						|
* The BigTIFF File Format.
 | 
						|
  https://www.awaresystems.be/imaging/tiff/bigtiff.html
 | 
						|
* MetaMorph Stack (STK) Image File Format.
 | 
						|
  http://mdc.custhelp.com/app/answers/detail/a_id/18862
 | 
						|
* Image File Format Description LSM 5/7 Release 6.0 (ZEN 2010).
 | 
						|
  Carl Zeiss MicroImaging GmbH. BioSciences. May 10, 2011
 | 
						|
* The OME-TIFF format.
 | 
						|
  https://docs.openmicroscopy.org/ome-model/latest/
 | 
						|
* UltraQuant(r) Version 6.0 for Windows Start-Up Guide.
 | 
						|
  http://www.ultralum.com/images%20ultralum/pdf/UQStart%20Up%20Guide.pdf
 | 
						|
* Micro-Manager File Formats.
 | 
						|
  https://micro-manager.org/wiki/Micro-Manager_File_Formats
 | 
						|
* ScanImage BigTiff Specification - ScanImage 2016.
 | 
						|
  http://scanimage.vidriotechnologies.com/display/SI2016/
 | 
						|
  ScanImage+BigTiff+Specification
 | 
						|
* ZIF, the Zoomable Image File format. http://zif.photo/
 | 
						|
* GeoTIFF File Format https://gdal.org/drivers/raster/gtiff.html
 | 
						|
* Cloud optimized GeoTIFF.
 | 
						|
  https://github.com/cogeotiff/cog-spec/blob/master/spec.md
 | 
						|
* Tags for TIFF and Related Specifications. Digital Preservation.
 | 
						|
  https://www.loc.gov/preservation/digital/formats/content/tiff_tags.shtml
 | 
						|
* 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 a numpy array to a single-page RGB TIFF file:
 | 
						|
 | 
						|
>>> data = numpy.random.randint(0, 255, (256, 256, 3), 'uint8')
 | 
						|
>>> imwrite('temp.tif', data, photometric='rgb')
 | 
						|
 | 
						|
Read the image from the TIFF file as numpy array:
 | 
						|
 | 
						|
>>> image = imread('temp.tif')
 | 
						|
>>> image.shape
 | 
						|
(256, 256, 3)
 | 
						|
 | 
						|
Write a 3D numpy array to a multi-page, 16-bit grayscale TIFF file:
 | 
						|
 | 
						|
>>> data = numpy.random.randint(0, 2**12, (64, 301, 219), 'uint16')
 | 
						|
>>> imwrite('temp.tif', data, photometric='minisblack')
 | 
						|
 | 
						|
Read the whole image stack from the TIFF file as numpy array:
 | 
						|
 | 
						|
>>> image_stack = imread('temp.tif')
 | 
						|
>>> image_stack.shape
 | 
						|
(64, 301, 219)
 | 
						|
>>> image_stack.dtype
 | 
						|
dtype('uint16')
 | 
						|
 | 
						|
Read the image from the first page in the TIFF file as numpy array:
 | 
						|
 | 
						|
>>> image = imread('temp.tif', key=0)
 | 
						|
>>> image.shape
 | 
						|
(301, 219)
 | 
						|
 | 
						|
Read images from a selected range of pages:
 | 
						|
 | 
						|
>>> image = imread('temp.tif', key=range(4, 40, 2))
 | 
						|
>>> image.shape
 | 
						|
(18, 301, 219)
 | 
						|
 | 
						|
Iterate over all pages in the TIFF file and successively read images:
 | 
						|
 | 
						|
>>> with TiffFile('temp.tif') as tif:
 | 
						|
...     for page in tif.pages:
 | 
						|
...         image = page.asarray()
 | 
						|
 | 
						|
Get information about the image stack in the TIFF file without reading
 | 
						|
the image data:
 | 
						|
 | 
						|
>>> tif = TiffFile('temp.tif')
 | 
						|
>>> len(tif.pages)  # number of pages in the file
 | 
						|
64
 | 
						|
>>> page = tif.pages[0]  # get shape and dtype of the image in the first page
 | 
						|
>>> page.shape
 | 
						|
(301, 219)
 | 
						|
>>> page.dtype
 | 
						|
dtype('uint16')
 | 
						|
>>> page.axes
 | 
						|
'YX'
 | 
						|
>>> series = tif.series[0]  # get shape and dtype of the first image series
 | 
						|
>>> series.shape
 | 
						|
(64, 301, 219)
 | 
						|
>>> series.dtype
 | 
						|
dtype('uint16')
 | 
						|
>>> series.axes
 | 
						|
'QYX'
 | 
						|
>>> tif.close()
 | 
						|
 | 
						|
Inspect the "XResolution" tag from the first page in the TIFF file:
 | 
						|
 | 
						|
>>> with TiffFile('temp.tif') as tif:
 | 
						|
...     tag = tif.pages[0].tags['XResolution']
 | 
						|
>>> tag.value
 | 
						|
(1, 1)
 | 
						|
>>> tag.name
 | 
						|
'XResolution'
 | 
						|
>>> tag.code
 | 
						|
282
 | 
						|
>>> tag.count
 | 
						|
1
 | 
						|
>>> tag.dtype
 | 
						|
<DATATYPES.RATIONAL: 5>
 | 
						|
 | 
						|
Iterate over all tags in the TIFF file:
 | 
						|
 | 
						|
>>> with TiffFile('temp.tif') as tif:
 | 
						|
...     for page in tif.pages:
 | 
						|
...         for tag in page.tags:
 | 
						|
...             tag_name, tag_value = tag.name, tag.value
 | 
						|
 | 
						|
Overwrite the value of an existing tag, e.g. XResolution:
 | 
						|
 | 
						|
>>> with TiffFile('temp.tif', mode='r+b') as tif:
 | 
						|
...     _ = tif.pages[0].tags['XResolution'].overwrite(tif, (96000, 1000))
 | 
						|
 | 
						|
Write a floating-point ndarray and metadata using BigTIFF format, tiling,
 | 
						|
compression, and planar storage:
 | 
						|
 | 
						|
>>> data = numpy.random.rand(2, 5, 3, 301, 219).astype('float32')
 | 
						|
>>> imwrite('temp.tif', data, bigtiff=True, photometric='minisblack',
 | 
						|
...         compression='deflate', planarconfig='separate', tile=(32, 32),
 | 
						|
...         metadata={'axes': 'TZCYX'})
 | 
						|
 | 
						|
Write a volume with xyz voxel size 2.6755x2.6755x3.9474 micron^3 to an
 | 
						|
ImageJ hyperstack formatted TIFF file:
 | 
						|
 | 
						|
>>> volume = numpy.random.randn(57, 256, 256).astype('float32')
 | 
						|
>>> imwrite('temp.tif', volume, imagej=True, resolution=(1./2.6755, 1./2.6755),
 | 
						|
...         metadata={'spacing': 3.947368, 'unit': 'um', 'axes': 'ZYX'})
 | 
						|
 | 
						|
Read the volume and metadata from the ImageJ file:
 | 
						|
 | 
						|
>>> with TiffFile('temp.tif') as tif:
 | 
						|
...     volume = tif.asarray()
 | 
						|
...     axes = tif.series[0].axes
 | 
						|
...     imagej_metadata = tif.imagej_metadata
 | 
						|
>>> volume.shape
 | 
						|
(57, 256, 256)
 | 
						|
>>> axes
 | 
						|
'ZYX'
 | 
						|
>>> imagej_metadata['slices']
 | 
						|
57
 | 
						|
 | 
						|
Create an empty TIFF file and write to the memory-mapped numpy array:
 | 
						|
 | 
						|
>>> memmap_image = memmap('temp.tif', shape=(3, 256, 256), dtype='float32')
 | 
						|
>>> memmap_image[1, 255, 255] = 1.0
 | 
						|
>>> memmap_image.flush()
 | 
						|
>>> del memmap_image
 | 
						|
 | 
						|
Memory-map image data of the first page in the TIFF file:
 | 
						|
 | 
						|
>>> memmap_image = memmap('temp.tif', page=0)
 | 
						|
>>> memmap_image[1, 255, 255]
 | 
						|
1.0
 | 
						|
>>> del memmap_image
 | 
						|
 | 
						|
Write two numpy arrays to a multi-series TIFF file:
 | 
						|
 | 
						|
>>> series0 = numpy.random.randint(0, 255, (32, 32, 3), 'uint8')
 | 
						|
>>> series1 = numpy.random.randint(0, 1023, (4, 256, 256), 'uint16')
 | 
						|
>>> with TiffWriter('temp.tif') as tif:
 | 
						|
...     tif.write(series0, photometric='rgb')
 | 
						|
...     tif.write(series1, photometric='minisblack')
 | 
						|
 | 
						|
Read the second image series from the TIFF file:
 | 
						|
 | 
						|
>>> series1 = imread('temp.tif', series=1)
 | 
						|
>>> series1.shape
 | 
						|
(4, 256, 256)
 | 
						|
 | 
						|
Successively write the frames of one contiguous series to a TIFF file:
 | 
						|
 | 
						|
>>> data = numpy.random.randint(0, 255, (30, 301, 219), 'uint8')
 | 
						|
>>> with TiffWriter('temp.tif') as tif:
 | 
						|
...     for frame in data:
 | 
						|
...         tif.write(frame, contiguous=True)
 | 
						|
 | 
						|
Append an image series to the existing TIFF file:
 | 
						|
 | 
						|
>>> data = numpy.random.randint(0, 255, (301, 219, 3), 'uint8')
 | 
						|
>>> imwrite('temp.tif', data, append=True)
 | 
						|
 | 
						|
Create a TIFF file from a generator of tiles:
 | 
						|
 | 
						|
>>> data = numpy.random.randint(0, 2**12, (31, 33, 3), 'uint16')
 | 
						|
>>> def tiles(data, tileshape):
 | 
						|
...     for y in range(0, data.shape[0], tileshape[0]):
 | 
						|
...         for x in range(0, data.shape[1], tileshape[1]):
 | 
						|
...             yield data[y : y + tileshape[0], x : x + tileshape[1]]
 | 
						|
>>> imwrite('temp.tif', tiles(data, (16, 16)), tile=(16, 16),
 | 
						|
...         shape=data.shape, dtype=data.dtype)
 | 
						|
 | 
						|
Write two numpy arrays to a multi-series OME-TIFF file:
 | 
						|
 | 
						|
>>> series0 = numpy.random.randint(0, 255, (32, 32, 3), 'uint8')
 | 
						|
>>> series1 = numpy.random.randint(0, 1023, (4, 256, 256), 'uint16')
 | 
						|
>>> with TiffWriter('temp.ome.tif') as tif:
 | 
						|
...     tif.write(series0, photometric='rgb')
 | 
						|
...     tif.write(series1, photometric='minisblack',
 | 
						|
...              metadata={'axes': 'ZYX', 'SignificantBits': 10,
 | 
						|
...                        'Plane': {'PositionZ': [0.0, 1.0, 2.0, 3.0]}})
 | 
						|
 | 
						|
Write a tiled, multi-resolution, pyramidal, OME-TIFF file using
 | 
						|
JPEG compression. Sub-resolution images are written to SubIFDs:
 | 
						|
 | 
						|
>>> data = numpy.arange(1024*1024*3, dtype='uint8').reshape((1024, 1024, 3))
 | 
						|
>>> with TiffWriter('temp.ome.tif', bigtiff=True) as tif:
 | 
						|
...     options = dict(tile=(256, 256), compression='jpeg')
 | 
						|
...     tif.write(data, subifds=2, **options)
 | 
						|
...     # save pyramid levels to the two subifds
 | 
						|
...     # in production use resampling to generate sub-resolutions
 | 
						|
...     tif.write(data[::2, ::2], subfiletype=1, **options)
 | 
						|
...     tif.write(data[::4, ::4], subfiletype=1, **options)
 | 
						|
 | 
						|
Access the image levels in the pyramidal OME-TIFF file:
 | 
						|
 | 
						|
>>> baseimage = imread('temp.ome.tif')
 | 
						|
>>> second_level = imread('temp.ome.tif', series=0, level=1)
 | 
						|
>>> with TiffFile('temp.ome.tif') as tif:
 | 
						|
...     baseimage = tif.series[0].asarray()
 | 
						|
...     second_level = tif.series[0].levels[1].asarray()
 | 
						|
 | 
						|
Iterate over and decode single JPEG compressed tiles in the TIFF file:
 | 
						|
 | 
						|
>>> with TiffFile('temp.ome.tif') as tif:
 | 
						|
...     fh = tif.filehandle
 | 
						|
...     for page in tif.pages:
 | 
						|
...         for index, (offset, bytecount) in enumerate(
 | 
						|
...             zip(page.dataoffsets, page.databytecounts)
 | 
						|
...         ):
 | 
						|
...             fh.seek(offset)
 | 
						|
...             data = fh.read(bytecount)
 | 
						|
...             tile, indices, shape = page.decode(
 | 
						|
...                 data, index, jpegtables=page.jpegtables
 | 
						|
...             )
 | 
						|
 | 
						|
Use zarr to access the tiled, pyramidal images in the TIFF file:
 | 
						|
 | 
						|
>>> import zarr
 | 
						|
>>> store = imread('temp.ome.tif', aszarr=True)
 | 
						|
>>> z = zarr.open(store, mode='r')
 | 
						|
>>> z
 | 
						|
<zarr.hierarchy.Group '/' read-only>
 | 
						|
>>> z[0]  # base layer
 | 
						|
<zarr.core.Array '/0' (1024, 1024, 3) uint8 read-only>
 | 
						|
>>> store.close()
 | 
						|
 | 
						|
Read images from a sequence of TIFF files as numpy array:
 | 
						|
 | 
						|
>>> imwrite('temp_C001T001.tif', numpy.random.rand(64, 64))
 | 
						|
>>> imwrite('temp_C001T002.tif', numpy.random.rand(64, 64))
 | 
						|
>>> image_sequence = imread(['temp_C001T001.tif', 'temp_C001T002.tif'])
 | 
						|
>>> image_sequence.shape
 | 
						|
(2, 64, 64)
 | 
						|
 | 
						|
Read an image stack from a series of TIFF files with a file name pattern
 | 
						|
as numpy or zarr arrays:
 | 
						|
 | 
						|
>>> image_sequence = TiffSequence('temp_C001*.tif', pattern='axes')
 | 
						|
>>> image_sequence.shape
 | 
						|
(1, 2)
 | 
						|
>>> image_sequence.axes
 | 
						|
'CT'
 | 
						|
>>> data = image_sequence.asarray()
 | 
						|
>>> data.shape
 | 
						|
(1, 2, 64, 64)
 | 
						|
>>> with image_sequence.aszarr() as store:
 | 
						|
...     zarr.open(store, mode='r')
 | 
						|
<zarr.core.Array (1, 2, 64, 64) float64 read-only>
 | 
						|
>>> image_sequence.close()
 | 
						|
 | 
						|
 |