Skip to content

Latest commit

 

History

History
129 lines (96 loc) · 3.83 KB

README.md

File metadata and controls

129 lines (96 loc) · 3.83 KB

Build pypi versions codecov license

Gallerist

Classes and methods to handle pictures for the web, using Pillow.

$ pip install gallerist

Features

  • Code api to handle the generation of pictures in various sizes (e.g. medium size picture, small size, thumbnail)
  • Both asynchronous api and synchronous api
  • Supports user defined stores for binaries, for example to read and write files in Azure Blob Storage, or AWS S3
  • Handles by default JPG, PNG, GIF, MPO; and provides a code api to support adding more supported formats
  • Supports scaling animated GIF files (resized gifs are still animated)
  • Maintains PNG transparencies

See also

Examples

Basic example using the synchronous api, and reading files from file system:

from gallerist import Gallerist
from gallerist.fs import FileSystemSyncFileStore


gallerist = Gallerist(FileSystemSyncFileStore('tests'))


metadata = gallerist.process_image('files/blacksheep.png')

Configuring sizes

from gallerist import Gallerist, ImageSize
from gallerist.fs import FileSystemSyncFileStore


store = FileSystemSyncFileStore("tests")

# configuring sizes by mime (use '*' to match any other mime):
gallerist = Gallerist(
    store,
    sizes={
        "image/jpeg": [ImageSize("a", 500), ImageSize("b", 400), ImageSize("c", 300)],
        "image/png": [ImageSize("a", 350), ImageSize("b", 250), ImageSize("c", 150)],
    },
)

metadata = gallerist.process_image("files/pexels-photo-126407.jpeg")

print(metadata)

The original picture is not modified, it is only read to produce more images in other sizes.

Metadata:

<ImageMetadata width=2520 height=1418 extension=".jpg" mime="image/jpeg" versions=[
  <ImageVersion
    size_name="a"
    id="bbf665ba8dd3412a84ac435a086fc7ad"
    max_side=500
    file_name="a-bbf665ba8dd3412a84ac435a086fc7ad.jpg"
  >,
  <ImageVersion
    size_name="b"
    id="7e4b38b977964c2a91544c1e0621c3a1"
    max_side=400
    file_name="b-7e4b38b977964c2a91544c1e0621c3a1.jpg"
  >,
  <ImageVersion
    size_name="c"
    id="847cad2796004b5086269bec9d705cdc"
    max_side=300
    file_name="c-847cad2796004b5086269bec9d705cdc.jpg"
  >
]>

Implementing a custom file store

Custom stores must implement one of the following protocols:

from gallerist.abc import FileStore, SyncFileStore


class MyAsyncFileStore(FileStore):
    """Implement your async file store, then use gallerist.process_image_async method"""

    async def read_file(self, file_path: str) -> bytes:
        pass

    async def write_file(self, file_path: str, data: bytes):
        pass

    async def delete_file(self, file_path: str):
        pass


class MySyncFileStore(SyncFileStore):
    """Implement your sync file store, then use gallerist.process_image method"""

    def read_file(self, file_path: str) -> bytes:
        pass

    def write_file(self, file_path: str, data: bytes):
        pass

    def delete_file(self, file_path: str):
        pass