Ir al contenido

Imágenes en LVGL 9: arrays C, PNG y migración desde v8 ​

Descriptor de imagen abstracto y matriz de píxeles naranja alineándose en un solo objeto de imagen

En LVGL 9, un recurso de imagen convertido se describe con lv_image_dsc_t. Crea un objeto de imagen con lv_image_create() y después pasa la dirección del descriptor a lv_image_set_src(). El archivo C que contiene ese descriptor también debe formar parte de la compilación del firmware.

Si tu ejemplo usa lv_img_dsc_t y lv_img_set_src(), comprueba su versión antes de copiarlo. Esos son los nombres usados en los tutoriales de LVGL 8.

Comprueba la versión en ambos extremos ​

Hay dos versiones que deben coincidir: la biblioteca en tu firmware y el convertidor que produjo el recurso. Una llamada a función de v9 no repara un descriptor generado para un formato distinto.

TaskLVGL 8 namesLVGL 9 names
Describe an imagelv_img_dsc_tlv_image_dsc_t
Declare an external imageLV_IMG_DECLARELV_IMAGE_DECLARE
Create an image objectlv_img_createlv_image_create
Set its sourcelv_img_set_srclv_image_set_src

La referencia de imágenes de LVGL 8 oficial y la referencia de imágenes de LVGL 9 muestran las API respectivas. Puede haber alias de compatibilidad en una compilación concreta, pero usar una versión de forma coherente hace que la integración sea más fácil de inspeccionar.

Añade una imagen convertida a LVGL 9 ​

Supón que tu convertidor generó status_logo.c y que el descriptor dentro de él se llama status_logo. Añade ese archivo a los archivos fuente compilados por tu proyecto. Después usa esta función de integración tras inicializar LVGL y la pantalla:

c
#include "lvgl.h"

LV_IMAGE_DECLARE(status_logo);

void add_status_logo(lv_obj_t *parent)
{
    lv_obj_t *image = lv_image_create(parent);
    lv_image_set_src(image, &status_logo);
    lv_obj_align(image, LV_ALIGN_TOP_LEFT, 12, 12);
}

El nombre debe coincidir con el símbolo dentro del archivo generado, que puede diferir del nombre de archivo. Este ejemplo ofrece código de integración, no los datos de píxel del logotipo.

Compila el recurso una vez. Incluir un archivo .c directamente mientras también lo compilas por separado puede definir el mismo símbolo dos veces. Una declaración externa hace visible el símbolo; no aporta su definición.

Por qué importa el descriptor ​

Un puntero a los píxeles de una imagen no le dice a LVGL sus dimensiones ni su formato de color. El descriptor lleva esa información junto al puntero de datos y el tamaño. Los campos exactos se definen en el encabezado del descriptor de imagen de LVGL 9.2.

Mantén intacto el descriptor generado por el convertidor al probar. Editar su ancho para estirar una imagen cambia cómo se interpretan los datos; no remuestrea los píxeles. Regenera el recurso con las dimensiones deseadas en su lugar.

Para una primera comprobación, usa una imagen pequeña con un borde visible y una marca asimétrica en una esquina. Es más fácil detectar recortes, orientación y filas que faltan que con un fondo uniforme.

Un archivo PNG necesita una ruta distinta ​

LVGL puede usar variables de imagen u orígenes respaldados por archivos, pero esas rutas tienen requisitos distintos. Un recurso C convertido en bruto ya contiene datos de píxel. Un archivo .png todavía necesita un decodificador adecuado, y un origen en sistema de archivos también necesita acceso a almacenamiento configurado en el firmware. La guía de almacenamiento de imágenes explica esa distinción.

Para un logotipo de estado fijo, un recurso compilado suele ser sencillo de gestionar. Para imágenes que los usuarios sustituyen en una tarjeta SD, una ruta respaldada por archivos puede encajar mejor con el producto. Mantén disponible una imagen compilada que sepas que funciona mientras pones en marcha el sistema de archivos y el decodificador, para que un widget vacío no te deje depurándolo todo a la vez.

Usar Lopaka para el recurso y el diseño ​

La documentación de plataformas actual de Lopaka identifica v9 como su destino de API C de LVGL. También documenta recursos de imagen descargables. Ajusta esa salida a la versión de LVGL que ya usa el firmware de tu placa.

El editor se encarga del diseño de la pantalla. La inicialización de la pantalla, los controladores de almacenamiento, el manejo de entradas y el comportamiento de la aplicación siguen perteneciendo a tu firmware. Si primero estás eligiendo un flujo de trabajo de pantalla, empieza con la guía del constructor de GUI para ESP32.

Preguntas comunes ​

¿Por qué obtengo una referencia indefinida a mi imagen? ​

Comprueba que el recurso generado se compile y que su símbolo exportado coincida con la declaración. En un proyecto mixto C/C++, comprueba también el enlace en el límite de la declaración.

¿Puedo renombrar lv_img_dsc_t a lv_image_dsc_t? ​

Regenera para la versión de LVGL prevista. Renombrar solo el tipo no garantiza que la disposición del encabezado, las constantes de color y la carga sean compatibles.

¿Por qué la imagen aparece con dimensiones incorrectas? ​

Compara las dimensiones de origen, las dimensiones convertidas, el descriptor y los ajustes del widget. Corrige la primera discrepancia que encuentres y después vuelve a probar el mismo recurso pequeño.