[PL]Własny format pliku graficznego w C++ - #informatycznie

in #polish7 years ago

Cześć #polish! ;)
W tym artykule chciałbym opisać swoje poczynania związane z własnym formatem pliku graficznego. Może ktoś podrzuci jakiś pomysł jak coś zrealizować aby było lepiej? ;) W ramach projektu na studiach musimy stworzyć w C++ konwerter z BMP do naszego formatu, a także z naszego formatu do BMP. Nie możemy sobie sami wymyślić na czym opiera się format, ponieważ dostaliśmy co do niego wytyczne.

Mój format - GMD
Nazwałem swój format GMD. Taką 3 literową nazwę podsunął mi mój znajomy, który zupełnie nie wiedział o co chodzi w projekcie - jest na innych studiach. Zacznijmy może od wytycznych jakie otrzymałem:

  • Zapis obrazu w kolorze oraz skali szarości, przy wykorzystaniu 8 kolorów narzuconych, dedykowanych lub 8-stopniowej skali szarości,
  • Wykorzystanie kompresji LZW, nieskompresowane punkty zapisywane są przy użyciu 3 bitów na pixel.

No i to by było na tyle z wytycznych :)

Specyfikacja
Tutaj pozwolę sobię przekopiować trochę z mojego pliku który dostarczyłem wykładowcy.

Format GMD to prosty format służący do zapisu rastrowego pliku graficznego. Nazwa formatu nawiązuje do pierwszych kolorów zdefiniowanych przez ten format( Green, Magenta, DodgerBlue). Format jest w stanie zapisać obraz kolorowy w dwóch wariantach - przy użyciu 8 kolorów zdefiniowanych, a w drugim wariancie przy użyciu 8 kolorów dedykowanych, a także obraz w 8 stopniowej skali szarości. Zapis opiera się na kompresji LZW. Słownik wykorzystany do algorytmu LZW może zawierać maksymalnie 4096 wpisów, co powoduje że długość słowa wyjściowego wynosi 12 bitów. Nieskompresowane punkty zapisywany są przy użyciu 3 bitów na pixel. Staraliśmy się, aby nagłówek był jak najmniejszy. Po nagłówku zapisana jest tablica kolorów, a następnie sam obraz.

Kolory po prostu dobrałem tak, aby pasowały do nazwy wymyślonej przez mojego kolegę. Rozmiar słownika może zawierać maksymalnie 4096 wpisów, co ułatwi późniejszy odczyt. Poniżej znajduję się graficzne przedstawienie nagłówka:


W tabeli powyżej użyty został typ “Pixel24”, który prezentuje się następująco:

typedef struct RGB {
    unsigned char R;
    unsigned char G;
    unsigned char B;
    } Pixel24;

No i na koniec kolory, jakie sobie wybrałem:

Program
Program dopiero powstaje, ale myślę że nie będzie z tym większego problemu. Mam już opracowane wczytywanie BMP, teraz pracuję nad zapisem 8-stopniowej skali szarości z kompresją LZW. W przyszłości prawdopodobnie podziele się programem - może komuś się przyda? ;)

Dziękuję za przeczytanie mojego wpisu :) Będę wdzięczny za wszelkie sugestie, a w szczególności za pomoc w przypadku wyboru barw dedykowanych - nie mam zupełnie pojęcia na jakim algorytmie się oprzeć ani w jaki sposób wybierać barwy które mają być zapisane jako dedykowane w pliku.

Sort:  

Ciekawa sprawa. Projekt opensource? Jeśli tak to mógłbyś blogować przez https://utopian.io

Aż sprawdzę, bo tylko słyszałem o tym ale jakoś się nie zagłębiałem :)

Zadanie ciekawe, ale przy BPG ... ;)

Cóż, nie mamy stworzyć "superformatu", tylko pokazać że umiemy programować i używać zdobytą wiedzę w praktyce :D

Rozumiem :D Zastanawiam się czemu nikt za wzór nie wziął budowę pliku XPM - jest turbo prosta, ale pytanie co z kompresją ;) U nas było łatwiej stety czy niestety

Nie znałem tego formatu :O U nas dał z BMP dlatego że to popularny i dość prosty do odczytu format. A własny format postanowiłem zapisać podobnie do BMP, tylko z mniejszą liczbą informacji :P

XPM nie jest popularny (kiedyś ikonki do Linugza w tym formacie były, ale teraz SVG / PNG), ale jest bardzo prosty :P

Coin Marketplace

STEEM 0.19
TRX 0.16
JST 0.033
BTC 64010.98
ETH 2791.72
USDT 1.00
SBD 2.65