summaryrefslogtreecommitdiffstats
path: root/core/files.py
blob: 4c7729d3cf0306ebfbb35b5c974eca8dde9220cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import io

import blurhash
from django.core.files import File
from PIL import Image, ImageOps


def resize_image(
    image: File,
    *,
    size: tuple[int, int],
    cover=True,
    keep_format=False,
) -> File:
    """
    Resizes an image to fit insize the given size (cropping one dimension
    to fit if needed)
    """
    with Image.open(image) as img:
        if cover:
            resized_image = ImageOps.fit(img, size)
        else:
            resized_image = ImageOps.contain(img, size)
        new_image_bytes = io.BytesIO()
        if keep_format:
            resized_image.save(new_image_bytes, format=image.format)
            file = File(new_image_bytes)
        else:
            resized_image.save(new_image_bytes, format="webp")
            file = File(new_image_bytes, name="image.webp")
        file.image = resized_image
        return file


def blurhash_image(image) -> str:
    """
    Returns the blurhash for an image
    """
    return blurhash.encode(image, 4, 4)