Odczyt formatu KOALA, tryb 0 i 2
Wspomniany już wcześniej format zapisu plików PIC stosuje 3 sposoby zapisania danych obrazu. 8 bajt nagłówka zapisany wartością 0 (zero) oznacza, że dane obrazu nie zostały skompresowane, wartość 1 oznacza kompresję pionową, wartość 2 kompresję poziomą.
W trybie który dla uproszczenia nazwę trybem zero za ostatnim bajtem nagłówka znajdują się dane RAW obrazu. Zazwyczaj będzie to blok o wielkości 7680 bajtów. W praktyce nie spotkałem pliku o innych rozmiarach, natomiast trzeba wiedzieć, że rozmiar nagłówka jak i danych obrazu nie jest stały. O tym kiedy indziej.
Poniżej przykładowy program do odczytu pliku PIC z nieskompresowanymi danymi, zakładamy tutaj dla przykładu, że jest to obraz utworzony dla trybu Graphics 15, z najczęściej występującym nagłówkiem.
0 GRAPHICS 31 : E=DPEEK(88) : OPEN #%1,4,%0,”D:LISEK0.PIC”
1 BGET #%1,E,27 : MOVE E+13,708,5 : BGET #1,E,7680 : CLOSE #%1 : GET E : END
W trybie drugim zapisane za nagłówkiem dane obrazu poddane są kompresji RLE sposobem opisanym w Atariki. Okazuje się, że dekompresja tego typu pliku jest dosyć prosta (choć powolna) do realizacji nawet w języku TBXL. Poniżej przykład w którym zakładamy, że plik PIC jest właściwym plikiem (z metodą zapisu 2) a obraz został utworzony dla trybu Graphics 15 i również posiada najczęściej występujący nagłówek.
0 GRAPHICS 31 : E=DPEEK(88) : TRAP 5
1 OPEN #%1,4,%0,”D:LISEK2.PIC” : BGET #%1,E,27 : MOVE E+13,708,5
2 DO : GET #%1,A : IF A>127 THEN X=A-128 : EXEC P : BGET #%1,E,X : E=E+X
3 IF A<128 THEN X=A:EXEC P : GET #1,Y : FOR Z=%1 TO X : POKE E,Y : E=E+%1 : NEXT Z
4 LOOP
5 CLOSE #%1 : GET Y : END
6 PROC P : IF X=%0 THEN GET #%1,X,Y : X=X*256+Y
7 ENDPROC
W obydwu przykładach zakładamy znaną konstrukcję pliku, ale dobrą praktyką byłoby sprawdzenie pozostałych parametrów pliku z nagłówka. Bajt 5 nagłówka informuje o długości nagłówka, słowo zawarte w bajtach 19-20 informuje o długości bloku danych obrazu, bajt 8 informuje o sposobie kompresji.
Przegląd plików PIC w poszukiwaniu plików zawierających różne kombinacje w nagłówku wykazały że najczęściej występującym typem pliku PIC jest obraz zapisany z kompresją pionową, dla trybu Graphics 15 (Antic $0E). Pliki z metodą kompresji poziomej są rzadkością, natomiast pliku nieskompresowanego nie spotkałem.
Poniżej plik z dyskietką ATR, na którym znajduje się kilka typów plików PIC:
- LISEK0.PIC – Graphics 15 (Antic $0E), 160×192, nieskompresowany
- LISEK1.PIC – Graphics 15 (Antic $0E), 160×192, kompresja pionowa
- LISEK2.PIC – Graphics 15 (Antic $0E), 160×192, kompresja pozioma
- LISEKICO.PIC – Graphics 15 (Antic $0E), 96*80, nieskompresowany
- LISEK0T.PIC – Graphics 15 (Antic $0E), 160×192, nieskompresowany, 4 linie tekstu
Opisana tutaj procedurka potrafi prawidłowo odczytać pliki z metodą kompresji 1 i 2 ale zakłada standardową 27 bajtową wielkość nagłówka, tryb Graphics 15 i rozdzielczość obrazu 160×192 punkty.
Biblioteka: