I wrote a tiny icon-writer package this week that uses pillow to generate simple text-only icons, and used that to generate images to replace the fancy logo'd icons on my Mac OS X dock.
After generating the icons on my own machine, I wanted to make a website that others could use to generate them, so I started off by writing an Azure Function App.
I considered a few options for what the function could return:
- It could store the image in an Azure Storage container and return the URL to the created image.
- It could return a base-64 encoded string, and I could serve that in a webpage
img
tag using a data URI. - It could return an actual binary image with the mime-type set appropriately, to be used directly as the
src
of theimg
.
I went for option three, since I liked the idea of being able to test the API in the browser and instantly see an image, plus I wanted to make sure it could be done.
Here's the relevant code in the function:
img = icon_writer.write_icon(text, size=size, bgcolor=bgcolor, fontcolor=fontcolor)
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
return func.HttpResponse(img_byte_arr, mimetype='image/png')
It creates a new pillow Image
using my write_icon
function and saves that into a BytesIO
object as a PNG. It converts that object into a bytes array using BytesIO.getvalue(). Finally, it returns an HttpResponse
with the bytes array as the body and a mime-type of 'image/png'.
See the full function code on Github.
Then I can call the function in a webpage just like this:
const image = document.createElement("img");
image.src = `https://iconwriterfunction-apim.azure-api.net/icon-writer-function/IconWriter?${params}`;
document.getElementById("output").appendChild(image);
That src
attribute actually uses an API Management service URL, which protects the Funtions App endpoint with a CORS policy.
You can try the website here.
No comments:
Post a Comment