1#
2# The Python Imaging Library
3# $Id$
4#
5# HDF5 stub adapter
6#
7# Copyright (c) 2000-2003 by Fredrik Lundh
8#
9# See the README file for information on usage and redistribution.
10#
11from __future__ import annotations
12
13import os
14from typing import IO
15
16from . import Image, ImageFile
17
18_handler = None
19
20
21def register_handler(handler: ImageFile.StubHandler | None) -> None:
22 """
23 Install application-specific HDF5 image handler.
24
25 :param handler: Handler object.
26 """
27 global _handler
28 _handler = handler
29
30
31# --------------------------------------------------------------------
32# Image adapter
33
34
35def _accept(prefix: bytes) -> bool:
36 return prefix.startswith(b"\x89HDF\r\n\x1a\n")
37
38
39class HDF5StubImageFile(ImageFile.StubImageFile):
40 format = "HDF5"
41 format_description = "HDF5"
42
43 def _open(self) -> None:
44 if not _accept(self.fp.read(8)):
45 msg = "Not an HDF file"
46 raise SyntaxError(msg)
47
48 self.fp.seek(-8, os.SEEK_CUR)
49
50 # make something up
51 self._mode = "F"
52 self._size = 1, 1
53
54 loader = self._load()
55 if loader:
56 loader.open(self)
57
58 def _load(self) -> ImageFile.StubHandler | None:
59 return _handler
60
61
62def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
63 if _handler is None or not hasattr(_handler, "save"):
64 msg = "HDF5 save handler not installed"
65 raise OSError(msg)
66 _handler.save(im, fp, filename)
67
68
69# --------------------------------------------------------------------
70# Registry
71
72Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept)
73Image.register_save(HDF5StubImageFile.format, _save)
74
75Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"])