fr/fr_env/lib/python3.8/site-packages/imageio/plugins/feisem.py

92 lines
3.3 KiB
Python

# -*- coding: utf-8 -*-
# imageio is distributed under the terms of the (new) BSD License.
from .tifffile import TiffFormat
from .. import formats
class FEISEMFormat(TiffFormat):
"""Provide read support for TIFFs produced by an FEI SEM microscope.
This format is based on TIFF, and supports the same parameters.
FEI microscopes append metadata as ASCII text at the end of the file,
which this reader correctly extracts.
Parameters for get_data
-----------------------
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.
"""
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.
"""
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._meta.update(md)
return md
# Register plugin
format = FEISEMFormat(
"fei", "FEI-SEM TIFF format", extensions=[".tif", ".tiff"], modes="iv"
)
formats.add_format(format)