Przejdź do treści

Obraz do tablicy C dla Arduino i ESP32 ​

Abstrakcyjna pomarańczowa geometria przechodząca w piksele i upakowane wiersze danych obrazu

Aby przekonwertować obraz na tablicę C, zmień jego rozmiar na wymiary potrzebne na wyświetlaczu, wybierz format pikseli akceptowany przez twoją bibliotekę rysowania i wyeksportuj dane pikseli wraz z wywołaniem rysowania. W przypadku monochromatycznego OLED zazwyczaj oznacza to bitmapę 1-bitową. W przypadku kolorowego TFT częstym wyborem jest RGB565.

Rozszerzenie pliku tablicy mówi ci bardzo niewiele. Dwa nagłówki mogą zawierać liczby szesnastkowe, a mimo to wymagać zupełnie innych funkcji rysowania.

Wybierz bibliotekę rysowania przed konwersją ​

Zacznij od biblioteki już uruchomionej na twojej płytce. Konwersja PNG na tablicę C dla U8g2 nie powinna dawać tego samego wyniku co konwersja dla LVGL.

Docelowy firmwareZasób do przygotowaniaSzczegół integracji
U8g2Bitmapa XBMSzerokość i wysokość towarzyszą tablicy bajtów
TFT_eSPIPiksele RGB565 lub bitmapa monochromatycznaUżyj dopasowanej funkcji rysowania
Adafruit GFXPiksele RGB565 lub bitmapa monochromatycznaDopasuj upakowanie bitmapy do API
LVGL 9Deskryptor obrazu i dane pikseliSama tablica pikseli nie jest kompletnym obiektem obrazu

Dokumentacja platform w Lopaka zawiera listę formatów wyjściowych. Najpierw wybierz platformę, aby edytor wyeksportował odpowiedni zasób.

Konwertuj PNG lub BMP w Lopaka ​

  1. Otwórz Lopaka i wybierz docelową platformę oraz wymiary ekranu.
  2. Otwórz narzędzie Obraz i prześlij grafikę źródłową.
  3. Zmień rozmiar lub przytnij do rozmiaru, jaki obraz zajmie na urządzeniu. Ikona statusu o rozmiarze 24 pikseli nie potrzebuje bitmapy źródłowej na cały ekran.
  4. Wybierz tryb monochromatyczny lub RGB, gdy platforma oferuje oba. W przypadku grafiki liniowej sprawdź wynik przy wyłączonym ditheringu; w przypadku fotografii porównaj dostępne tryby ditheringu.
  5. Umieść zasób na ekranie, a następnie skopiuj wygenerowane dane i kod rysowania razem.

Przewodnik po imporcie obrazów opisuje te kontrolki. Jeśli potrzebujesz tylko konwersji na monochromatyczny OLED, skorzystaj z krótszego przewodnika po konwerterze obrazów U8g2.

Jak duża będzie tablica? ​

W przypadku nieskompresowanej bitmapy 1-bitowej upakowanej wierszami zaokrąglij każdy wiersz w górę do pełnego bajtu:

text
row bytes = (width + 7) / 8, using integer division
bitmap bytes = row bytes * height

RGB565 bytes = width * height * 2

Obliczenia te opisują ładunki pikseli. Nie obejmują deskryptorów, wyrównania, palet ani dodatkowych buforów wykonawczych.

Wymiary1-bitowa upakowana wierszamiRGB565
24 × 2472 bytes1,152 bytes
48 × 48288 bytes4,608 bytes
128 × 641,024 bytes16,384 bytes
240 × 2407,200 bytes115,200 bytes
320 × 2409,600 bytes153,600 bytes

W przypadku monochromatycznej ikony 13 × 8 każdy wiersz zajmuje dwa bajty. Ładunek ma 16 bajtów, mimo że podzielenie łącznej liczby pikseli przez osiem daje 13. Ta różnica ma znaczenie przy diagnozowaniu przesuniętego obrazu.

Wzór monochromatyczny 13 na 8 z dwoma zapisanymi bajtami na wiersz

Wzór testowy, 13 × 8: dwa zapisane bajty na wiersz, łącznie 16 bajtów. Pobierz pasujący plik XBM.

Rozmiar wygenerowanego pliku źródłowego jest jeszcze inny. Tekst taki jak 0xF8, 0x00 zajmuje więcej miejsca na dysku niż dwa bajty, które opisuje. Przy planowaniu pamięci flash sprawdzaj rozmiar skompilowanego firmware.

Jeśli wybierasz narzędzie do konwersji, porównanie alternatyw dla image2cpp wyjaśnia, gdzie kończy się samodzielny konwerter, a zaczyna przydawać się edytor ekranów.

Dlaczego przekonwertowana tablica może wyglądać źle ​

Jeśli kontur jest poprawny, ale kolory są złe, sprawdź format kolorów i kolejność bajtów. RGB565 przydziela pięć bitów na czerwień, sześć na zieleń i pięć na niebieski; Adafruit wyjaśnia to kodowanie w swojej dokumentacji grafiki.

Jeśli obraz monochromatyczny powtarza się lub przechyla na bok, sprawdź jego szerokość, dopełnienie wierszy i kolejność bitów. Wewnętrzny bufor ekranu kontrolera wyświetlacza niekoniecznie ma układ taki jak bitmapa akceptowana przez twoją funkcję rysowania.

Skorzystaj z pasującego przewodnika rozwiązywania problemów, jeśli przekonwertowane bajty wyglądają źle na TFT lub monochromatycznym OLED: napraw kolory RGB565 i kolejność bajtów w TFT_eSPI albo napraw bitmapy drawXBMP na SSD1306.

Przechowuj wynik konwertera i wygenerowane przez niego wywołanie rysowania jako parę. Skopiowanie samej tablicy do niepowiązanego przykładu usuwa informacje, które nadają bajtom znaczenie.

Pliki PNG i surowe piksele to różne rzeczy ​

Zmiana nazwy logo.png na logo.h nie dekoduje obrazu. PNG zawiera skompresowane dane obrazu i metadane. Funkcja rysowania, która oczekuje surowych pikseli RGB565, nie może bezpośrednio zinterpretować tego pliku.

W przypadku stałego logo konwersja przed kompilacją może uprościć ścieżkę firmware. W przypadku wymienialnych fotografii na nośniku danych lepszym wyborem może być dekoder. Wybieraj na podstawie tego, jak zasób będzie aktualizowany, a nie tylko tego, którą nazwę pliku najłatwiej wkleić do szkicu.

Częste pytania ​

Czy ta sama tablica C może działać na OLED i TFT? ​

Tylko wtedy, gdy obie ścieżki rysowania akceptują tę samą reprezentację. Ikona 1-bitowa może być przydatna na obu, ale tablica kolorów nie stanie się bitmapą monochromatyczną bez konwersji.

Czy konwersja PNG zachowuje przezroczystość? ​

Zależy to od formatu wyjściowego. Zwykły RGB565 nie zawiera kanału alfa. Sprawdź, czy eksport spłaszcza przezroczystość na tle, czy używa osobnego mechanizmu przezroczystości.

Od czego zacząć w przypadku pełnego ekranu? ​

Skorzystaj z przewodnika po kreatorze GUI dla Arduino, aby połączyć tekst, kształty i obrazy. Pozostawienie wartości temperatury jako tekstu pozwala firmware aktualizować ją bez zastępowania całej bitmapy ekranu.