Source code for enable.primitives.image

# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" Defines the Image component class.
"""

# Enthought library imports
from traits.api import Array, Enum, Property, cached_property

# Local imports
from enable.component import Component


[docs]class Image(Component): """ Component that displays a static image This is extremely simple right now. By default it will draw the array into the entire region occupied by the component, stretching or shrinking as needed. By default the bounds are set to the width and height of the data array, and we provide the same information to constraints-based layout with the layout_size_hint trait. """ #: the image data as an array data = Array(shape=(None, None, (3, 4)), dtype="uint8") #: the format of the image data (eg. RGB vs. RGBA) format = Property(Enum("rgb24", "rgba32"), observe="data") #: the size-hint for constraints-based layout layout_size_hint = Property(data, observe="data") #: the image as a C-contiguous ndarray _image = Property(Array(shape=(None, None, None)), observe="data")
[docs] @classmethod def from_file(cls, filename, **traits): from PIL import Image from numpy import asarray data = asarray(Image.open(filename)) return cls(data=data, **traits)
def __init__(self, data, **traits): # the default bounds are the size of the image traits.setdefault("bounds", data.shape[1::-1]) super().__init__(data=data, **traits) def _draw_mainlayer(self, gc, view_bounds=None, mode="normal"): """ Draws the image. """ with gc: rect = (self.x, self.y, self.width, self.height) gc.draw_image(self._image, rect) @cached_property def _get_format(self): if self.data.shape[-1] == 3: return "rgb24" elif self.data.shape[-1] == 4: return "rgba32" else: raise ValueError("Data array not correct shape") @cached_property def _get_layout_size_hint(self): return self.data.shape[1::-1] @cached_property def _get__image(self): if not self.data.flags["C_CONTIGUOUS"]: data = self.data.copy() else: data = self.data return data