Image Management System (IMS) is a web application using Grails/Groovy/Java. The goal of this server is to carry most of the image operations and to provide a simple REST API with multiple images support.
The IMS server provides services to:
- upload an image,
- get image tiles
- get image thumb/preview
- get annotation crop (image roi)
Most of the time, the IMS server does a request on a IIP server. The IIP server is a fast image server (low-level) to quickly get thumb/tiles/roi from a big image.
Cytomine just store image metadata (ImageInstance, AbstractIMage,...) and redirect request to its IMS.
A user who want to upload an image on Cytomine may use:
- The web client and its upload form (storage section),
- A client from a specific language (Java, Python,...).
For all of these client, its a simple POST request on cytomine upload URL.
In fact, a Nginx upload retrieve the request, copy the image on disk and call the IMS with the file path.
The file is stored on disk and IMS add the new image metadata on Cytomine.
The three main image operation are:
- tile: get a single part of the image (for a specific zoom level)
- thumb: get a small preview for an image.
- crop: get the boundary image for an annotation.
The cytomine (web) client ask the data from the Cytomine core.
For crop and thumb, the Cytomine core redirect the stream to the IMS server. Then the IMS build the request URL to ask IIP for images part/operations.
You can have an exception when you get a tile (when opening an image in Cytomine explore view, you get multiple tiles) for two reasons:
- Most of the time, the browser load more than ten tiles. The core is not solicited for all of these request.
- Browser allows max n connection to the same host. When loading a lot of tiles, each tile request go to a random IMS url (image1.cyo, image2.cyto,...).