Search code examples
pythondjangopython-imaging-librarywebp

Django convert image to webp


I have service in my Django project's app, that upload images, and I need to convert all images to webp to optimize further work with these files on the frontend side.

Draft of _convert_to_webp method:

# imports
from pathlib import Path

from django.core.files import temp as tempfile
from django.core.files.uploadedfile import InMemoryUploadedFile
from PIL import Image


# some service class
...
    def _convert_to_webp(self, f_object: InMemoryUploadedFile):
        new_file_name = str(Path(f_object._name).with_suffix('.webp'))
        
        temp_file = tempfile.NamedTemporaryFile(suffix='.temp.webp')
        # FIXME: on other OS may cause FileNotFoundError
        with open(temp_file 'wb') as f:
            for line in f_object.file.readlines():
                ... # will it works good?
        new_file = ...
        
        new_f_object = InMemoryUploadedFile(
            new_file,
            f_object.field_name,
            new_file_name,
            f_object.content_type,
            f_object.size,
            f_object.charset,
            f_object.content_type_extra
        )
        
        return new_file_name, new_f_object
...

f_object is InMemoryUploadedFile instance from POST request body (Django automatically create it).

My idea is to create a temporary file, write data from f_object.file.readlines() to it, open this file with PIL.Image.open and save with format="webp". Is this idea a good one or there is another way to make file converting?


Solution

  • I found a pretty clean way to do this using the django-resized package.

    After pip installing, I just needed to swap out the imageField for a ResizedImageField

        img = ResizedImageField(force_format="WEBP", quality=75, upload_to="post_imgs/")
    

    All image uploads are automatically converted to .webp!