LVGL9 ezip conversion descriptor issue

When using the SDK example example\\multimedia\\lvgl\\lvgl_tools_example\\NXP_GUI_guider, after configuring menuconfig to switch from LVGL8 to LVGL9, all UI resources were regenerated using GUI Guider 1.9 to produce LVGL9-compatible code. However, a compilation error occurs:

------------- ezip convert begin: ezip -convert F:\\OpenSiFli\\code\\nxp_guider\\image\\ezip_brightness1_ARGB8888_140x140.c color RGB888 -------------

Found array: _brightness1_ARGB8888_140x140_map (78400 bytes)
Error: No image descriptors found
----------------------------------------  ezip convert end !!! --------------------------------------

GenImgFile build_a52-nano_n16r16_hcpu\\image\\ezip_brightness2_ARGB8888_140x140.tmp.c
ImgFileBuilder= -rgb888 -cfile 2 -pal_support
ezip version: 2.4.24_2026_01_19_h264_mp4

------------- ezip convert begin: ezip -convert F:\\OpenSiFli\\code\\nxp_guider\\image\\ezip_brightness2_ARGB8888_140x140.c color RGB888 -------------

Found array: _brightness2_ARGB8888_140x140_map (78400 bytes)
Error: No image descriptors found
----------------------------------------  ezip convert end !!! --------------------------------------

The error seems to indicate an issue with image descriptors.

In the original SDK example (LVGL8), image descriptors are defined as:

const lv_img_dsc_t _lcd_off_alpha_392x392 = {
    .header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
    .header.always_zero = 0,
    .header.reserved = 0,
    .header.w = 392,
    .header.h = 392,
    .data_size = 153664 * LV_IMG_PX_SIZE_ALPHA_BYTE,
    .data = _lcd_off_alpha_392x392_map,
};

But in LVGL9, the descriptor format has changed to:

const lv_image_dsc_t _brightness1_ARGB8888_140x140 = {
    .header.magic = LV_IMAGE_HEADER_MAGIC,
    .header.cf = LV_COLOR_FORMAT_ARGB8888,
    .header.stride = 560,
    .header.w = 140,
    .header.h = 140,
    .data_size = sizeof(_brightness1_ARGB8888_140x140_map),
    .data = _brightness1_ARGB8888_140x140_map,
};

Question: What modifications are needed to make the image descriptors compatible with LVGL9?


Answer:

The root cause of the error lies in the image conversion tool (ezip) used by the SDK, which expects image descriptors in the LVGL8 format (e.g., lv_img_dsc_t with .header.cf, .data_size, etc.), but your project now uses LVGL9’s new format (lv_image_dsc_t).

However, the ezip tool (part of NXP’s image processing pipeline) does not recognize the new LVGL9 image descriptor structure — hence the error: No image descriptors found.

:white_check_mark: Solution:

You need to keep using the old LVGL8-style image descriptor format in your C files (even in an LVGL9 project), so that ezip can detect and process the image arrays correctly.

Even though LVGL9 uses lv_image_dsc_t, the build-time image conversion tooling (ezip) in this SDK is not yet updated to parse the new format.


:white_check_mark: Recommended Fix:

Step 1: Regenerate or manually define images using the LVGL8-compatible descriptor format

Use this format for your image declarations (even in LVGL9):

const lv_img_dsc_t _brightness1_ARGB8888_140x140 = {
    .header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,  // For ARGB8888
    .header.always_zero = 0,
    .header.reserved = 0,
    .header.w = 140,
    .header.h = 140,
    .data_size = 78400,  // = 140 * 140 * 4 (ARGB8888 = 4 bytes per pixel)
    .data = _brightness1_ARGB8888_140x140_map,
};

:magnifying_glass_tilted_left: Note: .data_size should be width * height * 4 for ARGB8888.

This format ensures that ezip can find the image descriptor and process the .c file properly.


Step 2: Adapt at runtime (LVGL9 compatibility)

Since LVGL9 no longer uses lv_img_dsc_t, you must convert the old descriptor to the new lv_image_dsc_t format at runtime.

Create a wrapper function or macro to convert:

lv_image_dsc_t img_dsc_b1;

void init_image_desc(const lv_img_dsc_t* old_dsc, lv_image_dsc_t* new_dsc) {
    new_dsc->header.magic = LV_IMAGE_HEADER_MAGIC;
    new_dsc->header.w = old_dsc->header.w;
    new_dsc->header.h = old_dsc->header.h;
    new_dsc->header.stride = old_dsc->header.w * 4; // 4 bytes per pixel for ARGB8888
    new_dsc->header.cf = LV_COLOR_FORMAT_ARGB8888;
    new_dsc->data_size = old_dsc->data_size;
    new_dsc->data = old_dsc->data;
}

// Usage:
init_image_desc(&_brightness1_ARGB8888_140x140, &img_dsc_b1);

// Then use &img_dsc_b1 with LVGL9 APIs
lv_image_set_src(img_obj, &img_dsc_b1);

:white_check_mark: Alternative (if possible):

Check if a newer version of GUI Guider 1.9+ or NXP MCUXpresso SDK supports LVGL9-native image generation with compatible build tools. If available, update your toolchain so that ezip recognizes lv_image_dsc_t.


Summary:

Step Action
:cross_mark: Don’t use Pure lv_image_dsc_t in .c image files (ezip won’t detect it)
:white_check_mark: Do use lv_img_dsc_t (LVGL8 style) in generated .c files for ezip compatibility
:white_check_mark: Convert at runtime Map lv_img_dsc_tlv_image_dsc_t before passing to LVGL9
:white_check_mark: Verify tooling Ensure GUI Guider and ezip versions support LVGL9 (if not, stick with workaround)

This hybrid approach allows you to use LVGL9 at runtime while maintaining compatibility with legacy build tools.

For LVGL9, you need to add the extra parameter -lvgl_version 9 to the ezip command line. Regarding this example, you need to modify the image\Sconscript script under the example directory by adding:

if GetConfigValue(‘DISABLE_LVGL_V9’) == ‘n’:

img_flags += ' -lvgl_version 9'