OCaml で画像処理を行いたい.
OCaml で画像を扱うためには, CamlImages というライブラリがあり, おそらくはこれが標準的に用いられているようなので, これを試してみた.
(stackoverflow) How to read a bitmap in OCAML? にあった,上下が白黒で分かれている四角を PNG で保存するコードを動かしてみる.
CamlImages の使い方
Step 1. まずは Dune で OCaml の初期テンプレートを作る. このやり方は Dune を使って OCaml コードのテンプレートを作る方法 に書いたので, 適宜参照されたし.
要約すると,以下のようにして, すぐに実行可能な main.ml ファイルを作ることができる.
$ mkdir test_camlimages
$ cd test_camlimages
$ dune init exec main
$ echo "(lang dune 3.0)" > dune-project
これで,_build
ディレクトリと,
main.ml
, dune
, dune-project
ファイルができる.
Step 2. CamlImages をインストールする.
$ opam install camlimages
Step 3.
dune
ファイルの依存関係に
camlimages.core
,
camlimages.png
を追加してやる.
;; dune
(executable
(name main)
(libraries
camlimages.core
camlimages.png
))
Step 4.
main.ml
ファイルに例えば以下のようなコードを書く.
これはプログラム呼び出し時にコマンドラインから幅と高さと保存するファイル名を取得し,
その幅と高さで上部を白,下部を黒色で塗った四角をそのファイル名で PNG で保存するコード1.
(* main.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.r = 0; g = 0; b = 0 }
and white = { Color.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)
Step 5.
main.ml
を実行すると,PNG 画像が保存できる.
$ dune exec ./main.exe 100 100 output.png
保存された output.png は以下のようになる.
ハッピー.
参考
-
(stackoverflow) How to read a bitmap in OCAML?
今回動かしているのは,ここに提示されていたコードほぼそのままである. ただし,stackoverflow 上のものは,レコード black/white を作る際に
Color.Rgb.r
のようにしてフィールドを指定していたが, 最新の CamlImages ではそれではコンパイルが通らず,Color.r
のようにする必要があった.あと,dune の依存関係に何を追加すれば良いのか,かなり悩んだ. CamlImages のコア機能は
camlimages.core
で提供されているようだ. 当初はそれがcamlimages
でインクルードできるものかと思って,そのように指定していた. 当然コンパイルは通らず,かなりの時間を費やしてしまった.そういったこともあり,とりあえず最低限動かすところまで,補足しておいた.
-
(stackoverflow) How to read a bitmap in OCAML? ここに提示されていたコードほぼそのまま. ↩