2

For asynchronous file saving, I can use aiofiles library.

To use aiofiles library I'd have to do something like that:

async with aiofiles.open(path, "wb") as file:
   await file.write(data)

How can I asynchronously save the PIL images? Even if I use Image.tobytes function to save it with file.write(data), the saved image isn't correct.

So how can I asynchronously save a PIL image?

Karol
  • 409
  • 6
  • 12
  • 2
    I don't know anything about asyncio, but you could maybe encode your image as JPEG or PNG to a memory buffer and pass that buffer (called `JPEG` in the linked example) to the `file.write()` you mention in your question. See https://stackoverflow.com/a/70275120/2836621 – Mark Setchell Dec 10 '21 at 15:11
  • @MarkSetchell thank you a lot, it works :) – Karol Dec 10 '21 at 18:01
  • Cool - glad it works. If you do some timings and find there is some benefit in performance, please write up an answer for others to benefit from... and accept your own answer and grab the points. – Mark Setchell Dec 10 '21 at 18:04

1 Answers1

2

Thanks to the comment posted by @MarkSetchell I managed to find the solution.

async def save_image(path: str, image: memoryview) -> None:
    async with aiofiles.open(path, "wb") as file:
        await file.write(image)


image = Image.open(...)
buffer = BytesIO()
image.save(buffer, format="JPEG")

await save_image('./some/path', buffer.getbuffer())

I don't know how much speed one can gain, but in my case, I'm able to run some data processing code, data downloading code, and image saving code concurrently which gives me a speed up.

Karol
  • 409
  • 6
  • 12