Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

BMP==>Assembler RAW Data

Ch.M. 02 Paź 2007 13:24 3314 8
  • #1 02 Paź 2007 13:24
    Ch.M.
    Poziom 27  

    Witam

    Post dotyczy programu BMP Picture Converter für das S65-Display http://www.comwebnet.de/ który może rekodować kilkoma metodami bitmapy do RAW.

    Moja znajomość języka niemieckiego... no w zasadzie raczej nieznajomośc nie pozwala mi na dogłębne zrozumienie programu (Bascomowego?) do konwersji bitmap, więc proszę o wytłumaczenie mi algorytmu rekodowania pliku BMP i sposobu zapisu pikseli

    Z tego co widzę, to zapisywane są bloki MSB/LSB (16bit kolor) po 64 pixele (tablica 128 bajtów). Dlaczego akurat tyle? Czyżby oszczędność rejestrów na których będziemy operować przy wyświetlaniu obrazka?

    Dlaczego najpierw jest kodowana starsza część słowa? Przecież później będzie kłopot z szybkim przesłaniem danych do wyświetlacza (do niego wpisuje sie najpierw młodsza część słowa - jeśli dobrze pamiętam)

    Jak wygląda procedura kodowania: od lewa do prawej, od dołu do góry? Czy jakoś inaczej?

    Czy kolory po zakodowaniu są 1:1 z tym co pokaże nam wyświetlacz od S65, czy trzeba obrobić dane przed wysłaniem?

    Odpowiedzi na te pytania można zapewne znależć pod linkiem który podałem, a dokładniej linkiem do forum, ale niestety nie znam niemieckiego na tyle by mi się udało wszystko zrozumieć. Mam nadzieje, ze ktoś się zainteresuje moim wątkiem i poogląda linki. Dodam, że ten program jest kompatybilny z wtyczką Bascomową do obsługi "S65 display", aczkolwiek mnie interesuje sposób kodowania dla ASM (opcja nr.5 przy enkodowaniu)

    W obecnej chwili mam algorytmy napisane przez samego siebie do wyświetlania 1bitowych obrazków o powierzchni max 256pix ale z oszczędnym dekodowaniem 1bit=1pix. Niestety proces kodowania jest upierdliwy: z palca :) dlatego chce skorzystać z gotowego narzędzia do kodowania znaków.

    Pozdrawiam

    0 8
  • #2 03 Paź 2007 18:41
    markosik20
    Poziom 33  

    Cytat:
    nie pozwala mi na dogłębne zrozumienie programu (Bascomowego?) do konwersji bitmap, więc proszę o wytłumaczenie mi algorytmu rekodowania pliku BMP i sposobu zapisu pikseli


    Tutaj masz wszystko wyjaśnione.
    http://januszg.hg.pl/teksty/budowa_pliku_bmp.html

    0
  • #3 04 Paź 2007 00:26
    master_pablo
    Poziom 16  

    Byc moze przydatne beda informacje zawarte w moich dwoch ostatnich postach w tym temacie. Wprawdzie to dla innego wyswietlacza, ale sposob postepowania bedzie podobny, a udostepniony kod programu tez mozna latwo przerobic.

    0
  • #4 04 Paź 2007 07:58
    Ch.M.
    Poziom 27  

    No coż dziękuje za odpowiedzi mimo, że chodziło mi tylko o ten konkretny program, ale podejrzewam, że pracuje on tak jak ten z wątku od "master_pablo"
    Co do postu "markosik20" to wiem jak się zapisuje bitmapy, te info jest dostępne na wiki. Format RGB użyty w S65 to 5-6-5 i chodziło mi tylko o to by upewnić się, że ten program zakoduje na 2bajtach własnie w tym trybie :)

    0
  • #5 04 Paź 2007 20:44
    markosik20
    Poziom 33  

    Napisałem sobie właśnie taki program na PC (bmp na czyste dane do S65), plik zapisuje na SD. Jak tylko poprawię funkcjonalność programu oraz rozszerze konwersję na różne BMP to oczywiście wrzucę na elektrodę. Na razie BMP (24bitowe) dekoduję w biegu (co niestety powoduje dłuższe wyswietlanie obrazka).

    0
  • #6 09 Paź 2007 10:48
    Ch.M.
    Poziom 27  

    Dziekuję za odpowiedzi, program "rozbiera" pliki BMP tak jak od niego oczekiwałem :)

    0
  • #7 03 Lut 2008 12:25
    Wilku
    Poziom 17  

    Witam. Używam powyższego programu do konwersji i pojawia mi się drobny problem. Nie każda mapa wyświetlana jest prawidłowo. Np. 40x40pix jest OK, ale już 70x20 wyświetla bzdury, ale wymiary prawidłowe. Używam Atmega32, avr-gcc. Poniżej kod odpowiedzialny za wyświetlanie bmp.

    Code:

    void lcd_bmp(char *s, uint8_t x, uint8_t y, uint8_t wys, uint8_t szer)
    {
    uint8_t ch1;
    uint16_t rozmiar,j;
           lcd_wrcmd16(0x0504);
           lcd_wrcmd16(0x0800+y);
           lcd_wrcmd16(0x0900+y+szer-1);
       lcd_wrcmd16(0x0A00+x);
           lcd_wrcmd16(0x0B00+x+wys-1);
       rozmiar=wys*szer*2;
        for (j=0; j<rozmiar; j++)       
          {
          ch1=pgm_read_byte(s+j);
          lcd_wrdata(ch1);
            }
    }


    Dodam że wywołuje funkcje w ten sposób :

    lcd_bmp(cyfra0,10,10,60,40);

    Podaje nazwe tablicy, pozycje x , y oraz szerokosc i wysokosc.
    Czy coś robie nie tak ?

    0
  • #8 24 Mar 2008 00:01
    darrrrek
    Poziom 22  

    Witam czy ktos mogly mi podeslac ten program , z pierwszewgo postu tego tematu ?? link niestety juz nie dziala.

    Bede wdzieczny za pomoc
    Pozdrawiam !

    0
  • #9 15 Kwi 2008 12:00
    pubus
    Poziom 30  

    Głupia sprawa z tymi obrazkami...
    Jeżeli wymiary obrazka są podzielne przez 4 wszystko jest OK...
    Czyli np. przekonwertowane BMP 48x48 wyświetli się normalnie ale już 50x50 rozjedzie się...
    Co do programu to nie jest to specjalnie skomplikowane...
    offset 18 (dec) Szerokość obrazu w pixelach
    offset 22 (dec) Wysokość obrazu w pixelach
    To są rozmiary tablicy jaka jest potrzebna do przechowania danych...
    offset 10 (dec) offset od którego zaczynają się dane...
    Teraz odczytujesz kolejno 3 bajty...
    Są to kolejno B, G, R...
    Teraz LCD z S65 ma układ kodowania R(5)-G(6)-B(5)...
    Obcinasz najmniej znaczące bity i składasz to do jednej zmiennej 16-bit (wchar_t) i ładujesz do tablicy...
    Potem możesz robić z tym co chcesz...
    Np. zapisać do tekstowego pliku sformatowaną już jako tablica dla C...
    Acha powyższe dotyczy bitmap w trybie 24-bit...
    Nie wiem czy jest sens się męczyć z pisaniem programu pod inne typy skoro prawie każdy program graficzny może zapisać nam obrazek jako 24-bit'ową bitmapę...

    0