Как прочитать растровое изображение в OCAML? - PullRequest
6 голосов
/ 05 марта 2009

Я хочу прочитать файл растрового изображения (из файловой системы), используя OCAML, и сохранить пиксели (цвета) внутри массива, имеющего размерность растрового изображения, каждый пиксель будет занимать одну ячейку в массиве.

Я нашел функцию Graphics.dump_image image -> массив цветовых массивов но он не читает из файла.

Ответы [ 4 ]

8 голосов
/ 05 марта 2009

CAMLIMAGE должен сделать это. Существует также пакет debian (libcamlimage-ocmal-dev), а также установка через godi , если вы используете его для управления пакетами ocaml.

В качестве полезного примера чтения и манипулирования изображениями в ocaml, я предлагаю просмотреть код алгоритма удаления шва на eigenclass .

Вы также можете, как сказал Джонатан - но не очень хорошо - вызывать функции C из ocaml, такие как ImageMagick . Несмотря на то, что вы собираетесь сделать много манипуляций с данными изображения, чтобы привести изображение в ocaml, вы всегда можете написать c для всех ваших функций, чтобы манипулировать изображением как абстрактным типом данных - это, кажется, полностью противоположно Вы хотите, хотя, писать большую часть программы на C, а не ocaml.

Поскольку я недавно хотел поиграться с камлимажами (и у меня возникли некоторые проблемы с его установкой - мне пришлось изменить два файла ml из-за ошибок компиляции, хотя и очень простых). Вот быстрая программа, black_and_white.ml, и как ее скомпилировать. Это должно заставить кого-то безболезненно начать работу с пакетом (особенно с динамической генерацией изображения):

   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)

и для компиляции,

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

и бежать,

./black_and_white 20 20 test1.png
1 голос
/ 14 ноября 2012

Вы также можете использовать одну из многочисленных привязок SDL для OCaml, особенно SDL_image, которая позволяет легко загружать все виды изображений и предоставляет функции для доступа к отдельным пикселям и необработанным данным в виде массива.

OCamlSDL является популярным.

1 голос
/ 05 марта 2009

Я не знаю нестандартного способа сделать это. Вы можете открыть файл с помощью open_in и прочитать его байт за раз с помощью input_char, отсосать заголовок и данные и создать color array array таким образом для простых форматов (например, BMP), но для чего-либо вроде JPG или PNG - это ваше собственное решение, вероятно, будет более трудоемким, чем вы хотите.

0 голосов
/ 14 марта 2009

Если вы не хотите использовать CAMLIMAGE, обычно используются необработанные изображения RGB или PNM / PPM (в которых легко создать формат заголовка с последующими значениями RGB) ImageMagick позволяет вам просматривать эти форматы или преобразовывать их в более удобные форматы.

...