ai-content-maker/.venv/Lib/site-packages/imageio/plugins/feisem.py

96 lines
3.3 KiB
Python
Raw Normal View History

2024-05-11 23:00:43 +03:00
# -*- coding: utf-8 -*-
# imageio is distributed under the terms of the (new) BSD License.
"""Read TIFF from FEI SEM microscopes.
Backend Library: internal
This format is based on :mod:`TIFF <imageio.plugins.tifffile>`, and supports the
same parameters. FEI microscopes append metadata as ASCII text at the end of the
file, which this reader correctly extracts.
Parameters
----------
discard_watermark : bool
If True (default), discard the bottom rows of the image, which
contain no image data, only a watermark with metadata.
watermark_height : int
The height in pixels of the FEI watermark. The default is 70.
See Also
--------
:mod:`imageio.plugins.tifffile`
"""
from .tifffile import TiffFormat
class FEISEMFormat(TiffFormat):
"""See :mod:`imageio.plugins.feisem`"""
def _can_write(self, request):
return False # FEI-SEM only supports reading
class Reader(TiffFormat.Reader):
def _get_data(self, index=0, discard_watermark=True, watermark_height=70):
"""Get image and metadata from given index.
FEI images usually (always?) contain a watermark at the
bottom of the image, 70 pixels high. We discard this by
default as it does not contain any information not present
in the metadata.
"""
im, meta = super(FEISEMFormat.Reader, self)._get_data(index)
if discard_watermark:
im = im[:-watermark_height]
return im, meta
def _get_meta_data(self, index=None):
"""Read the metadata from an FEI SEM TIFF.
This metadata is included as ASCII text at the end of the file.
The index, if provided, is ignored.
Returns
-------
metadata : dict
Dictionary of metadata.
"""
if hasattr(self, "_fei_meta"):
return self._fei_meta
md = {"root": {}}
current_tag = "root"
reading_metadata = False
filename = self.request.get_local_filename()
with open(filename, encoding="utf8", errors="ignore") as fin:
for line in fin:
if not reading_metadata:
if not line.startswith("Date="):
continue
else:
reading_metadata = True
line = line.rstrip()
if line.startswith("["):
current_tag = line.lstrip("[").rstrip("]")
md[current_tag] = {}
else:
if "=" in line: # ignore empty and irrelevant lines
key, val = line.split("=", maxsplit=1)
for tag_type in (int, float):
try:
val = tag_type(val)
except ValueError:
continue
else:
break
md[current_tag][key] = val
if not md["root"] and len(md) == 1:
raise ValueError("Input file %s contains no FEI metadata." % filename)
self._fei_meta = md
return md