Pular para o conteúdo

Imagens no LVGL 9: arrays C, PNGs e migração da v8 ​

Descritor de imagem abstrato e matriz de pixels laranja se alinhando em um único objeto de imagem

No LVGL 9, um recurso de imagem convertido é descrito por lv_image_dsc_t. Crie um objeto de imagem com lv_image_create() e depois passe o endereço do descritor para lv_image_set_src(). O arquivo C que contém esse descritor também precisa fazer parte da compilação do firmware.

Se o seu exemplo usa lv_img_dsc_t e lv_img_set_src(), confira a versão dele antes de copiar. Esses são os nomes usados nos tutoriais do LVGL 8.

Confira a versão nas duas pontas ​

Há duas versões para combinar: a biblioteca no seu firmware e o conversor que produziu o recurso. Uma chamada de função da v9 não conserta um descritor gerado para outro formato.

TarefaNomes no LVGL 8Nomes no LVGL 9
Descrever uma imagemlv_img_dsc_tlv_image_dsc_t
Declarar uma imagem externaLV_IMG_DECLARELV_IMAGE_DECLARE
Criar um objeto de imagemlv_img_createlv_image_create
Definir a origem delalv_img_set_srclv_image_set_src

A referência de imagens do LVGL 8 oficial e a referência de imagens do LVGL 9 mostram as respectivas APIs. Aliases de compatibilidade podem existir em uma compilação específica, mas usar uma versão de forma consistente facilita inspecionar a integração.

Adicione uma imagem convertida ao LVGL 9 ​

Suponha que o seu conversor gerou status_logo.c e o descritor dentro dele se chama status_logo. Adicione esse arquivo aos arquivos-fonte compilados pelo seu projeto. Depois use esta função de integração depois que o LVGL e o display forem inicializados:

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);
}

O nome precisa corresponder ao símbolo dentro do arquivo gerado, que pode ser diferente do nome do arquivo. Este exemplo fornece o código de integração, e não os dados de pixel do logotipo.

Compile o recurso uma vez. Incluir um arquivo .c direto e ao mesmo tempo compilar ele separadamente pode definir o mesmo símbolo duas vezes. Uma declaração externa torna o símbolo visível; ela não fornece a definição dele.

Por que o descritor importa ​

Um ponteiro para os pixels da imagem não diz ao LVGL as dimensões nem o formato de cor deles. O descritor carrega essa informação junto com o ponteiro dos dados e o tamanho. Os campos exatos estão definidos no cabeçalho do descritor de imagem do LVGL 9.2.

Mantenha o descritor gerado pelo conversor intacto durante os testes. Editar a largura dele para esticar uma imagem muda como os dados são interpretados; não reamostra os pixels. Gere o recurso de novo nas dimensões que você quer.

Para uma primeira verificação, use uma imagem pequena com uma borda visível e uma marca assimétrica em um canto. É mais fácil identificar recortes, orientação e linhas faltando do que com um fundo uniforme.

Um arquivo PNG precisa de outro caminho ​

O LVGL pode usar variáveis de imagem ou origens baseadas em arquivos, mas essas rotas têm requisitos diferentes. Um recurso C bruto convertido já contém os dados de pixel. Um arquivo .png ainda precisa de um decodificador adequado, e uma origem em sistema de arquivos também precisa de acesso ao armazenamento configurado no firmware. O guia de armazenamento de imagens explica essa distinção.

Para um logotipo de status fixo, um recurso compilado costuma ser simples de gerenciar. Para imagens que os usuários substituem em um cartão SD, um caminho baseado em arquivos pode combinar melhor com o produto. Mantenha uma imagem compilada que você sabe que funciona disponível enquanto você coloca o sistema de arquivos e o decodificador para funcionar, para um widget vazio não deixar você depurando tudo ao mesmo tempo.

Usando o Lopaka para o recurso e o layout ​

A documentação de plataformas atual do Lopaka identifica a v9 como destino da API C do LVGL. Ela também documenta recursos de imagem para download. Combine essa saída com a versão do LVGL que o firmware da sua placa já usa.

O editor cuida do design da tela. A inicialização do display, os drivers de armazenamento, o tratamento de entrada e o comportamento da aplicação ainda pertencem ao seu firmware. Se você está escolhendo primeiro um fluxo de display, comece pelo guia do construtor de GUI para ESP32.

Perguntas frequentes ​

Por que recebo uma referência indefinida para a minha imagem? ​

Confira se o recurso gerado é compilado e se o símbolo exportado dele corresponde à declaração. Em um projeto misto de C/C++, confira também a vinculação na fronteira da declaração.

Posso renomear lv_img_dsc_t para lv_image_dsc_t? ​

Gere de novo para a versão do LVGL pretendida. Renomear só o tipo não estabelece que o layout do cabeçalho, as constantes de cor e o payload são compatíveis.

Por que a imagem aparece com as dimensões erradas? ​

Compare as dimensões de origem, as dimensões convertidas, o descritor e as configurações do widget. Corrija a primeira incompatibilidade que você encontrar e depois teste de novo o mesmo recurso pequeno.