Chapter Eighty Two

第82話


Pictureコントロールのうれしい点は24bit画像をそのまま表示できる点だ。ネットワークの話題から外れてしまうが、今回は画像表示について書いてみよう。

LabVIEW6iではJPEG、PNG、BMPなどの画像ファイル入出力VIも用意されているのでプログラミングも容易だ。

JPEGはデジカメなどでなじみのある人も多いと思うが、不可逆圧縮のため歪みが起こってしまうので用途を考えて使わないといけない。PNGは比較的新しいフォーマットなのでなじみがない人もいるかもしれないが、圧縮に関して特許上の問題があるGIFフォーマットの置き換えを考えて作られたものだ。圧縮方式としてはzipに使われている可逆圧縮のinflate/deflate方式を使っている。詳しく知りたい人はhttp://www.w3.org/TR/REC-pngにPNGフォーマットの仕様書があるので参考にすればいいだろう。BMPはWindowsの画像標準フォーマットで圧縮はサポートしていない。

私のお勧めはPNGフォーマットだが、各VIは画像形式によらず入出力がほぼ統一されているから、LabVIEWでプログラミングするうえでは大差がない。

画像ファイルの入出力に使われるflttened image dataはU8の1次元配列だ。24ビット画像(depth=24)の場合は、ピクセル毎のRGB各8ビットのデータを1次元配列に並べたもののようだ。つまり連続する3ビットで1ピクセルの画像データをあらわしている。8ビットの画像の場合はピクセル毎のデータを1次元配列に並べている。1ビットと4ビット画像の場合は複数画素をまとめて8ビットのデータにして1次元配列にしている。正確な変換規則はFlatten Pixmap.viのダイアグラムを参照すると良いだろう。8ビット画像の場合は列の画素数が奇数の場合には最後に0を追加して列のデータ数が偶数になるように操作しているので、直接flttened image dataをいじる場合には注意が必要だろう。

画像ファイルを読み込んでピクチャーコントロールに表示するにはRead PNG File.viの出力をDraw Flattened Pixmap.viの入力に接続するだけでよい。

じつに簡単にプログラミングすることができる。さて、8ビットのグレー画像を読み込むとどんなふうになるのだろう。当然depthは8になり、8ビット画像として扱われると思っていたが、実際はdepthは24でflttened image dataにはRGBに同じ値が入っていた。ピクチャー自体は24ビットが基本なのでそのような扱いにしているのだろう。depthが24の場合にはColor Tableは空の配列が出力される。256カラーの場合はdepth=8でColor Table(U32の1次元配列)が読み込まれる。

さて、以前にLabVIEWでの圧縮について考えたことがあった。プログラミングは面白かったものの実用的には無謀な試みだと言っていいだろう。今回、思いついたのはWrite PNG file.viの可逆圧縮機能を使って実用的な速度でデータファイルの圧縮ができる可能性がある点だ。文字列は8ビットの1次元配列に変換できるから、8ビット画像と見なすことができる。これは、うまくいくかもしれないと簡単に試してみることにした。

Write PNG file.viが8ビットのグレー画像を扱えると簡単なのだが、先程調べたようにカラーテーブルを使わないとうまくいかないし、PNGファイル内部で圧縮しているのかもしれないが、カラーテーブルは4×256バイトなので大きなオーバーヘッドになりうるので、あまり使いたくない。結局24ビット画像と考えることにして、3の倍数にならないときには適当な文字で穴埋めをすることにした。圧縮する文字列の先頭に識別用のLVCという文字と穴埋めした文字数を書くことにした。

このVIで圧縮したファイルを読み込むのは簡単でU8の1次元配列をストリングに変換するだけで良い。下の右側のフロントパネルのstringに文字列が伸長されて表示されている。最初の4文字目を見ると、穴埋めした文字数が分かるので、データの最後尾からその文字数だけ削除すればよい。

まだ、多少手を加えないといけないが実用的なものになる可能性はありそうだ。

今回もLV6のピクチャー機能の周辺で遊んでみた。ところで、ケース構造は昔から備わっていたので分かった気になっていたのだが、場合分けを1以下の場合、2から5の場合などと自由に設定できることが分かった。ちゃんと、マニュアルに書いてあるのに見ていなかっただけだが、一人で喜んでしまった。

 

See you!

Nigel Yamaguchi


戻る