Kompresja RLE

0

Mam mały problem z zastosowaniem kompresji RLE w bitmapie. Odczytałem składowe kolorów wszystkich pikseli w bitmapie, sprawdziłem ilość powtórzeń, ale nie wiem jak zapisać tą ilość powtórzeń w pliku. Będę wdzięczny za pomoc.

0

Temat powinien mieć inny tutuł np. "Jak zapisać dane do pliku"

Przykład

#include <stdio.h>
int main ()
{
  FILE * pFile;
  pFile = fopen ("myfile.txt","w");
  if (pFile!=NULL)
  {
    fputs ("fopen example",pFile);
    fclose (pFile);
  }
  return 0;
}

Źródło:
http://www.cplusplus.com/reference/cstdio/fopen/

0

Fascynująca odpowiedź. Nie wiem jak będę mógł Ci się odwdzięczyć za pomoc.
A może teraz znajdzie się ktoś kto wie jak zapisywać ilość powtórzeń kolorów w bitmapie?

0

Tzn, chcesz:

  1. Zaimplementować kompresję RLE ze standardu BMP, PCX lub innego? Wtedy poczytaj w standardzie.
  2. Stworzyć własny mechanizm kompresji RLE? Wtedy wymyśl coś własnego.

2 cd.
Typowo robi się to tak (kompresja; zaczynamy z licznikiem powtórzeń == 0):

  • wczytujemy znak z wejścia,
  • jeśli licznik powtórzeń jest równy 0 i np 2 ostatnie znaki nie są takie same (lub do tej pory było mniej niż 2 znaki) to wypisz znak na wyjście od razu,
  • jeśli 2 ostatnie znaki są takie same, ale aktualny znak jest inny niż wcześniejszy to zserializuj licznik, np tak: https://developers.google.com/protocol-buffers/docs/encoding#varints a nastepnie go wyzeruj i wypisz znak na wyjście,
  • w innym wypadku, czyli jeśli 2 ostatnie znaki były takie same i aktualny znak też jest taki sam jak te wcześniejsze to zwiększ licznik o jeden i nie wypisuj nic na wyjście,

Proces dekodowania wtedy jest taki:

  • wczytuj znak z wejścia,
  • jeśli 2 ostatnie znaki są takie same i obecny znak także to wypisz aktualny znak, a następnie zdeserializuj licznik i wypisz dodatkowo tyle kopii ile wynosi wartość licznika,
  • w innym wypadku po prostu wypisz znak na wyjście,

Zamiast 'znaki' możesz oczywiście wstawić 'piksele' lub np podzielić obrazek na płaszczyzny (np płaszczyzna czerwieni, zieleni i niebieskiego).

Pseudokod nietestowany. Może być zwalony.

1 użytkowników online, w tym zalogowanych: 0, gości: 1