6

我想使用 OCAML 读取位图文件(从文件系统),并将像素(颜色)存储在具有位图维度的数组中,每个像素将占用数组中的一个单元格。

我找到了函数Graphics.dump_image image -> color array array 但它没有从文件中读取。

4

4 回答 4

8

CAMLIMAGE应该这样做。还有一个 debian 包 ( libcamlimage-ocmal-dev),以及通过godi安装,如果您使用它来管理您的 ocaml 包。

作为在 ocaml 中读取和操作图像的一个有用示例,我建议在eigenclass上查看接缝去除算法的代码。

正如乔纳森所说——但不是很好——你也可以从 ocaml 调用 C 函数,例如ImageMagick。尽管您将对图像数据进行大量操作以将图像带入 ocaml,但您始终可以为所有函数编写 c 以将图像作为抽象数据类型进行操作——这似乎与但是,您想要用 C 而不是 ocaml 编写大部分程序。

因为我最近想玩 camlimages(并且在安装它时遇到了一些麻烦——我不得不从编译错误中修改两个 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
于 2009-03-05T02:26:33.480 回答
1

我不知道开箱即用的方法。您可以使用 打开文件open_in并一次读取一个字节input_char,吸入标题和数据并为简单格式(例如 BMP)构建color array array这种方式,但对于 JPG 或 PNG 之类的任何东西,您自己的解决方案可能会比你想进入的工作更多。

于 2009-03-04T23:49:14.887 回答
1

您还可以使用 OCaml 的众多 SDL 绑定之一,特别是 SDL_image 绑定,它可以让您轻松加载各种图像,并提供以数组形式访问单个像素和原始数据的函数。

OCamlSDL是一种流行的。

于 2012-11-14T09:10:21.140 回答
0

如果您不想使用 CAMLIMAGE,通常使用原始 RGB 或 PNM/PPM(具有易于创建的标题格式,后跟 RGB 值)图像。ImageMagick 允许您查看这些格式或将它们转换为更可用的格式。

于 2009-03-14T15:47:26.863 回答