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.

AN
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 6 lat
  • Postów:62
0

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

Przykład

Kopiuj
#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/

MA
Raczej tryb binarny.
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?

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:23 minuty
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 7x, ostatnio: Wibowit

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.