我想使用 OCAML 读取位图文件(从文件系统),并将像素(颜色)存储在具有位图维度的数组中,每个像素将占用数组中的一个单元格。
我找到了函数Graphics.dump_image image -> color array array 但它没有从文件中读取。
我想使用 OCAML 读取位图文件(从文件系统),并将像素(颜色)存储在具有位图维度的数组中,每个像素将占用数组中的一个单元格。
我找到了函数Graphics.dump_image image -> color array array 但它没有从文件中读取。
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
我不知道开箱即用的方法。您可以使用 打开文件open_in
并一次读取一个字节input_char
,吸入标题和数据并为简单格式(例如 BMP)构建color array array
这种方式,但对于 JPG 或 PNG 之类的任何东西,您自己的解决方案可能会比你想进入的工作更多。
您还可以使用 OCaml 的众多 SDL 绑定之一,特别是 SDL_image 绑定,它可以让您轻松加载各种图像,并提供以数组形式访问单个像素和原始数据的函数。
OCamlSDL是一种流行的。
如果您不想使用 CAMLIMAGE,通常使用原始 RGB 或 PNM/PPM(具有易于创建的标题格式,后跟 RGB 值)图像。ImageMagick 允许您查看这些格式或将它们转换为更可用的格式。