logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Obraz *.bmp i wyświetlacz TFT - Program do konwersji z bmp na tablicę w C.

ienecode 14 Wrz 2014 14:30 2499 17
REKLAMA
  • #1 13959768
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Witam.

    Potrzebuję programik który zamieni obraz bmp na kod w c, a ściślej potrzebuję tablicy w C z elementami 24 bitowymi. Każdy element tablicy to liczba 24 bitowa z wartościami kolorów R,G i B. Nie mogę nigdzie znaleźć takiego programu?

    Do przyjęcia jest też program który wczytywałby obraz bmp i generował tablice z 8-bitowymi elementami, kolejno wartości w tablicy R,G,B, R...... itd.

    Proszę o pomoc.
  • REKLAMA
  • #3 13959911
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    Ja używan do takich celów LCD image converter - umożliwia stworzenie plików C w dowolnym formacie. Z drugiej strony zamiast robić z bin plik c z którego komp robi bin, nie prościej po prostu zamienić bin na format linkowalny i dołączyć go do projektu? Chociażby jako bibliotekę z grafikami?
  • REKLAMA
  • #4 13960150
    KamilCWK
    Poziom 11  
    Posty: 68
    Pomógł: 5
    Ocena: 2
    @tmf: powiedzmy, że w pliku bin mam 8 bitowe wartości koloru. Jak teraz takiego bin'a zlinkować do programu ?
  • REKLAMA
  • #5 13960452
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    Normalnie, użyć w makefile programu objcopy, który zrobi z dowolnego pliku pliki obj, które można linkować z programem.
  • #6 13961762
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Z tego co widzę to programiki na Linuxa, a coś pod Windowsa?
  • #7 13961783
    KamilCWK
    Poziom 11  
    Posty: 68
    Pomógł: 5
    Ocena: 2
    @Damian7546: to źle kolega widzi, bo jest wersja dla Windows.

    @tmf: normalnie, tzn. ? Jak dotąd używałem skryptów generowanych przez IDE, więc nie wiem jak użyć objcopy choć manuala zacząłem czytać.
  • #8 13961957
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    Wersja skompilowana dla Win znajduje się TUTAJ.

    KamilCWK: tworzenie pliku obiektowego
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Podejrzenie symboli, a tym samym nazwy zmiennych
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Użycie w kodzie programu, np.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kompilacja
    Kod: Bash
    Zaloguj się, aby zobaczyć kod
  • #9 13962086
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Kompilacja przedstawiona powyżej ma ten mankament, że dane lądują w pamięci RAM (w sekcji .data). Na szczęście i na ten problem istnieje rozwiązanie.

    arm-none-eabi-objcopy -I binary -O elf32-littlearm -B arm --rename-section .data=.rodata,alloc,load,readonly,data,contents ...

    Przy okazji nie wiem w czym problem z programem objcopy - wchodzi on w skład każdego toolchaina dla ARM jaki istnieje... Tak jak objdump, nm, size, strip i jeszcze kilkanaście innych narzędzi które się czasem przydają.

    4\/3!!
  • #10 13962094
    KamilCWK
    Poziom 11  
    Posty: 68
    Pomógł: 5
    Ocena: 2
    @badman: zrobiłem tak jak napisałeś lecz podczas kompilacji mam komunikat linkera:
    arm-none-eabi-gcc -nostdlib -L"/home/Programowanie/LPC1769/CMSIS_CORE_LPC17xx/Debug" -Xlinker -Map="Binarny_plik.map" -Xlinker --gc-sections -mcpu=cortex-m3 -mthumb -T "Binarny_plik_Debug.ld" -o "Binarny_plik.axf"  ./src/Binarny_plik.o ./src/cr_startup_lpc175x_6x.o ./src/crp.o  /home/Programowanie/LPC1769/Binarny_plik/src/plik.o -lCMSIS_CORE_LPC17xx
    /usr/local/lpcxpresso_7.3.0_186/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/bin/ld: unknown architecture of input file `/home/Programowanie/LPC1769/Binarny_plik/src/plik.o' is incompatible with arm output
    collect2: error: ld returned 1 exit status
    make: *** [Binarny_plik.axf] Błąd 1


    Dodatkowo sprawdziłem informacje o plikach:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    wnioskuję że objcopy nie wpisuje informacji o architekturze. Jak to zmienić ?
  • REKLAMA
  • #11 13962487
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    Sorki, powinno być
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    a najlepiej to jak wyżej napisał Freddie Chopin
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    wtedy linker nie będzie krzyczał.
  • #12 13964462
    KamilCWK
    Poziom 11  
    Posty: 68
    Pomógł: 5
    Ocena: 2
    Ekstra działa.
    Jeszcze jedno pytanie: Czy można zmienić nazwy zmiennych ? Lubię kiedy w kodzie nazwa zmiennej opisuje do czego służy, po jakimś czasie zapomnę co to jest _binary_plik_bin_start.
  • #13 13964493
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Po pierwsze - jak zapewne łatwo się domyślić - nazwa ta bierze się od nazwy pliku (_binary_<nazwa_pliku>_start), więc po pierwsze wystarczy dobrze nazwać plik i już masz lepszą nazwę.

    Całość zapewne można zmienić przez skrypt linkera, ale przecież w programie możesz sobie te symbole przypisać do dowolnej zmiennej...

    Opcja pierwsza w skrypcie linkera:

    twoja_nowa_nazwa = _binary_plik_bin_start;
    PROVIDE(twoja_nowa_nazwa);


    Opcja druga - stwórz nowy plik źródłowy, a w nim:

    extern const Typ _binary_plik_bin_start;
    extern const void* _binary_plik_bin_size; // typ jest bez znaczenia
    
    const Typ* const twoja_nowa_nazwa = &_binary_plik_bin_start;
    // podobnie dla end, jeśli jest Ci potrzebne
    const size_t rozmiar = (size_t)&_binary_plik_bin_size;


    W nagłówku eksportujesz tylko Twoje nowe nazwy i już.

    Któreś z narzędzi (chyba właśnie objcopy) umożliwia też pewnie zmianę nazwy symboli - trzeba poczytać dokumentację.

    4\/3!!
  • #14 13964532
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    Freddie Chopin napisał:

    Któreś z narzędzi (chyba właśnie objcopy) umożliwia też pewnie zmianę nazwy symboli - trzeba poczytać dokumentację.


    objcopy --redefine-sym _binary_plik_bin_start=tablica plik.o plik.o

    Od tej pory odwołujesz się do zmiennej zewnętrznej tablica. Chcąc jednorazowo zmienić wiele symboli należy skorzystać z opcji --redefine-syms ale jak, to będzi KamilCWK Twoje zdanie domowe...
  • #15 13964748
    deus.ex.machina
    Poziom 32  
    Posty: 1923
    Pomógł: 91
    Ocena: 341
    Choćby darmowy GIMP posiada możliwość exportu - z ciekawostek oferuje on różne "głębokości bitowe" oraz kompresje RLE.

    Przykład exportu bitmapy 16x12, 16 kolorów z kompresja RLE.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #16 13964765
    KamilCWK
    Poziom 11  
    Posty: 68
    Pomógł: 5
    Ocena: 2
    Udało się zmienić symbole. Kolejne pytanie - nie bijcie, wytłumaczcie :)
    Mam 2 pliki binarne z grafiką ikona.bin i tlo.bin. Teraz łącze te dwa plik w jeden plik zamieniam na objektowy, ewentualnie zmieniam nazwy zmiennych
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Znając ilość elementów plików ikona.bin i tlo.bin wiem gdzie w tej jednej tablicy rozpoczynają się wartości reprezentujące grafikę z ikoną. Czy można utworzyć "mądrzejszy" plik obiektowy, który będzie znał początki obydwu tablic ?
  • #17 13964855
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    KamilCWK napisał:
    Teraz łącze te dwa plik w jeden...

    Tylko po co? Przecież możesz sobie dowolną ilość plików binarnych skonwertować do plików obiektowych i zlinkować tą dowolną ilość plików obiektowych z resztą Twojego projektu. Rozwiązanie które teraz przedstawiłeś jest zupełnie bezsensowne.

    4\/3!!
  • #18 13967585
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Problem z programem do generowania tablic w C z obrazu bmp rozwiązany.
    Dzięki za pomoc.
    Temat zamykam.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukiwał programu do konwersji obrazów BMP na tablice w języku C, z elementami 24-bitowymi reprezentującymi kolory RGB. W odpowiedziach zasugerowano kilka narzędzi, w tym SEGGER emWin oraz LCD Image Converter, które mogą generować pliki C z obrazami. Użytkownicy omówili również metody linkowania plików binarnych do projektów, wykorzystując narzędzie objcopy do konwersji plików binarnych na format obiektowy. Wskazano na możliwość zmiany nazw zmiennych w kodzie oraz na użycie GIMP do eksportu bitmap z różnymi głębokościami bitowymi. Na koniec użytkownik potwierdził rozwiązanie problemu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA