2009-03-04 11 views
6

Chcę odczytać plik mapy bitowej (z systemu plików) za pomocą OCAML i zapisać piksele (kolory) wewnątrz tablicy, która ma wymiar bitmapy, każdy piksel zajmuje jedną komórkę w tablicy.Jak odczytać bitmapę w OCAML?

Znalazłem funkcję Graphics.dump_image image -> tablica kolorów tablica , ale nie czyta z pliku.

Odpowiedz

1

Nie znam prostego sposobu na zrobienie tego. Możesz otworzyć plik za pomocą open_in i odczytać bajt w tym samym czasie z input_char, wessać nagłówek i dane i zbudować w ten sposób color array array dla prostych formatów (np. BMP), ale dla takich plików jak JPG lub PNG rozwiązanie prawdopodobnie byłoby więcej pracy niż chcesz dostać.

8

CAMLIMAGE powinien to zrobić. Istnieje również pakiet debian (libcamlimage-ocmal-dev), a także instalacja poprzez godi, jeśli używasz tego do zarządzania pakietami ocaml.

Jako przydatny przykład czytania i manipulowania obrazami w ocaml, sugeruję przejrzenie kodu dla algorytmu usuwania szwów na eigenclass.

Możesz także, jak stwierdził jonathan - ale nie za dobrze - wywoływać funkcje C z ocaml, takie jak ImageMagick. Chociaż zamierzasz wykonać wiele manipulacji danymi obrazu, aby przenieść obraz do ocaml, zawsze możesz napisać c dla wszystkich swoich funkcji, aby manipulować obrazem jako abstrakcyjnym typem danych - wydaje się to być całkowicie przeciwne do tego, co chcesz jednak, pisząc większość programu w C nie ocaml.

Ponieważ ostatnio chciałem bawić się z kamerami (i miałem problemy z instalacją - musiałem zmodyfikować dwa pliki ml z błędów kompilacji, jednak bardzo proste). Oto szybki program, black_and_white.ml, i jak go skompilować. Ten powinien dostać ktoś bezboleśnie rozpocząć korzystanie z pakietu (zwłaszcza, dynamiczne generowanie obrazu):

let() = 
     let width = int_of_string Sys.argv.(1) 
     and length = int_of_string Sys.argv.(2) 
     and name = Sys.argv.(3) 
     and black = {Color.Rgb.r = 0; g=0; b=0; } 
     and white = {Color.Rgb.r = 255; g=255; b=255; } in 
     let image = Rgb24.make width length black in 
     for i = 0 to width-1 do 
      for j = 0 to (length/2) - 1 do 
       Rgb24.set image i j white; 
      done; 
     done; 
     Png.save name [] (Images.Rgb24 image) 

I skompilować,

ocamlopt.opt -I /usr/local/lib/ocaml/camlimages/ ci_core.cmxa graphics.cmxa ci_graphics.cmxa ci_png.cmxa black_and_white.ml -o black_and_white 

I biegać,

./black_and_white 20 20 test1.png 
+0

Dziękuję za odpowiedź, ale naprawdę potrzebuję kilku linii, które odczytują plik * .bmp i przekształcają go w tablicę kolorów, twoje librairies są cudowne, ale nie potrzebuję tego wszystkiego, więc możesz pomóc ! – 0xFF

+1

biblioteki lub toczyć własne, jakich innych opcji oczekujesz? – nlucaroni

+0

Zainstalowałem najnowsze ocaml i biblioteki dostępne z menadżera pakietów Debian Wheezy, dokładnie skopiowałem twój przykład i skompilowałem zgodnie z instrukcjami. Mój komunikat o błędzie: "Niezwiązany kolor modułu". Czy są jakieś "otwarte" stwierdzenia, o których zapomniałeś wspomnieć, czy jeszcze lepiej, czy możesz dostarczyć plik Makefile kompatybilny z OCamlMakefile, który rozwiąże wszystkie zależności? Dzięki! –

0

Jeśli don” • Chcemy używać CAMLIMAGE, zwykle surowego formatu RGB lub PNM/PPM (które mają łatwy do utworzenia format nagłówka, a następnie wartości RGB). ImageMagick pozwala następnie wyświetlać te formaty lub konwertować je na bardziej użyteczne formaty.

1

Można również użyć jednego z wielu powiązań SDL dla OCaml, w szczególności plików SDL_image, które pozwalają łatwo załadować wszelkiego rodzaju obrazy i zapewnia funkcje dostępu do poszczególnych pikseli i danych surowych jako tablicy.

OCamlSDL jest popularnym.