6

OCAML を使用して (ファイル システムから) ビットマップ ファイルを読み取り、ビットマップの次元を持つ配列内にピクセル (色) を格納します。各ピクセルは配列内の 1 つのセルを取得します。

関数Graphics.dump_image image -> color array arrayを見つけました が、ファイルから読み取れません。

4

4 に答える 4

8

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
于 2009-03-05T02:26:33.480 に答える
1

私はそれを行うためのすぐに使える方法を知りません。でファイルを開いてopen_in一度に1バイトずつ読み取りinput_char、ヘッダーとデータを吸い込んで、color array array単純な形式(BMPなど)の場合はそのように構築できますが、JPGやPNGのようなものについては、独自のソリューションを使用することをお勧めします。あなたが入りたいより多くの仕事になりなさい。

于 2009-03-04T23:49:14.887 に答える
1

また、OCaml 用の多数の SDL バインディングの 1 つ、特に SD​​L_image バインディングを使用することもできます。これにより、あらゆる種類の画像を簡単にロードでき、個々のピクセルと生データに配列としてアクセスする関数が提供されます。

OCamlSDLは人気のあるものです。

于 2012-11-14T09:10:21.140 に答える
0

CAMLIMAGEを使用したくない場合は、通常、生のRGBまたはPNM / PPM(ヘッダー形式とそれに続くRGB値を簡単に作成できます)画像が使用されます。ImageMagickを使用すると、この形式を表示したり、より使いやすい形式に変換したりできます。

于 2009-03-14T15:47:26.863 に答える