Image freeze in build

Hi,

I’m struggling with a png image that I can’t freeze in my lv_micropython built.
Is it possible to do it?

I tried to generate a C array with online tools but I don’t know how to use it with micropython instead of lv.img.decoder_create()

Thank you for your help

Hi @Patoche5150!

Yes it’s possible.

According to the docs you need to declare a C variable of type lv_img_dsc_t and populate it statically.
You can use the online image converter to generate a C file with a static lv_img_dsc_t variable that represents your image.

To use it in Micropython you need to rebuild lv_micropython:

  • Put your C file with the image variable somewhere under lib/lv_bindings/lvgl/src/ (or its subdirectories) so the Makefile could find it. Alternatively you can change the Makefile and add your C file under SRC_MOD.
  • To make the image available in Micropython, it needs to be declared (as extern) in some header file that is processed by the LVGL-Micropython-binding script. You can add the extern to lvgl.h or to any file that is included by it, such as lv_conf.h

After these steps, your image should be available in Micropython under the lvgl module.
You can create an image with lv.img_create and call img.set_src with your image as an argrument.

Hi @amirgon,

thank you so much for your response.
I used the online image converter, it is ok, I generated my C file.
Rebuild lv_micropython is also ok, no problem.
But I don’t know how to declare the image file as extern in a header file.
It’s probably easy but I am not used with that. Could you give me the good command line for that ?

Thank you

Yes, you simply need to add a line to some header file, something like:

extern const lv_img_dsc_t my_image;

You can add it, for example, at the end of lvgl.h before the: #ifdef __cplusplus} #endif.

Then build lv_micropython. You only need this line.

my_image above is the name of your image. You can find it at the end of your generated image file.
You would see there something like:

const lv_img_dsc_t my_image = {
  .header.always_zero = 0,
  .header.w = 441,
  .header.h = 428,
  .data_size = 188748 * LV_COLOR_SIZE / 8,
  .header.cf = LV_IMG_CF_TRUE_COLOR,
  .data = my_image_map,
};