Source code for solidipes.loaders.image

from PIL import ExifTags
from PIL import Image as PILImage
from PIL.TiffImagePlugin import IFDRational

from .. import viewers
from .data_container import DataContainer
from .file import File


[docs] class SVGWrapper: def __init__(self, filename): self.src = open(filename, "r").read()
[docs] def _repr_svg_(self): return self.src
[docs] def show(self): from io import BytesIO import cairosvg import matplotlib.pyplot as plt img_png = cairosvg.svg2png(self.src) img = Image.open(BytesIO(img_png)) plt.imshow(img)
[docs] class Image(File): """Image loaded with PIL""" supported_mime_types = ["image/"] def __init__(self, **kwargs): super().__init__(**kwargs) self.default_viewer = viewers.Image @File.loadable def image(self): if self.file_info.type == "image/svg+xml": return SVGWrapper(self.file_info.path) else: return PILImage.open(self.file_info.path) @File.cached_loadable def exif_data(self): try: return self.get_exif_data() except Exception as err: return str(err)
[docs] def get_exif_data(self): pil_exif = self.image._getexif() if pil_exif is None: return DataContainer() exif = {ExifTags.TAGS[k]: v for k, v in pil_exif.items() if k in ExifTags.TAGS} # Convert PIL.TiffImagePlugin.IFDRational to float: for k, v in exif.items(): if isinstance(v, IFDRational): exif[k] = float(v) return DataContainer(exif)