Skip to content

Handling Images

The basics of handling images is the same as handling files. The only difference is that you will need to inherit from ImageAttachment instead of FileAttachment.

Using the ImageAttachment

An additional package is required when using images called pillow. to include this run:

pip install git+https://github.com/accent-starlette/starlette-files.git@master#egg=starlette-files[image]

from starlette_files.constants import MB
from starlette_files.fields import ImageAttachment

class ImageType(ImageAttachment):
    # your storage 
    storage = my_storage
    # directory in the stroage to save files to
    directory = "images"
    # allowed content types
    allowed_content_types = ["image/jpeg", "image/png"]
    # maximum allowed size in bytes
    max_length = MB * 5

And define your table:

import sqlalchemy as sa

class Image(Base):
    image = sa.Column(ImageType.as_mutable(sa.JSON))

Working with Images

The only difference here is that it saves two additional bits of data, the width and the height of the image:

>>> instance = session.query(Image).first()
>>> instance.image
{
    'original_filename': 'example.png',
    'uploaded_on': 1576792678,
    'content_type': 'image/png',
    'extension': '.png',
    'file_size': 2897,
    'saved_filename': '9fabf09a-d915-48e5-8775-4f553c571a0b.png',
    'width': 800,
    'height': 600,
}

These both also include properties:

>>> instance.image.width
800

Focal Point

On an ImageAttachment you can also specify a focal point. This is the area of the image that is most important.

To set this you can do:

>>> instance.image.focal_point_x = 100  # px from the left 
>>> instance.image.focal_point_y = 100  # px from the top
>>> instance.image.focal_point_width = 100  # width
>>> instance.image.focal_point_height = 100  # height

This is useful when dealing with image operations such as the fill operation.