Source code for graviti.file.image

#!/usr/bin/env python3
#
# Copyright 2022 Graviti. Licensed under MIT License.
#

"""Graviti image file class."""

from pathlib import Path
from typing import TYPE_CHECKING, Dict, Optional, Type, TypeVar, Union

import pyarrow as pa

from graviti.file.base import File, RemoteFile
from graviti.file.image_size import get_image_size
from graviti.portex import STANDARD_URL, ExternalElementResgister

if TYPE_CHECKING:
    from graviti.manager import ObjectPermissionManager


_I = TypeVar("_I", bound="Image")
_RI = TypeVar("_RI", bound="RemoteImage")


[docs]class Image(File): """This class represents local image files. Arguments: path: The local path of the image. """ __slots__ = ("_height", "_width") _height: int _width: int @classmethod def _from_pyarrow( cls: Type[_I], scalar: pa.StructScalar, _: Optional["ObjectPermissionManager"] = None, ) -> _I: obj: _I = object.__new__(cls) pyobj = scalar.as_py() obj._key = pyobj["key"] obj._path = Path(pyobj["key"]) obj._extension = pyobj["extension"] obj._size = pyobj["size"] obj._height = pyobj["height"] obj._width = pyobj["width"] return obj def _to_post_data(self) -> Dict[str, Union[int, str]]: post_data = super()._to_post_data() post_data["height"] = self.height post_data["width"] = self.width return post_data @property
[docs] def height(self) -> int: """Get the height of the image. Returns: The height of the image. """ if not hasattr(self, "_height"): self._height, self._width = get_image_size(self.path) return self._height
@property
[docs] def width(self) -> int: """Get the width of the image. Returns: The width of the image. """ if not hasattr(self, "_width"): self._height, self._width = get_image_size(self.path) return self._width
@ExternalElementResgister(STANDARD_URL, "main", "file.Image", "label.Mask")
[docs]class RemoteImage(RemoteFile): """This class represents remote image files. Arguments: key: The key of the image file. extension: The extension of the image file. size: The size of the image file. height: The height of the image. width: The width of the image. object_permission_manager: The permission to access the file. """ __slots__ = ("_height", "_width") _height: int _width: int def __init__( # pylint: disable=too-many-arguments self, key: str, extension: str, size: int, height: int, width: int, object_permission_manager: "ObjectPermissionManager", ) -> None: RemoteFile.__init__(self, key, extension, size, object_permission_manager) self._height = height self._width = width @classmethod def _from_pyarrow( # type: ignore[override] cls: Type[_RI], scalar: pa.StructScalar, object_permission_manager: "ObjectPermissionManager", ) -> _RI: obj: _RI = object.__new__(cls) pyobj = scalar.as_py() obj._key = pyobj["key"] obj._extension = pyobj["extension"] obj._size = pyobj["size"] obj._height = pyobj["height"] obj._width = pyobj["width"] obj._object_permission = object_permission_manager return obj def _to_post_data(self) -> Dict[str, Union[int, str]]: post_data = super()._to_post_data() post_data["height"] = self.height post_data["width"] = self.width return post_data @property
[docs] def height(self) -> int: """Get the height of the image. Returns: The height of the image. """ return self._height
@property
[docs] def width(self) -> int: """Get the width of the image. Returns: The width of the image. """ return self._width