Farsi Image generator

Farsi Image generator

During the development of a personal project, I needed to build a script that converts Farsi (Persian) text into an image. To make the process easier — and a bit more fun — I chose the excellent Gradio framework to build a simple interactive interface.

Gradio is a popular open-source Python library that makes it easy to create interactive, web-based UIs for machine learning models, APIs, or even plain Python functions. It’s a favorite among data scientists and ML engineers who want to quickly share their work — no HTML, CSS, or JavaScript required.

Gradio also has a new serverless option, Gradio-Lite, which is amazing for quick demos, but unfortunately it’s not suitable for this project.

Installing Gradio

I prefer using uv as my package manager since it’s blazing fast (thanks to Rust under the hood):

uv add gradio 

Installing libraqm

Farsi uses a complex script where the shape of each character depends on its position in the word. To render it correctly, we need libraqm, which handles text shaping.

Here’s how to install it:

macOS

Using Homebrew:

brew install libraqm 

If you’re using fish shell, you’ll also need to update your PKG_CONFIG_PATH:

set -gx PKG_CONFIG_PATH "(brew --prefix libraqm)/lib/pkgconfig:$PKG_CONFIG_PATH" 

Windows

Follow this StackOverflow answer for installation instructions.

Installing Pillow

Once libraqm is set up, install Pillow with:

uv pip install Pillow --no-binary=Pillow 

This ensures Pillow is compiled with libraqm support.

Converting Farsi Text to an Image

Now that everything is installed, we can write a simple script that takes:

  • A font file
  • Your Farsi text
  • Image dimensions

Here’s the script:

Run the script, then open your app at:
http://localhost:8007/

Here’s the result 🎉

!! If you find this post helpful or have any thought, please don’t be shy and share it here with me.


Source: DEV Community.


Leave a Reply

Your email address will not be published. Required fields are marked *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.