あなたのTkを多画像フォーマット対応に!

この「あなたのTkを多画像フォーマット対応に」PIFE拡張は、こんな拡張です。

package require pife
# ...
image create photo Image1 -file sample.jpg
# ...
Image1 write sample.png -format png

 このように、Tcl/TkでJPEGやTIFFやPNGや、 その他もろもろの画像フォーマットの読み書きを可能にするライブラリです。 Tcl/Tkのフォーマット拡張では「tkImg拡張」が有名ですが、 ここではそれよりコンパクトながらより多くのフォーマットに対応させています。 Windows用にはTcl/Tkがインストールされていればすぐに使えるDLLも載せてみました。


もくじ

ソースアーカイブからのビルドについてはこちらです:


はじめに

 Tkを使うと、 PPM(Pbmplus Portable Pixmap)やGIF(CompuServe Graphics Interchange Format) 形式の画像を1行で読み込み、1行で画面に表示することができて、 派手なアプリケーションを作成するにはとってもベンリです。 色数が多い画像でも自動的にディザリングまでしてくれていたれりつくせり。 特にXウィンドウシステムでは画像を表示するプログラムを作るのはなかなかタイヘンですから、 この機能だけでもTcl/Tkを使う価値は十分にあるというものです。 「新しい言語を覚えるなんてヤダ」 という皆さんの中にもそうきいて思わず食指が伸びる方もおられるはずです。
 ところで世の中にはたくさんの画像フォーマットがありますが、 その多くは読み書きルーチンが優れたフリーのライブラリとして配布されています。 それらのライブラリを利用して、 標準wishに種々の画像フォーマットを扱う機能をつけたwishを作るプログラムを作ってみました。 サポートしている画像フォーマットは読み(表示)11種類、書き13種類で、 とりあえず実用には充分だと思います。


サポートする画像フォーマット

私が試してみたのは、次の13種類の画像フォーマットです。

  • Pbmplus Portable Pixmap(PPM)
    UNIXのフリーソフトでよく使われる比較的「べた」な形式です。
  • Microsoft Windows Bitmap(BMP)
    これも有名、MS-Windowsでの標準形式です。データ構造はちょっと奇抜です。
  • ZSoft IBM/PC Paintbrush(PCX)
    海外のPCでよく使われる現存最古級の形式です。
  • Joint Photographic Experts Group(JPEG)
    フルカラー画像圧縮形式の国際標準。普通、一度圧縮すると画質が劣化します。
  • X11 ASCII Character Pixmap(XPM)
    Xウィンドウシステムでアイコンによく使われる形式です。
  • X10/X11 Window Dump(XWD)
    Xウィンドウシステムでウィンドウのメモリダンプに使われる形式です。
  • TrueVision Targa File(TGA)
    海外のPCでDOS時代によく使われた形式です。
  • Sun RasterFile(RS)
    サンのワークステーションのビットマップの標準形式です。
  • SiliconGraphics IRIS RGB(SGI)
    シリコングラフィックスのワークステーションのビットマップの標準形式です。
  • Tagged Image File Format(TIFF)
    広い分野で使われています。種々の拡張仕様もあり、最もサポートの多い形式です。
  • Adobe PostScript(PS)
    プリンタ出力用ページ記述言語の事実上標準として非常に有名です。
  • Apple Macintosh QuickDraw(PICT)
    Appleの計算機での標準形式ですが、非常に複雑なフォーマットです。
  • Portable Network Graphics(PNG)
    GIFに代わる(と言われる)Webでの画像形式です。ちらほらと使われだしています。
なお、PSとPICT は書き込み専用です。 JPEG,TIFF,PNGなど特に複雑なフォーマットについては主にUNIX の世界で広く知られているフリーのライブラリを使わせてもらっています。


ダウンロード

ダウンロード用に圧縮アーカイブを作ってみました。 UNIX(gcc) & Windows(VC++ or MinGW)兼用のソースプログラムと Win32用コンパイル済みDLLのバイナリ配布(Tk 8.4以降)です。 ソースプログラムはTcl/Tk 8.0.3 〜 8.4.0 用です。
○バージョン 0.18.8 (2003/05/20)

Win32用のDLLはすぐ使えます。 ソース配布はコンパイル作業が必要になります。 詳しくはこちらをご覧ください。


つかいかた

 共有ライブラリ(DLL)は付属の「install.tcl」でインストールできます。 Tcl/Tkスクリプトで使うには、 標準wishのloadコマンドでライブラリをロードします。

load /the/path/of/libpife[info sharedlibextension]
または
package require pife
でロードできます。


「image create photo」で拡張したフォーマットを使う

 通常Tcl/Tkで画像の表示に使う photo イメージの使い方は全く同じです。 拡張した各画像フォーマットを読ませるには、

  image create photo ImageName -format myjpeg -file $imageFileName
の 'myjpeg' の部分にmyjpeg、mytiffなどの画像フォーマット名に 'my' をつけた名前で指定します。フォーマットを my とするか、-format を完全に省略すると画像データの先頭部分を覗いて適当に推測するか (このへんが、なんとも怪しいですが)、 できなければファイル名の拡張子から適当に判断します。 もちろん、標準で用意されているフォーマット ppm と gif も普通通りに使えます。

また、-fileオプションのほかに-dataオプションも使えます。

  image create photo ImageName -format myjpeg -data $imageDataString
これは標準Tkのgifフォーマットの動作と同じで、Base64 形式で画像データをエンコードした文字列を-dataオプションで指定することで、 その画像データを読み込むことができます。 別途画像ファイルを用意しなくても直接スクリプト中に画像データを埋め込むことができるので便利ですが、 内部処理としては一時ファイルを作ってから -fileと同じ方法で一時ファイルを読んでいるというていたらくなので、 速度は若干遅いかもしれません。


拡張したフォーマットの専用読み書きコマンドを使う

 今度は読み書きのための独立したコマンドimgfmtexの使い方をご紹介します。 まず読み込みですが、

  image create photo ImageName ; # 空のイメージを作成
  imgfmtex read ImageName sample.tif -format tiff
こんなかんじでイメージの名前と画像ファイルを指定します。 フォーマットはそれを最も端的に示すことができる英小文字の単語にしていますが、 -format を省略するとまずファイルの先頭部分を覗いて自動判断を試み、 それに失敗すると拡張子から適当に判断します。
  imgfmtex read ImageName sample.tif -width 300 -height 300
のように幅と高さか倍率を指定してサイズを変換して読むこともできます。

ファイルの画像フォーマットを判別したい場合は、

  imgfmtex identify ImageFileName
とすれば 'BMP' とか 'JPEG' とか 'unknown' などの返事が返ってきます。

書き込みですが、

  imgfmtex write ImageName output.jpg \
    -format jpeg,quality=75,progressive,grayscale
このように指定します。読み込みのときと違うのは、 -formatの引数にフォーマット名のほかに各フォーマットに特有のオプションをつけることができるということです。 この詳細についてもREADMEをご覧ください。 ここでは出力をグレイスケールに変換した圧縮係数75のプログレッシブJPEG形式で、 格納するように指示しています。もちろんこんな指定をせず -format jpeg とすれば最も一般的なオプションで書きこみますし、 他の多くのフォーマットはこうしたオプションをもたないものがほとんどです。


使用について

PIFE拡張はフリーソフトウェアで、 個人、または限られたサイトで使用されるのであれば、 自由に使用していただいて構いません。詳しくはREADME をご覧ください。


What's New??

●0.18.8(2003/05/20)
imgfmtexコマンドに-resizeオプションを追加しました。

●0.18.7(2002/10/02)
MinGWに対応したconfigureを同梱しました。

●0.18.6(2002/09/21)
Tk 8.4.0の公開に伴い、Tk APIの一部が変更されたのに対応しました。 またMinGW用のMakefileのサンプル(Makefile.mgw)を同梱しました。

●バージョン不変(2001/11/03)
configureやサンプルなど周辺系を変更しました。

●0.18.3(2001/03/28)
Tk 8.0でコンパイルすると異常終了するバグを修正しました。 昨年7月から発生していた不具合のようで、遅くなり済みません。

●0.18.2(2001/02/11)
imgfmtex readサブコマンドに -widthや-heightや-xyscaleなどの拡縮オプションを追加しました。 サイズを変換しつつ読めるということで…

●0.18.1(2000/10/09)
岡本さん@大阪医科大学より頂いたパッチにより、 グレイスケールのJPEGファイルが読めるようになりました。 岡本さん、ありがとうございました。

●0.18.0(2000/07/08)
Tcl/Tk 8.4a1で作り直し、configureを8.4に対応させました。8.3から、 画像フォーマット拡張の大重鎮であるオランダの Jan Nijtmans さんの寄贈コードによって画像データがTclオブジェクトとして扱われるように変更されたのに対応しました。 このコードが8.0などでちゃんとビルドできるかどうかよく分かりませんが、 順次確認していきたいと思います。

●0.17.4(2000/04/24)
Tcl/Tk 8.3では、photo画像の色表現に従来のRGBに加えα(透明度)を表す値が加わり 4バイト/画素となりました。そのせいか、Tk 8.3でこの拡張で読んだ画像は青味の色が化けて黒ずんだ感じになるというご指摘を頂いたので、 直してみました。私の周りにはこの現象が出るマシンと出ないマシンがあるので、 確認が遅れてしまいました。

●0.17.3(2000/02/19)
Tcl/Tk 8.3ではGIFの出力ができるようになりました(ランレングス圧縮ですが)。 ということでGIFそのものに関しては不自由がなくなったわけですが、 ついでということで減色処理ができたら便利かなあということで imgfmtex writeコマンドで画像データを書き出すときのオプションに減色処理を する「-quantize」オプションを追加しました。また、8.1.0〜8.2.3 でコンパイルできることを確認していましたが、8.0.3〜8.3.0 でコンパイルできるようにconfigureなどを改造してみました。

●0.17.2(1999/12/08)
GIFを廃止したのはいいんですけど、Tcl/Tkの標準のルーチンでは GIFは読めるけど書けないんでしたね。結構不便になってしまいました。 …が一応仕方ないということでGIF廃止対応をいろいろしています。

●0.17.0(1999/10/13)
ついにGIFフォーマットのサポートを廃止しました。 またTIFFフォーマットでの書き込み時に圧縮アルゴリズムとして LZWを選ぶこともできなくなりました。本家?のNijtmansさんの「Img拡張」 もGIFサポートをとりやめたようなので、我々も追随。 今後このソースコードからLZWという言葉は完璧に消えて行きます。

●0.16.0(1999/09/17)
image create photoコマンドで-fileオプションのほかに -dataオプションが使えるようになりましたが、かなりヘンなつくりをしています。 動くのでとりあえず見切発車でゴーしてます。 またUNIX用configureが8.2に対応してなかったのをようやく直しました。

●0.15.4(1999/08/02)
Tcl/Tk 8.2b1の公開で本格化したTclとTkのスタブ機構に対応しました。

●0.15.0(1999/02/02)
画像ファイルの冒頭部分を覗いてみて、 画像フォーマットの自動判別をやってみようと酔狂を起こしたのが運のつき。 結構いいかげんですがそれなりに役にはたつと思います。

●0.14.0(1998/12/25)
プログラムやDLLの名前が変わりました。 また使い方が互換実行形式版とDLL版で同じになり、わかりやすくなったと思います。 またWin32用DLLのみ、Win32EXEのみのダウンロードもできるようになりました。

●0.12.0(1998/11/20)
UNIXマシンで簡単にコンパイルできるように「configure」 のつくりかたを勉強しました。でなんとかconfigureができたのでつけてみます。 まだまだ不完全なので「動いたぞ」「動かないぞ」「こう直したら動くぞ」 等ありましたらおよせください。ちなみにこのconfigureを作るツールAutoconf の使い方をせっかく勉強したので例によって こちらにメモっておきました。

なもなも top
(first uploaded 1998/08/25 last updated 2003/05/20, KAZUHISA ESHI - MISUMI URANO - KENICHI USHIRODANI)