{"id":13634483,"url":"https://github.com/cgohlke/tifffile","last_synced_at":"2026-04-12T05:03:10.814Z","repository":{"id":37576278,"uuid":"242422272","full_name":"cgohlke/tifffile","owner":"cgohlke","description":"Read and write TIFF files.","archived":false,"fork":false,"pushed_at":"2026-03-03T19:20:14.000Z","size":2438,"stargazers_count":651,"open_issues_count":1,"forks_count":164,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-04-07T02:03:22.323Z","etag":null,"topics":["format-reader","image","imagej","life-sciences-image","numpy","ome-tiff","python","tiff","whole-slide-imaging","zarr"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/tifffile","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cgohlke.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGES.rst","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-02-22T22:43:58.000Z","updated_at":"2026-04-06T05:30:11.000Z","dependencies_parsed_at":"2026-02-25T02:01:13.335Z","dependency_job_id":null,"html_url":"https://github.com/cgohlke/tifffile","commit_stats":{"total_commits":608,"total_committers":1,"mean_commits":608.0,"dds":0.0,"last_synced_commit":"00b42ea8226018ffee11eb8888511060ac7529d9"},"previous_names":[],"tags_count":134,"template":false,"template_full_name":null,"purl":"pkg:github/cgohlke/tifffile","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cgohlke%2Ftifffile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cgohlke%2Ftifffile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cgohlke%2Ftifffile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cgohlke%2Ftifffile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cgohlke","download_url":"https://codeload.github.com/cgohlke/tifffile/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cgohlke%2Ftifffile/sbom","scorecard":{"id":272528,"data":{"date":"2025-08-11","repo":{"name":"github.com/cgohlke/tifffile","commit":"69b3484b8f8e3d0558207700f56f6034dc25cc53"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"28 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v2025.6.11 not signed: https://api.github.com/repos/cgohlke/tifffile/releases/224774844","Warn: release artifact v2025.6.1 not signed: https://api.github.com/repos/cgohlke/tifffile/releases/222312477","Warn: release artifact v2025.5.26 not signed: https://api.github.com/repos/cgohlke/tifffile/releases/221098834","Warn: release artifact v2025.5.24 not signed: https://api.github.com/repos/cgohlke/tifffile/releases/220773760","Warn: release artifact v2025.5.21 not signed: https://api.github.com/repos/cgohlke/tifffile/releases/220234384","Warn: release artifact v2025.6.11 does not have provenance: https://api.github.com/repos/cgohlke/tifffile/releases/224774844","Warn: release artifact v2025.6.1 does not have provenance: https://api.github.com/repos/cgohlke/tifffile/releases/222312477","Warn: release artifact v2025.5.26 does not have provenance: https://api.github.com/repos/cgohlke/tifffile/releases/221098834","Warn: release artifact v2025.5.24 does not have provenance: https://api.github.com/repos/cgohlke/tifffile/releases/220773760","Warn: release artifact v2025.5.21 does not have provenance: https://api.github.com/repos/cgohlke/tifffile/releases/220234384"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}}]},"last_synced_at":"2025-08-17T13:44:14.004Z","repository_id":37576278,"created_at":"2025-08-17T13:44:14.004Z","updated_at":"2025-08-17T13:44:14.004Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31704492,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T21:17:31.016Z","status":"online","status_checked_at":"2026-04-12T02:00:06.763Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["format-reader","image","imagej","life-sciences-image","numpy","ome-tiff","python","tiff","whole-slide-imaging","zarr"],"created_at":"2024-08-01T23:01:06.093Z","updated_at":"2026-04-12T05:03:10.801Z","avatar_url":"https://github.com/cgohlke.png","language":"Python","funding_links":[],"categories":["Others","🛸 Other"],"sub_categories":["🛠️ Utilities"],"readme":"..\n  This file is generated by setup.py\n\nRead and write TIFF files\n=========================\n\nTifffile is a comprehensive Python library to\n\n(1) store NumPy arrays in TIFF (Tagged Image File Format) files, and\n(2) read image and metadata from TIFF-like files used in bioimaging.\n\nImage and metadata can be read from TIFF, BigTIFF, OME-TIFF, GeoTIFF,\nAdobe DNG, ZIF (Zoomable Image File Format), MetaMorph STK, Zeiss LSM,\nImageJ hyperstack, Micro-Manager MMStack and NDTiff, SGI, NIHImage,\nOlympus FluoView and SIS, ScanImage, Molecular Dynamics GEL,\nAperio SVS, Leica SCN, Roche BIF, PerkinElmer QPTIFF (QPI, PKI),\nHamamatsu NDPI, Argos AVS, Philips DP, and ThermoFisher EER formatted files.\n\nImage data can be read as NumPy arrays or Zarr arrays/groups from strips,\ntiles, pages (IFDs), SubIFDs, higher-order series, and pyramidal levels.\n\nImage data can be written to TIFF, BigTIFF, OME-TIFF, and ImageJ hyperstack\ncompatible files in multi-page, volumetric, pyramidal, memory-mappable,\ntiled, predicted, or compressed form.\n\nMany compression schemes, predictors, and data types are supported via the\nimagecodecs library, including LZW, PackBits, Deflate, CCITT, PIXTIFF,\nLZMA, LERC, Zstd, JPEG (8 and 12-bit, lossless), JPEG 2000, JPEG XR,\nJPEG XL, WebP, PNG, EER, Jetraw, 24-bit floating-point, packed integers,\nand horizontal differencing.\n\nTifffile can also be used to inspect TIFF structures, read image data from\nmulti-dimensional file sequences, write fsspec ReferenceFileSystem for\nTIFF files and image file sequences, patch TIFF tag values, and parse\nmany proprietary metadata formats.\n\n:Author: `Christoph Gohlke \u003chttps://www.cgohlke.com\u003e`_\n:License: BSD-3-Clause\n:Version: 2026.4.11\n:DOI: `10.5281/zenodo.6795860 \u003chttps://doi.org/10.5281/zenodo.6795860\u003e`_\n\nQuickstart\n----------\n\nInstall the tifffile package and all dependencies from the\n`Python Package Index \u003chttps://pypi.org/project/tifffile/\u003e`_::\n\n    python -m pip install -U tifffile[all]\n\nTifffile is also available in other package repositories such as Anaconda,\nDebian, and MSYS2.\n\nThe tifffile library is type annotated and documented via docstrings::\n\n    python -c \"import tifffile; help(tifffile)\"\n\nTifffile can be used as a console script to inspect and preview TIFF files::\n\n    python -m tifffile --help\n\nSee `Examples`_ for using the programming interface.\n\nSource code and support are available on\n`GitHub \u003chttps://github.com/cgohlke/tifffile\u003e`_.\n\nSupport is also provided on the\n`image.sc \u003chttps://forum.image.sc/tag/tifffile\u003e`_ forum.\n\nRequirements\n------------\n\nThis revision was tested with the following requirements and dependencies\n(other versions may work):\n\n- `CPython \u003chttps://www.python.org\u003e`_ 3.12.10, 3.13.13, 3.14.4 64-bit\n- `NumPy \u003chttps://pypi.org/project/numpy\u003e`_ 2.4.4\n- `Imagecodecs \u003chttps://pypi.org/project/imagecodecs/\u003e`_ 2026.3.6\n  (required for encoding or decoding LZW, JPEG, etc. compressed segments)\n- `Matplotlib \u003chttps://pypi.org/project/matplotlib/\u003e`_ 3.10.8\n  (required for plotting)\n- `Lxml \u003chttps://pypi.org/project/lxml/\u003e`_ 6.0.3\n  (required only for validating and printing XML)\n- `Zarr \u003chttps://pypi.org/project/zarr/\u003e`_ 3.1.6\n  (required only for using Zarr stores; Zarr 2 is not compatible)\n- `Kerchunk \u003chttps://pypi.org/project/kerchunk/\u003e`_ 0.2.10\n  (required only for opening ReferenceFileSystem files)\n\nRevisions\n---------\n\n2026.4.11\n\n- Pass 5146 tests.\n- Add option to write zarr format 3 fsspec reference file system.\n- Support reading TIFF with embedded C2PA manifest.\n- Sync API of imagecodecs fallback implementations (#320).\n- Do not use defusedxml.\n- Drop support for Python 3.11.\n\n2026.3.3\n\n- Do not convert TVIPS pixel sizes to m (#319).\n- Support writing packed integers with imagecodecs \u003e 2026.1.14.\n- Support reading ccitt compressed images with imagecodecs \u003e 2026.1.14.\n\n2026.2.24\n\n- Remove deprecated TiffPages.pages and FileSequence.files (breaking).\n- Remove stripnull, stripascii, and bytestr functions (breaking).\n- Rewrite command line interfaces (breaking).\n- Support Experimenter and Project elements in OmeXml.\n- Refactor TiffPages.\n- Fix code review issues.\n\n2026.2.20\n\n- Fix rounding of high resolutions (#318).\n- Fix code review issues.\n\n2026.2.16\n\n- Optimize reading multi-file pyramidal OME TIFF files.\n\n2026.2.15\n\n- Support reading multi-file pyramidal OME TIFF files (image.sc/t/119259).\n\n2026.1.28\n\n- Deprecate colormaped parameter in imagej_description (use colormapped).\n- Fix code review issues.\n\n2026.1.14\n\n- Improve code quality.\n\n2025.12.20\n\n- Do not initialize output arrays.\n\n2025.12.12\n\n- Improve code quality.\n\n2025.10.16\n\n- Add option to decode EER super-resolution sub-pixels (breaking, #313).\n- Parse EER metadata to dict (breaking).\n\n2025.10.4\n\n- Fix parsing SVS description ending with \"|\".\n\n2025.9.30\n\n- Fix reading NDTiff series with unordered axes in index (#311).\n\n2025.9.20\n\n- Derive TiffFileError from ValueError.\n- Natural-sort files in glob pattern passed to imread by default (breaking).\n- Fix optional sorting of list of files passed to FileSequence and imread.\n\n2025.9.9\n\n- Consolidate Nuvu camera metadata.\n\n2025.8.28\n\n- Support DNG DCP files (#306).\n\n2025.6.11\n\n- Fix reading images with dimension length 1 through Zarr (#303).\n\n2025.6.1\n\n- Add experimental option to write iterator of bytes and bytecounts (#301).\n\n2025.5.26\n\n- Use threads in Zarr stores.\n\n2025.5.24\n\n- Fix incorrect tags created by Philips DP v1.1 (#299).\n- Make Zarr stores partially listable.\n\n2025.5.21\n\n- Move Zarr stores to tifffile.zarr namespace (breaking).\n- Require Zarr 3 for Zarr stores and remove support for Zarr 2 (breaking).\n- Drop support for Python 3.10.\n\n2025.5.10\n\n- Raise ValueError when using Zarr 3 (#296).\n- Fall back to compression.zstd on Python \u003e= 3.14 if no imagecodecs.\n- Remove doctest command line option.\n- Support Python 3.14.\n\n2025.3.30\n\n- Fix for imagecodecs 2025.3.30.\n\n2025.3.13\n\n- …\n\nRefer to the CHANGES file for older revisions.\n\nNotes\n-----\n\nTIFF, the Tagged Image File Format, was created by the Aldus Corporation and\nAdobe Systems Incorporated.\n\nTifffile supports a large subset of the TIFF6 specification, mainly 1-32,\nand 64-bit integer, 16, 32, and 64-bit float, grayscale and multi-sample\nimages.\nSpecifically, OJPEG compression, chroma subsampling without JPEG compression,\ncolor space transformations, samples with differing types, or IPTC, ICC,\nand XMP metadata are not implemented.\n\nBesides classic TIFF, tifffile supports several TIFF-like formats that do not\nstrictly adhere to the TIFF6 specification. Some formats extend TIFF\ncapabilities in various ways, including exceeding the 4 GB limit,\nhandling multi-dimensional data, or working around format constraints:\n\n- **BigTIFF** is identified by version number 43 and uses different file\n  header, IFD, and tag structures with 64-bit offsets. The format also adds\n  64-bit data types. Tifffile can read and write BigTIFF files.\n- **ImageJ hyperstacks** store all image data, which may exceed 4 GB,\n  contiguously after the first IFD. Files \u003e 4 GB contain one IFD only.\n  The size and shape of the up to 6-dimensional image data can be determined\n  from the ImageDescription tag of the first IFD, which is Latin-1 encoded.\n  Tifffile can read and write ImageJ hyperstacks.\n- **OME-TIFF** files store up to 8-dimensional image data in one or multiple\n  TIFF or BigTIFF files. The UTF-8 encoded OME-XML metadata found in the\n  ImageDescription tag of the first IFD defines the position of TIFF IFDs in\n  the high-dimensional image data. Tifffile can read OME-TIFF files\n  and write NumPy arrays to single-file OME-TIFF.\n- **Micro-Manager NDTiff** stores multi-dimensional image data in one\n  or more classic TIFF files. Metadata contained in a separate NDTiff.index\n  binary file defines the position of the TIFF IFDs in the image array.\n  Each TIFF file also contains metadata in a non-TIFF binary structure at\n  offset 8. Downsampled image data of pyramidal datasets are stored in\n  separate folders. Tifffile can read NDTiff files. Version 0 and 1 series,\n  tiling, stitching, and multi-resolution pyramids are not supported.\n- **Micro-Manager MMStack** stores 6-dimensional image data in one or more\n  classic TIFF files. Metadata contained in non-TIFF binary structures and\n  JSON strings define the image stack dimensions and the position of the image\n  frame data in the file and the image stack. The TIFF structures and metadata\n  are often corrupted or wrong. Tifffile can read MMStack files.\n- **Carl Zeiss LSM** files store all IFDs below 4 GB and wrap around 32-bit\n  StripOffsets pointing to image data above 4 GB. The StripOffsets of each\n  series and position require separate unwrapping. The StripByteCounts tag\n  contains the number of bytes for the uncompressed data. Tifffile can read\n  LSM files of any size.\n- **MetaMorph STK** files contain additional image planes stored\n  contiguously after the image data of the first page. The total number of\n  planes is equal to the count of the UIC2 tag. Tifffile can read STK files.\n- **ZIF**, the Zoomable Image File format, is a subspecification of BigTIFF\n  with SGI's ImageDepth extension and additional compression schemes.\n  Only little-endian, tiled, interleaved, 8-bit per sample images with\n  JPEG, PNG, JPEG XR, and JPEG 2000 compression are allowed. Tifffile can\n  read and write ZIF files.\n- **Hamamatsu NDPI** files use some 64-bit offsets in the file header, IFD,\n  and tag structures. Single, LONG typed tag values can exceed 32-bit.\n  The high bytes of 64-bit tag values and offsets are stored after IFD\n  structures. Tifffile can read NDPI files \u003e 4 GB.\n  JPEG compressed segments with dimensions \u003e65530 or missing restart markers\n  cannot be decoded with common JPEG libraries. Tifffile works around this\n  limitation by separately decoding the MCUs between restart markers, which\n  performs poorly. BitsPerSample, SamplesPerPixel, and\n  PhotometricInterpretation tags may contain wrong values, which can be\n  corrected using the value of tag 65441.\n- **Philips TIFF** slides store padded ImageWidth and ImageLength tag values\n  for tiled pages. The values can be corrected using the DICOM_PIXEL_SPACING\n  attributes of the XML formatted description of the first page. Tile offsets\n  and byte counts may be 0. Tifffile can read Philips slides.\n- **Ventana/Roche BIF** slides store tiles and metadata in a BigTIFF container.\n  Tiles may overlap and require stitching based on the TileJointInfo elements\n  in the XMP tag. Volumetric scans are stored using the ImageDepth extension.\n  Tifffile can read BIF and decode individual tiles but does not perform\n  stitching.\n- **ScanImage** optionally allows corrupted non-BigTIFF files \u003e 2 GB.\n  The values of StripOffsets and StripByteCounts can be recovered using the\n  constant differences of the offsets of IFD and tag values throughout the\n  file. Tifffile can read such files if the image data are stored contiguously\n  in each page.\n- **GeoTIFF sparse** files allow strip or tile offsets and byte counts to be 0.\n  Such segments are implicitly set to 0 or the NODATA value on reading.\n  Tifffile can read GeoTIFF sparse files.\n- **Tifffile shaped** files store the array shape and user-provided metadata\n  of multi-dimensional image series in JSON format in the ImageDescription tag\n  of the first page of the series. The format allows multiple series,\n  SubIFDs, sparse segments with zero offset and byte count, and truncated\n  series, where only the first page of a series is present, and the image data\n  are stored contiguously. No other software besides Tifffile supports the\n  truncated format.\n\nOther libraries for reading, writing, inspecting, or manipulating scientific\nTIFF files from Python are\n`bioio \u003chttps://github.com/bioio-devs/bioio\u003e`_,\n`aicsimageio \u003chttps://github.com/AllenCellModeling/aicsimageio\u003e`_,\n`apeer-ometiff-library\n\u003chttps://github.com/apeer-micro/apeer-ometiff-library\u003e`_,\n`bigtiff \u003chttps://pypi.org/project/bigtiff\u003e`_,\n`fabio.TiffIO \u003chttps://github.com/silx-kit/fabio\u003e`_,\n`GDAL \u003chttps://github.com/OSGeo/gdal/\u003e`_,\n`imread \u003chttps://github.com/luispedro/imread\u003e`_,\n`large_image \u003chttps://github.com/girder/large_image\u003e`_,\n`openslide-python \u003chttps://github.com/openslide/openslide-python\u003e`_,\n`opentile \u003chttps://github.com/imi-bigpicture/opentile\u003e`_,\n`pylibtiff \u003chttps://github.com/pearu/pylibtiff\u003e`_,\n`pylsm \u003chttps://launchpad.net/pylsm\u003e`_,\n`pymimage \u003chttps://github.com/ardoi/pymimage\u003e`_,\n`python-bioformats \u003chttps://github.com/CellProfiler/python-bioformats\u003e`_,\n`pytiff \u003chttps://github.com/FZJ-INM1-BDA/pytiff\u003e`_,\n`scanimagetiffreader-python\n\u003chttps://gitlab.com/vidriotech/scanimagetiffreader-python\u003e`_,\n`SimpleITK \u003chttps://github.com/SimpleITK/SimpleITK\u003e`_,\n`slideio \u003chttps://gitlab.com/bioslide/slideio\u003e`_,\n`tiffslide \u003chttps://github.com/bayer-science-for-a-better-life/tiffslide\u003e`_,\n`tifftools \u003chttps://github.com/DigitalSlideArchive/tifftools\u003e`_,\n`tyf \u003chttps://github.com/Moustikitos/tyf\u003e`_,\n`xtiff \u003chttps://github.com/BodenmillerGroup/xtiff\u003e`_, and\n`ndtiff \u003chttps://github.com/micro-manager/NDTiffStorage\u003e`_.\n\nReferences\n----------\n\n- TIFF 6.0 Specification and Supplements. Adobe Systems Incorporated.\n  https://www.adobe.io/open/standards/TIFF.html\n  https://download.osgeo.org/libtiff/doc/\n- TIFF File Format FAQ. https://www.awaresystems.be/imaging/tiff/faq.html\n- The BigTIFF File Format.\n  https://www.awaresystems.be/imaging/tiff/bigtiff.html\n- MetaMorph Stack (STK) Image File Format.\n  http://mdc.custhelp.com/app/answers/detail/a_id/18862\n- Image File Format Description LSM 5/7 Release 6.0 (ZEN 2010).\n  Carl Zeiss MicroImaging GmbH. BioSciences. May 10, 2011\n- The OME-TIFF format.\n  https://docs.openmicroscopy.org/ome-model/latest/\n- UltraQuant(r) Version 6.0 for Windows Start-Up Guide.\n  http://www.ultralum.com/images%20ultralum/pdf/UQStart%20Up%20Guide.pdf\n- Micro-Manager File Formats.\n  https://micro-manager.org/wiki/Micro-Manager_File_Formats\n- ScanImage BigTiff Specification.\n  https://docs.scanimage.org/Appendix/ScanImage+BigTiff+Specification.html\n- ZIF, the Zoomable Image File format. https://zif.photo/\n- GeoTIFF File Format. https://gdal.org/drivers/raster/gtiff.html\n- Cloud optimized GeoTIFF.\n  https://github.com/cogeotiff/cog-spec/blob/master/spec.md\n- Tags for TIFF and Related Specifications. Digital Preservation.\n  https://www.loc.gov/preservation/digital/formats/content/tiff_tags.shtml\n- CIPA DC-008-2016: Exchangeable image file format for digital still cameras:\n  Exif Version 2.31.\n  http://www.cipa.jp/std/documents/e/DC-008-Translation-2016-E.pdf\n- The EER (Electron Event Representation) file format.\n  https://github.com/fei-company/EerReaderLib\n- Digital Negative (DNG) Specification. Version 1.7.1.0, September 2023.\n  https://helpx.adobe.com/content/dam/help/en/photoshop/pdf/DNG_Spec_1_7_1_0.pdf\n- Roche Digital Pathology. BIF image file format for digital pathology.\n  https://diagnostics.roche.com/content/dam/diagnostics/Blueprint/en/pdf/rmd/Roche-Digital-Pathology-BIF-Whitepaper.pdf\n- Astro-TIFF specification. https://astro-tiff.sourceforge.io/\n- Aperio Technologies, Inc. Digital Slides and Third-Party Data Interchange.\n  Aperio_Digital_Slides_and_Third-party_data_interchange.pdf\n- PerkinElmer image format.\n  https://downloads.openmicroscopy.org/images/Vectra-QPTIFF/perkinelmer/PKI_Image%20Format.docx\n- NDTiffStorage. https://github.com/micro-manager/NDTiffStorage\n- Argos AVS File Format.\n  https://github.com/user-attachments/files/15580286/ARGOS.AVS.File.Format.pdf\n\nExamples\n--------\n\nWrite a NumPy array to a single-page RGB TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import numpy\n    \u003e\u003e\u003e data = numpy.random.randint(0, 255, (256, 256, 3), 'uint8')\n    \u003e\u003e\u003e imwrite('temp.tif', data, photometric='rgb')\n\nRead the image from the TIFF file as NumPy array:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e image = imread('temp.tif')\n    \u003e\u003e\u003e image.shape\n    (256, 256, 3)\n\nUse the `photometric` and `planarconfig` arguments to write a 3x3x3 NumPy\narray to an interleaved RGB, a planar RGB, or a 3-page grayscale TIFF:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e data = numpy.random.randint(0, 255, (3, 3, 3), 'uint8')\n    \u003e\u003e\u003e imwrite('temp.tif', data, photometric='rgb')\n    \u003e\u003e\u003e imwrite('temp.tif', data, photometric='rgb', planarconfig='separate')\n    \u003e\u003e\u003e imwrite('temp.tif', data, photometric='minisblack')\n\nUse the `extrasamples` argument to specify how extra components are\ninterpreted, for example, for an RGBA image with unassociated alpha channel:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e data = numpy.random.randint(0, 255, (256, 256, 4), 'uint8')\n    \u003e\u003e\u003e imwrite('temp.tif', data, photometric='rgb', extrasamples=['unassalpha'])\n\nWrite a 3-dimensional NumPy array to a multi-page, 16-bit grayscale TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e data = numpy.random.randint(0, 2**12, (64, 301, 219), 'uint16')\n    \u003e\u003e\u003e imwrite('temp.tif', data, photometric='minisblack')\n\nRead the whole image stack from the multi-page TIFF file as NumPy array:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e image_stack = imread('temp.tif')\n    \u003e\u003e\u003e image_stack.shape\n    (64, 301, 219)\n    \u003e\u003e\u003e image_stack.dtype\n    dtype('uint16')\n\nRead the image from the first page in the TIFF file as NumPy array:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e image = imread('temp.tif', key=0)\n    \u003e\u003e\u003e image.shape\n    (301, 219)\n\nRead images from a selected range of pages:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e images = imread('temp.tif', key=range(4, 40, 2))\n    \u003e\u003e\u003e images.shape\n    (18, 301, 219)\n\nIterate over all pages in the TIFF file and successively read images:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e with TiffFile('temp.tif') as tif:\n    ...     for page in tif.pages:\n    ...         image = page.asarray()\n    ...\n\nGet information about the image stack in the TIFF file without reading\nany image data:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e tif = TiffFile('temp.tif')\n    \u003e\u003e\u003e len(tif.pages)  # number of pages in the file\n    64\n    \u003e\u003e\u003e page = tif.pages[0]  # get shape and dtype of image in first page\n    \u003e\u003e\u003e page.shape\n    (301, 219)\n    \u003e\u003e\u003e page.dtype\n    dtype('uint16')\n    \u003e\u003e\u003e page.axes\n    'YX'\n    \u003e\u003e\u003e series = tif.series[0]  # get shape and dtype of first image series\n    \u003e\u003e\u003e series.shape\n    (64, 301, 219)\n    \u003e\u003e\u003e series.dtype\n    dtype('uint16')\n    \u003e\u003e\u003e series.axes\n    'QYX'\n    \u003e\u003e\u003e tif.close()\n\nInspect the \"XResolution\" tag from the first page in the TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e with TiffFile('temp.tif') as tif:\n    ...     tag = tif.pages[0].tags['XResolution']\n    ...\n    \u003e\u003e\u003e tag.value\n    (1, 1)\n    \u003e\u003e\u003e tag.name\n    'XResolution'\n    \u003e\u003e\u003e tag.code\n    282\n    \u003e\u003e\u003e tag.count\n    1\n    \u003e\u003e\u003e tag.dtype\n    \u003cDATATYPE.RATIONAL: 5\u003e\n\nIterate over all tags in the TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e with TiffFile('temp.tif') as tif:\n    ...     for page in tif.pages:\n    ...         for tag in page.tags:\n    ...             tag_name, tag_value = tag.name, tag.value\n    ...\n\nOverwrite the value of an existing tag, for example, XResolution:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e with TiffFile('temp.tif', mode='r+') as tif:\n    ...     _ = tif.pages[0].tags['XResolution'].overwrite((96000, 1000))\n    ...\n\nWrite a 5-dimensional floating-point array using BigTIFF format, separate\ncolor components, tiling, Zlib compression level 8, horizontal differencing\npredictor, and additional metadata:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e data = numpy.random.rand(2, 5, 3, 301, 219).astype('float32')\n    \u003e\u003e\u003e imwrite(\n    ...     'temp.tif',\n    ...     data,\n    ...     bigtiff=True,\n    ...     photometric='rgb',\n    ...     planarconfig='separate',\n    ...     tile=(32, 32),\n    ...     compression='zlib',\n    ...     compressionargs={'level': 8},\n    ...     predictor=True,\n    ...     metadata={'axes': 'TZCYX'},\n    ... )\n\nWrite a 10 fps time series of volumes with xyz voxel size 2.6755x2.6755x3.9474\nmicron^3 to an ImageJ hyperstack formatted TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e volume = numpy.random.randn(6, 57, 256, 256).astype('float32')\n    \u003e\u003e\u003e image_labels = [f'{i}' for i in range(volume.shape[0] * volume.shape[1])]\n    \u003e\u003e\u003e imwrite(\n    ...     'temp.tif',\n    ...     volume,\n    ...     imagej=True,\n    ...     resolution=(1.0 / 2.6755, 1.0 / 2.6755),\n    ...     metadata={\n    ...         'spacing': 3.947368,\n    ...         'unit': 'um',\n    ...         'finterval': 1 / 10,\n    ...         'fps': 10.0,\n    ...         'axes': 'TZYX',\n    ...         'Labels': image_labels,\n    ...     },\n    ... )\n\nRead the volume and metadata from the ImageJ hyperstack file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e with TiffFile('temp.tif') as tif:\n    ...     volume = tif.asarray()\n    ...     axes = tif.series[0].axes\n    ...     imagej_metadata = tif.imagej_metadata\n    ...\n    \u003e\u003e\u003e volume.shape\n    (6, 57, 256, 256)\n    \u003e\u003e\u003e axes\n    'TZYX'\n    \u003e\u003e\u003e imagej_metadata['slices']\n    57\n    \u003e\u003e\u003e imagej_metadata['frames']\n    6\n\nMemory-map the contiguous image data in the ImageJ hyperstack file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e memmap_volume = memmap('temp.tif')\n    \u003e\u003e\u003e memmap_volume.shape\n    (6, 57, 256, 256)\n    \u003e\u003e\u003e del memmap_volume\n\nCreate a TIFF file containing an empty image and write to the memory-mapped\nNumPy array (note: this does not work with compression or tiling):\n\n.. code-block:: python\n\n    \u003e\u003e\u003e memmap_image = memmap(\n    ...     'temp.tif', shape=(256, 256, 3), dtype='float32', photometric='rgb'\n    ... )\n    \u003e\u003e\u003e type(memmap_image)\n    \u003cclass 'numpy.memmap'\u003e\n    \u003e\u003e\u003e memmap_image[255, 255, 1] = 1.0\n    \u003e\u003e\u003e memmap_image.flush()\n    \u003e\u003e\u003e del memmap_image\n\nWrite two NumPy arrays to a multi-series TIFF file (note: other TIFF readers\nwill not recognize the two series; use the OME-TIFF format for better\ninteroperability):\n\n.. code-block:: python\n\n    \u003e\u003e\u003e series0 = numpy.random.randint(0, 255, (32, 32, 3), 'uint8')\n    \u003e\u003e\u003e series1 = numpy.random.randint(0, 255, (4, 256, 256), 'uint16')\n    \u003e\u003e\u003e with TiffWriter('temp.tif') as tif:\n    ...     tif.write(series0, photometric='rgb')\n    ...     tif.write(series1, photometric='minisblack')\n    ...\n\nRead the second image series from the TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e series1 = imread('temp.tif', series=1)\n    \u003e\u003e\u003e series1.shape\n    (4, 256, 256)\n\nSuccessively write the frames of one contiguous series to a TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e data = numpy.random.randint(0, 255, (30, 301, 219), 'uint8')\n    \u003e\u003e\u003e with TiffWriter('temp.tif') as tif:\n    ...     for frame in data:\n    ...         tif.write(frame, contiguous=True)\n    ...\n\nAppend an image series to the existing TIFF file (note: this does not work\nwith ImageJ hyperstack or OME-TIFF files):\n\n.. code-block:: python\n\n    \u003e\u003e\u003e data = numpy.random.randint(0, 255, (301, 219, 3), 'uint8')\n    \u003e\u003e\u003e imwrite('temp.tif', data, photometric='rgb', append=True)\n\nCreate a TIFF file from a generator of tiles:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e data = numpy.random.randint(0, 2**12, (31, 33, 3), 'uint16')\n    \u003e\u003e\u003e def tiles(data, tileshape):\n    ...     for y in range(0, data.shape[0], tileshape[0]):\n    ...         for x in range(0, data.shape[1], tileshape[1]):\n    ...             yield data[y : y + tileshape[0], x : x + tileshape[1]]\n    ...\n    \u003e\u003e\u003e imwrite(\n    ...     'temp.tif',\n    ...     tiles(data, (16, 16)),\n    ...     tile=(16, 16),\n    ...     shape=data.shape,\n    ...     dtype=data.dtype,\n    ...     photometric='rgb',\n    ... )\n\nWrite a multi-dimensional, multi-resolution (pyramidal), multi-series OME-TIFF\nfile with optional metadata. Sub-resolution images are written to SubIFDs.\nLimit parallel encoding to 2 threads. Write a thumbnail image as a separate\nimage series:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e data = numpy.random.randint(0, 255, (8, 2, 512, 512, 3), 'uint8')\n    \u003e\u003e\u003e subresolutions = 2\n    \u003e\u003e\u003e pixelsize = 0.29  # micrometer\n    \u003e\u003e\u003e with TiffWriter('temp.ome.tif', bigtiff=True) as tif:\n    ...     metadata = {\n    ...         'axes': 'TCYXS',\n    ...         'SignificantBits': 8,\n    ...         'TimeIncrement': 0.1,\n    ...         'TimeIncrementUnit': 's',\n    ...         'PhysicalSizeX': pixelsize,\n    ...         'PhysicalSizeXUnit': 'µm',\n    ...         'PhysicalSizeY': pixelsize,\n    ...         'PhysicalSizeYUnit': 'µm',\n    ...         'Channel': {'Name': ['Channel 1', 'Channel 2']},\n    ...         'Plane': {'PositionX': [0.0] * 16, 'PositionXUnit': ['µm'] * 16},\n    ...         'Description': 'A multi-dimensional, multi-resolution image',\n    ...         'MapAnnotation': {  # for OMERO\n    ...             'Namespace': 'openmicroscopy.org/PyramidResolution',\n    ...             '1': '256 256',\n    ...             '2': '128 128',\n    ...         },\n    ...     }\n    ...     options = dict(\n    ...         photometric='rgb',\n    ...         tile=(128, 128),\n    ...         compression='jpeg',\n    ...         resolutionunit='CENTIMETER',\n    ...         maxworkers=2,\n    ...     )\n    ...     tif.write(\n    ...         data,\n    ...         subifds=subresolutions,\n    ...         resolution=(1e4 / pixelsize, 1e4 / pixelsize),\n    ...         metadata=metadata,\n    ...         **options,\n    ...     )\n    ...     # write pyramid levels to the two subifds\n    ...     # in production use resampling to generate sub-resolution images\n    ...     for level in range(subresolutions):\n    ...         mag = 2 ** (level + 1)\n    ...         tif.write(\n    ...             data[..., ::mag, ::mag, :],\n    ...             subfiletype=1,  # FILETYPE.REDUCEDIMAGE\n    ...             resolution=(1e4 / mag / pixelsize, 1e4 / mag / pixelsize),\n    ...             **options,\n    ...         )\n    ...     # add a thumbnail image as a separate series\n    ...     # it is recognized by QuPath as an associated image\n    ...     thumbnail = (data[0, 0, ::8, ::8] \u003e\u003e 2).astype('uint8')\n    ...     tif.write(thumbnail, metadata={'Name': 'thumbnail'})\n    ...\n\nAccess the image levels in the pyramidal OME-TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e baseimage = imread('temp.ome.tif')\n    \u003e\u003e\u003e second_level = imread('temp.ome.tif', series=0, level=1)\n    \u003e\u003e\u003e with TiffFile('temp.ome.tif') as tif:\n    ...     baseimage = tif.series[0].asarray()\n    ...     second_level = tif.series[0].levels[1].asarray()\n    ...     number_levels = len(tif.series[0].levels)  # includes base level\n    ...\n\nIterate over and decode single JPEG compressed tiles in the TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e with TiffFile('temp.ome.tif') as tif:\n    ...     fh = tif.filehandle\n    ...     for page in tif.pages:\n    ...         for index, (offset, bytecount) in enumerate(\n    ...             zip(page.dataoffsets, page.databytecounts)\n    ...         ):\n    ...             _ = fh.seek(offset)\n    ...             data = fh.read(bytecount)\n    ...             tile, indices, shape = page.decode(\n    ...                 data, index, jpegtables=page.jpegtables\n    ...             )\n    ...\n\nUse Zarr to read parts of the tiled, pyramidal images in the TIFF file:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import zarr\n    \u003e\u003e\u003e store = imread('temp.ome.tif', aszarr=True)\n    \u003e\u003e\u003e z = zarr.open(store, mode='r')\n    \u003e\u003e\u003e z\n    \u003cGroup ZarrTiffStore\u003e\n    \u003e\u003e\u003e z['0']  # base layer\n     \u003cArray ZarrTiffStore/0 shape=(8, 2, 512, 512, 3) dtype=uint8\u003e\n    \u003e\u003e\u003e z['0'][2, 0, 128:384, 256:].shape  # read a tile from the base layer\n    (256, 256, 3)\n    \u003e\u003e\u003e store.close()\n\nLoad the base layer from the Zarr store as a dask array:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e import dask.array\n    \u003e\u003e\u003e store = imread('temp.ome.tif', aszarr=True)\n    \u003e\u003e\u003e dask.array.from_zarr(store, '0', zarr_format=2)\n    dask.array\u003c...shape=(8, 2, 512, 512, 3)...chunksize=(1, 1, 128, 128, 3)...\n    \u003e\u003e\u003e store.close()\n\nWrite the Zarr store to a fsspec ReferenceFileSystem in JSON format:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e store = imread('temp.ome.tif', aszarr=True)\n    \u003e\u003e\u003e store.write_fsspec('temp.ome.tif.json', url='file://')\n    \u003e\u003e\u003e store.close()\n\nOpen the fsspec ReferenceFileSystem as a Zarr group:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e from kerchunk.utils import refs_as_store\n    \u003e\u003e\u003e import imagecodecs.numcodecs\n    \u003e\u003e\u003e imagecodecs.numcodecs.register_codecs(verbose=False)\n    \u003e\u003e\u003e z = zarr.open(refs_as_store('temp.ome.tif.json'), mode='r')\n    \u003e\u003e\u003e z\n    \u003cGroup \u003cFsspecStore(ReferenceFileSystem, /)\u003e\u003e\n\nCreate an OME-TIFF file containing an empty, tiled image series and write\nto it via the Zarr interface (note: this does not work with compression):\n\n.. code-block:: python\n\n    \u003e\u003e\u003e imwrite(\n    ...     'temp2.ome.tif',\n    ...     shape=(8, 800, 600),\n    ...     dtype='uint16',\n    ...     photometric='minisblack',\n    ...     tile=(128, 128),\n    ...     metadata={'axes': 'CYX'},\n    ... )\n    \u003e\u003e\u003e store = imread('temp2.ome.tif', mode='r+', aszarr=True)\n    \u003e\u003e\u003e z = zarr.open(store, mode='r+')\n    \u003e\u003e\u003e z\n    \u003cArray ZarrTiffStore shape=(8, 800, 600) dtype=uint16\u003e\n    \u003e\u003e\u003e z[3, 100:200, 200:300:2] = 1024\n    \u003e\u003e\u003e store.close()\n\nRead images from a sequence of TIFF files as NumPy array using two I/O worker\nthreads:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e imwrite('temp_C001T001.tif', numpy.random.rand(64, 64))\n    \u003e\u003e\u003e imwrite('temp_C001T002.tif', numpy.random.rand(64, 64))\n    \u003e\u003e\u003e image_sequence = imread(\n    ...     ['temp_C001T001.tif', 'temp_C001T002.tif'], ioworkers=2, maxworkers=1\n    ... )\n    \u003e\u003e\u003e image_sequence.shape\n    (2, 64, 64)\n    \u003e\u003e\u003e image_sequence.dtype\n    dtype('float64')\n\nRead an image stack from a series of TIFF files with a file name pattern\nas NumPy or Zarr arrays:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e image_sequence = TiffSequence('temp_C0*.tif', pattern=r'_(C)(\\d+)(T)(\\d+)')\n    \u003e\u003e\u003e image_sequence.shape\n    (1, 2)\n    \u003e\u003e\u003e image_sequence.axes\n    'CT'\n    \u003e\u003e\u003e data = image_sequence.asarray()\n    \u003e\u003e\u003e data.shape\n    (1, 2, 64, 64)\n    \u003e\u003e\u003e store = image_sequence.aszarr()\n    \u003e\u003e\u003e zarr.open(store, mode='r', ioworkers=2, maxworkers=1)\n    \u003cArray ZarrFileSequenceStore shape=(1, 2, 64, 64) dtype=float64\u003e\n    \u003e\u003e\u003e image_sequence.close()\n\nWrite the Zarr store to a fsspec ReferenceFileSystem in JSON format:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e store = image_sequence.aszarr()\n    \u003e\u003e\u003e store.write_fsspec('temp.json', url='file://')\n\nOpen the fsspec ReferenceFileSystem as a Zarr array:\n\n.. code-block:: python\n\n    \u003e\u003e\u003e from kerchunk.utils import refs_as_store\n    \u003e\u003e\u003e import tifffile.numcodecs\n    \u003e\u003e\u003e tifffile.numcodecs.register_codec()\n    \u003e\u003e\u003e zarr.open(refs_as_store('temp.json'), mode='r')\n    \u003cArray \u003cFsspecStore(ReferenceFileSystem, /)\u003e shape=(1, 2, 64, 64) ...\u003e\n\nInspect the TIFF file from the command line::\n\n    $ python -m tifffile temp.ome.tif\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcgohlke%2Ftifffile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcgohlke%2Ftifffile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcgohlke%2Ftifffile/lists"}