OCAML を使用して (ファイル システムから) ビットマップ ファイルを読み取り、ビットマップの次元を持つ配列内にピクセル (色) を格納します。各ピクセルは配列内の 1 つのセルを取得します。
関数Graphics.dump_image image -> color array arrayを見つけました が、ファイルから読み取れません。
OCAML を使用して (ファイル システムから) ビットマップ ファイルを読み取り、ビットマップの次元を持つ配列内にピクセル (色) を格納します。各ピクセルは配列内の 1 つのセルを取得します。
関数Graphics.dump_image image -> color array arrayを見つけました が、ファイルから読み取れません。
CAMLIMAGEはそれを行う必要があります。ocaml パッケージの管理に使用する場合は、debian パッケージ ( libcamlimage-ocmal-dev
) とgodiによるインストールもあります。
ocaml で画像を読み取って操作する便利な例として、eigenclassでシーム除去アルゴリズムのコードを調べることをお勧めします。
また、ジョナサンが述べたように、しかしうまくいきませんが、 ImageMagickなどの ocaml から C 関数を呼び出すこともできます。画像を ocaml に取り込むために画像データの多くの操作を行うことになりますが、すべての関数に対して常に c を記述して、画像を抽象データ型として操作することができます。これは、ただし、ほとんどのプログラムを ocaml ではなく C で記述します。
私は最近camlimagesをいじりたいと思っていたので(そしてそれをインストールするのにいくらか問題がありました - 私はコンパイルエラーから2つの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
一度に1バイトずつ読み取りinput_char
、ヘッダーとデータを吸い込んで、color array array
単純な形式(BMPなど)の場合はそのように構築できますが、JPGやPNGのようなものについては、独自のソリューションを使用することをお勧めします。あなたが入りたいより多くの仕事になりなさい。
また、OCaml 用の多数の SDL バインディングの 1 つ、特に SDL_image バインディングを使用することもできます。これにより、あらゆる種類の画像を簡単にロードでき、個々のピクセルと生データに配列としてアクセスする関数が提供されます。
OCamlSDLは人気のあるものです。
CAMLIMAGEを使用したくない場合は、通常、生のRGBまたはPNM / PPM(ヘッダー形式とそれに続くRGB値を簡単に作成できます)画像が使用されます。ImageMagickを使用すると、この形式を表示したり、より使いやすい形式に変換したりできます。