from __future__ import division
import logging
import pyvips
from pyvips import ffi, vips_lib, Error, _to_bytes
logger = logging.getLogger(__name__)
[docs]class Source(pyvips.Connection):
"""An input connection.
"""
def __init__(self, pointer):
# logger.debug('Operation.__init__: pointer = %s', pointer)
super(Source, self).__init__(pointer)
[docs] @staticmethod
def new_from_descriptor(descriptor):
"""Make a new source from a file descriptor (a small integer).
Make a new source that is attached to the descriptor. For example::
source = pyvips.Source.new_from_descriptor(0)
Makes a descriptor attached to stdin.
You can pass this source to (for example) :meth:`new_from_source`.
"""
# logger.debug('VipsSource.new_from_descriptor: descriptor = %d',
# descriptor)
# sources are mutable, so we can't use the cache
pointer = vips_lib.vips_source_new_from_descriptor(descriptor)
if pointer == ffi.NULL:
raise Error("can't create source from descriptor {0}"
.format(descriptor))
return Source(pointer)
[docs] @staticmethod
def new_from_file(filename):
"""Make a new source from a filename.
Make a new source that is attached to the named file. For example::
source = pyvips.Source.new_from_file("myfile.jpg")
You can pass this source to (for example) :meth:`new_from_source`.
"""
# logger.debug('VipsSource.new_from_file: filename = %s',
# filename)
pointer = vips_lib.vips_source_new_from_file(_to_bytes(filename))
if pointer == ffi.NULL:
raise Error("can't create source from filename {0}"
.format(filename))
return Source(pointer)
[docs] @staticmethod
def new_from_memory(data):
"""Make a new source from a memory object.
Make a new source that is attached to the memory object. For example::
source = pyvips.Source.new_from_memory("myfile.jpg")
You can pass this source to (for example) :meth:`new_from_source`.
The memory object can be anything that supports the Python buffer or
memoryview protocol.
"""
# logger.debug('VipsSource.new_from_memory:')
# py3:
# - memoryview has .nbytes for number of bytes in object
# - len() returns number of elements in top array
# py2:
# - buffer has no nbytes member
# - but len() gives number of bytes in object
start = ffi.from_buffer(data)
nbytes = data.nbytes if hasattr(data, 'nbytes') else len(data)
pointer = vips_lib.vips_source_new_from_memory(start, nbytes)
if pointer == ffi.NULL:
raise Error("can't create input source from memory")
source = Source(pointer)
# keep a secret reference to the input data to make sure it's not GCed
source._references = [data]
return source
__all__ = ['Source']