Przejdź do treści

Obrazy LVGL 9: tablice C, pliki PNG i migracja z v8 ​

Abstrakcyjny deskryptor obrazu i pomarańczowa macierz pikseli łączące się w jeden obiekt obrazu

W LVGL 9 przekonwertowany zasób obrazu jest opisywany przez lv_image_dsc_t. Utwórz obiekt obrazu za pomocą lv_image_create(), a następnie przekaż adres deskryptora do lv_image_set_src(). Plik C zawierający ten deskryptor musi też być częścią kompilacji firmware.

Jeśli twój przykład używa lv_img_dsc_t i lv_img_set_src(), sprawdź jego wersję przed skopiowaniem. Są to nazwy używane w samouczkach LVGL 8.

Sprawdź wersję na obu końcach ​

Trzeba dopasować dwie wersje: bibliotekę w twoim firmware oraz konwerter, który utworzył zasób. Wywołanie funkcji v9 nie naprawi deskryptora wygenerowanego dla innego formatu.

ZadanieNazwy LVGL 8Nazwy LVGL 9
Opisanie obrazulv_img_dsc_tlv_image_dsc_t
Zadeklarowanie obrazu zewnętrznegoLV_IMG_DECLARELV_IMAGE_DECLARE
Utworzenie obiektu obrazulv_img_createlv_image_create
Ustawienie jego źródłalv_img_set_srclv_image_set_src

Oficjalna dokumentacja obrazów LVGL 8 i dokumentacja obrazów LVGL 9 pokazują odpowiednie API. Aliasy zgodności mogą istnieć w konkretnej kompilacji, ale konsekwentne używanie jednej wersji ułatwia inspekcję integracji.

Dodaj przekonwertowany obraz do LVGL 9 ​

Załóż, że twój konwerter wygenerował plik status_logo.c, a deskryptor w nim nazywa się status_logo. Dodaj ten plik do plików źródłowych kompilowanych przez twój projekt. Następnie użyj tej funkcji integracyjnej po zainicjowaniu LVGL i wyświetlacza:

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

Nazwa musi pasować do symbolu wewnątrz wygenerowanego pliku, który może różnić się od nazwy pliku. Przykład ten dostarcza kod integracyjny, a nie dane pikseli logo.

Skompiluj zasób raz. Bezpośrednie dołączenie pliku .c przy jednoczesnym osobnym kompilowaniu go może zdefiniować ten sam symbol dwukrotnie. Deklaracja zewnętrzna sprawia, że symbol jest widoczny; nie dostarcza jego definicji.

Dlaczego deskryptor ma znaczenie ​

Wskaźnik na piksele obrazu nie mówi LVGL o ich wymiarach ani formacie kolorów. Deskryptor niesie te informacje wraz ze wskaźnikiem danych i rozmiarem. Dokładne pola są zdefiniowane w nagłówku deskryptora obrazu LVGL 9.2.

Podczas testowania zachowaj deskryptor wygenerowany przez konwerter w nienaruszonym stanie. Edycja jego szerokości w celu rozciągnięcia obrazu zmienia sposób interpretacji danych; nie przeskalowuje pikseli. Zamiast tego wygeneruj zasób ponownie w żądanych wymiarach.

Do pierwszego sprawdzenia użyj małego obrazu z widoczną ramką i asymetrycznym znakiem w jednym rogu. Łatwiej na nim zauważyć przycinanie, orientację i brakujące wiersze niż na jednolitym tle.

Plik PNG potrzebuje innej ścieżki ​

LVGL może używać zmiennych obrazów lub źródeł opartych na plikach, ale te drogi mają różne wymagania. Surowy przekonwertowany zasób C zawiera już dane pikseli. Plik .png nadal potrzebuje odpowiedniego dekodera, a źródło z systemu plików potrzebuje też dostępu do pamięci skonfigurowanego w firmware. Przewodnik po przechowywaniu obrazów wyjaśnia tę różnicę.

W przypadku stałego logo statusu skompilowany zasób jest często prosty w zarządzaniu. W przypadku obrazów, które użytkownicy wymieniają na karcie SD, ścieżka oparta na plikach może lepiej pasować do produktu. Podczas uruchamiania systemu plików i dekodera miej pod ręką znany działający skompilowany obraz, aby pusty widżet nie zmuszał cię do debugowania wszystkiego naraz.

Korzystanie z Lopaka do zasobu i układu ​

Aktualna dokumentacja platform w Lopaka wskazuje v9 jako docelowe API C dla LVGL. Dokumentuje też zasoby obrazów do pobrania. Dopasuj ten wynik do wersji LVGL już używanej przez firmware twojej płytki.

Edytor obsługuje projekt ekranu. Inicjalizacja wyświetlacza, sterowniki pamięci, obsługa wejść i zachowanie aplikacji nadal należą do twojego firmware. Jeśli najpierw wybierasz przepływ pracy z wyświetlaczem, zacznij od przewodnika po kreatorze GUI dla ESP32.

Częste pytania ​

Dlaczego otrzymuję niezdefiniowane odwołanie do mojego obrazu? ​

Sprawdź, czy wygenerowany zasób jest kompilowany i czy jego wyeksportowany symbol pasuje do deklaracji. W projekcie mieszanym C/C++ sprawdź też powiązanie na granicy deklaracji.

Czy mogę zmienić nazwę lv_img_dsc_t na lv_image_dsc_t? ​

Wygeneruj ponownie dla docelowej wersji LVGL. Sama zmiana nazwy typu nie gwarantuje, że układ nagłówka, stałe kolorów i ładunek są zgodne.

Dlaczego obraz pojawia się w błędnych wymiarach? ​

Porównaj wymiary źródłowe, wymiary po konwersji, deskryptor i ustawienia widżetu. Napraw pierwszą znalezioną niezgodność, a następnie ponownie przetestuj ten sam mały zasób.