iiif2
July 28, 2015 ยท View on GitHub
.. image:: https://travis-ci.org/mekarpeles/iiif2.svg :target: https://travis-ci.org/mekarpeles/iiif2
An implementation of the IIIF Image API 2.0 Specification
Installation
.. code:: bash
$ pip3 install iiif2
Usage
The iiif2 library includes an image processing component called IIIF, responsible for implementing the iiif image processing pipeline, and a Parse utility capable of extracting iiif parameters and their data from uris.
.. code:: python
from iiif2 import IIIF
from iiif2.web import Parse
You can combine the IIIF and Parse objects to create iiif 2.0 image tiles using only:
- a iiif image 2.0 uri and
- a resolved image filepath
An image path may be provided in one of two ways. First, it can be manually specified as a string:
.. code:: python
from iiif2 import IIIF, web
url = 'https://stacks.stanford.edu/image/iiif/'
'ff139pd0160%252FK90113-43/full/full/0/default.jpg'
# a web server can return a rendered tile directly
# without ever saving tile to disk. Works on read-only fs:
tile = IIIF.render('images/file.jpg', *web.Parse(url))
# if we want, we can save tile (e.g. for caching)
tile.save('cache/%s' % web.urihash(url))
Example Web Service
An entire IIIF Web Service written in Flask in ~30 lines of code is provided in the examples/ folder.
.. code:: python
import os.path
from flask import Flask, request, jsonify, send_file
from iiif2 import IIIF, web
PATH = os.path.dirname(os.path.realpath(__file__))
app = Flask(__name__)
@app.route('/<identifier>/info.json')
def info(identifier):
return jsonify(web.info(request.url_root, identifier))
@app.route('/<identifier>/<region>/<size>/<rotation>/<quality>.<fmt>')
def iiif(**kwargs):
params = web.Parse.params(**kwargs)
path = resolve(params.get('identifier'))
with IIIF.render(path, **params) as tile:
return send_file(tile, mimetype=tile.mime)
def resolve(identifier):
"""Resolves a iiif identifier to the resource's path on disk.
This method is specific to this server's architecture.
"""
return os.path.join(PATH, 'images', '%s.jpg' % identifier)
if __name__ == "__main__":
app.run(debug=True)