__init__.py 4.65 KB
Newer Older
1 2 3
# import Libraries of other lib packages
import bob.io.base

4 5 6 7
# import our own Library
import bob.extension
bob.extension.load_bob_library('bob.io.image', __file__)

André Anjos's avatar
André Anjos committed
8 9 10 11
from . import _library
from . import version
from .version import module as __version__

12 13
import os

André Anjos's avatar
André Anjos committed
14 15 16
def get_config():
  """Returns a string containing the configuration information.
  """
17 18
  import bob.extension
  return bob.extension.get_config(__name__, version.externals)
André Anjos's avatar
André Anjos committed
19

20 21 22
# fix imghdr's jpeg detection to use the first two bytes (according to https://en.wikipedia.org/wiki/List_of_file_signatures)
import imghdr
def _test_jpeg(h, f):
23 24
  if h.startswith('\xff\xd8'):
    return "jpeg"
25
imghdr.tests.append(_test_jpeg)
26

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
def load(filename, extension=None):
  """load(filename) -> image

  This function loads and image from the file with the specified ``filename``.
  The type of the image will be determined based on the ``extension`` parameter, which can have the following values:

  - ``None``: The file name extension of the ``filename`` is used to determine the image type.
  - ``'auto'``: The type of the image will be detected automatically, using the :py:mod:`imghdr` module.
  - ``'.xxx`'': The image type is determined by the given extension.
                For a list of possible extensions, see :py:func:`bob.io.base.extensions` (only the image extensions are valid here).

  **Parameters:**

  ``filename`` : str
    The name of the image file to load.

  ``extension`` : str
    [Default: ``None``] If given, the given extension will determine the type of the image.
    Use ``'auto'`` to automatically determine the extension (this might take slightly more time).

  **Returns**

  ``image`` : 2D or 3D :py:class:`numpy.ndarray` of type ``uint8``
    The image read from the specified file.
  """
  # check the extension
  if extension is None:
    f = bob.io.base.File(filename, 'r')
  else:
    if extension == 'auto':
57 58
      extension = imghdr.what(filename)
      if extension is None:
59
        raise IOError("Could not detect the image type of file %s" % filename)
60
      extension = "." + extension
61 62 63 64 65 66 67
    f = bob.io.base.File(filename, 'r', extension)

  return f.read()

# use the same alias as for bob.io.base.load
read = load

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
def get_include_directories():
  """get_include_directories() -> includes

  Returns a list of include directories for dependent libraries, such as libjpeg, libtiff, ...
  This function is automatically used by :py:func:`bob.extension.get_bob_libraries` to retrieve the non-standard include directories that are required to use the C bindings of this library in dependent classes.
  You shouldn't normally need to call this function by hand.

  **Returns:**

  ``includes`` : [str]
    The list of non-standard include directories required to use the C bindings of this class.
    For now, only the directory for the HDF5 headers are returned.
  """
  # try to use pkg_config first
  from bob.extension.utils import find_header, uniq_paths
  from bob.extension import pkgconfig
  import logging
  logger = logging.getLogger("bob.io.image")
  directories = []
  for name, header in (('libjpeg', 'jpeglib.h'), ('libtiff', 'tiff.h'), ('giflib', 'gif_lib.h')):
    # locate pkg-config on our own
    candidates = find_header(header)
    if not candidates:
      logger.warn("could not find %s's `%s' - have you installed %s on this machine?" % (name, header, name))

    directories.append(os.path.dirname(candidates[0]))
  for name in ("libpng",):
Manuel Günther's avatar
Manuel Günther committed
95 96 97 98 99
    try:
      pkg = pkgconfig(name)
      directories.extend(pkg.include_directories())
    except:
      pass
100 101 102
  return uniq_paths(directories)


Manuel Günther's avatar
Manuel Günther committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
def get_macros():
  """get_macros() -> macros

  Returns a list of preprocessor macros, such as ``(HAVE_LIBJPEG, 1)``.
  This function is automatically used by :py:func:`bob.extension.get_bob_libraries` to retrieve the prerpocessor definitions that are required to use the C bindings of this library in dependent classes.
  You shouldn't normally need to call this function by hand.

  **Returns:**

  ``macros`` : [str]
    The list of preprocessor macros required to use the C bindings of this class.
  """
  # try to use pkg_config first
  from bob.extension.utils import find_header, uniq_paths
  from bob.extension import pkgconfig
  macros = []
Manuel Günther's avatar
Manuel Günther committed
119
  for define, header in (('HAVE_LIBJPEG', 'jpeglib.h'), ('HAVE_LIBTIFF', 'tiff.h'), ('HAVE_GIFLIB', 'gif_lib.h')):
Manuel Günther's avatar
Manuel Günther committed
120 121 122 123
    # locate pkg-config on our own
    candidates = find_header(header)
    if candidates:
      macros.append((define, '1'))
Manuel Günther's avatar
Manuel Günther committed
124
  for define, name in (("HAVE_LIBPNG", "libpng"),):
Manuel Günther's avatar
Manuel Günther committed
125 126 127 128 129 130 131 132
    try:
      pkg = pkgconfig(name)
      macros.append((define, '1'))
    except:
      pass
  return macros


André Anjos's avatar
André Anjos committed
133 134
# gets sphinx autodoc done right - don't remove it
__all__ = [_ for _ in dir() if not _.startswith('_')]