TclMagickはImageMagick, GraphicsMagickを操作するTclの拡張です。今の段階ではコンパイルの手続きで足りないところが少しあって、そのままではうまく作れないのでWindowsでコンパイルした時のメモを書いておきます。

まず、GraphicsMaggickをダウンロードして、DynamicMTでコンパイルしておきます。ここでは1.1.3をコンパイルしています。GraphicsMagickのコンパイルはそんなに難しくないのでここでは省略。

GraphicsMagick-1.1.3/TclMagickディレクトリにTclMagickのソースがあります。これを書いてる現在ではTclMagick0.4、TkMagick0.2です。

***Makefileを書く
一応winディレクトリ中にVC用のプロジェクトがありますが、TclMagick用のプロジェクトだけでTkMagick用のはありません。プロジェクトを修正したり作るのがめんどくさいので、いきなりですが(?)、Makefileを書きます。

 CC = cl
 LD = link
 CFLAGS = /DEBUG /ZI /DUSE_TK_STUBS /DUSE_TCL_STUBS -I../generic - IC:\Tcl\include -I../../
 LDFLAGS = /DLL /DEBUG /NoDefaultLib:msvcrt.lib /Libpath:c:\Tcl\lib /Libpath:..\..\Visual Magick\lib
 LIBS = tclstub84.lib CORE_RL_wand_.lib CORE_RL_magick_.lib
 
 all: TclMagick.dll TkMagick.dll
 
 TclMagick.dll: ../generic/TclMagick.c ../generic/TclMagick.h
 	$(CC) $(CFLAGS) -DTCLMAGICKDLL ../generic/TclMagick.c -c
 	$(LD) $(LDFLAGS) $(LIBS) TclMagick.obj /out:TclMagick.dll
 
 TkMagick.dll: ../generic/TkMagick.c ../generic/TclMagick.h ./TclMagick.dll
 	$(CC) $(CFLAGS) ../generic/TkMagick.c -c
 	$(LD) $(LDFLAGS) $(LIBS) tkstub84.lib TclMagick.lib  TkMagick.obj /out:TkMagick.dll
すごい適当ですが、まあこんな感じで。。。~

***TclMagick.hの修正
TclMagick.hは、TkMagickからアクセスするTclMagickの関数が定義されています。なので、TclMagickのコンパイル時にはエクスポートし、TkMagickのコンパイル時にはインポートするように修正します。どうやるかというと、
 #ifdef TCLMAGICKDLL
 #define DLLINEXP __declspec(dllexport) 
 #else
 #define DLLINEXP __declspec(dllimport) 
 #endif
まあ適当にこのようなマクロを作っといて、インポート/エクスポートしたい関数の宣言にDLLINEXPをつけます。
 DLLINEXP TclMagickObj *findMagickObj(Tcl_Interp *interp, int type, char *name);
 DLLINEXP int myMagickError(Tcl_Interp  *interp, MagickWand *wandPtr );

て、TclMagickのコンパイル時にTCLMAGICKDLLを定義すればOKです。Makefileでも先回りしてそう書いてます。これでTclMagickの関数にTkMagickからアクセスできるようになりました。

***TkMagick.cの修正
で、今度はTkMagick.cを修正します。というのはTkMagickではSTUBを使う(使わなくてもいいですが、使いたい)ので、そのように修正します。TkMagick_Init関数の先頭で、Tcl_InitStubsをコールしてるところの直ぐ次に、Tk_InitStubsを追加します。
 #ifdef USE_TCL_STUBS
 	if (Tcl_InitStubs(interp, "8", 0) == NULL) {
 		return TCL_ERROR;
 	}
 #endif
 
 #ifdef USE_TK_STUBS
 	if (Tk_InitStubs(interp, "8", 0) == NULL) {
 		return TCL_ERROR;
 	}
 #endif
これでOKです。

***コンパイル
さっきMakefileを作ったのでそのままmakeすればOKです。問題が無いようならMakefile中のコンパイルオプションをリリース用に書き換えてください。

***インストール
インストールはGraphicsMagickのインストールと、TclMagickのインストールの両方しないといけません。ちょっとめんどくさい。まず、TclMagickのインストールですが、Tclのlibディレクトリ下にTclMagickディレクトリを作成して、TclMagick.dllとTkMagick.dllをコピーします。で、pkgIndex.tclというファイルを置いておきます。中身は適当にこんな感じのを書いておきます。
 # TclMagick package index file
 package ifneeded TclMagick 0.4 \
     [list load [file join $dir TclMagick[info sharedlibextension]]]
 
 package ifneeded TkMagick 0.2 \
     [list load [file join $dir TkMagick[info sharedlibextension]]]


GraphicsMagickは、どういう風にコンパイルしたかによりますが、ここではDynamicMTでコンパイルしています。Windowsの場合、デフォルトではGraphicsMagick-1.1.3/VisualMagick/binにGraphiicsMagickをコンパイルしたブツが置かれることになってるので、ここにパスを通せばインストール(?)は完了です。パスを通さないとTclMagickが動きません。bin以下のをwishやtclshと同じディレクトリに置いてもいいですが、ゴチャゴチャするので個人的にはあまり好きな方法ではありません。Tclからしかアクセスしない場合は、パッケージディレクトリのTclMagickのディレクトリの中にbinディレクトリを作ってその中にGraphicsMagick関連のdllをまとめて入れて、pkgIndex.tclに
 if { $env(OS) eq {Windows_NT} } {
 	set env(Path) "$env(Path);[file join $dir bin];"
 }
みたいなのを書いてもいいと思います。まあ何でもいいんですが・・・。

***使い方
 package require TclMagick
 package require TkMagick
でOKです。使い方はマニュアル参照してください。

***注意!
2004-08-22現在
-GraphicsMaggick1.1.3
-TclMagick0.4
-TkMagick0.2

のバージョンでの話です。TkMagickはたぶん次のバージョンくらいで修正してくるのではと思います。

***ImageMagick GraphicsMagick
GraphicsMagickはImageMagickから派生したもので、APIはほとんど同じだったりします。
GraphicsMagickはまだ未実装のAPIとかがあったりして、TclMagickのテストが全て通りません・・・。ImageMagickはImageMagickでconvert.exeがNTFSに変換するCONVERT.EXEと名前が同じだったり、アルファチャンネルの値がGraphicsMagickと逆になってたりしてTkMagickで3プレーンの画像を取り込むと何も見えなくなってしまったり、ImageMagickもGraphicsMagickも日本語のパス名が開けなかったりとWindows環境ではまだちょっとアレなようです・・・。~
上の例はGraphicsMagickでやってますが、ImageMagickの方がいいのかも?どっちも微妙・・。

//***Jpeg-Quality
//Jpegの画質を設定するAPIがImageMagickとGraphicsMagickで違います。TclMagickは基本的にGraphicsMagickのAPIに合わせて作ってるので、ImageMagickで使う場合はQualityを設定できません。なので改造します。TclMagick.cのcase TM_SETOPTION:のところで、
// result = MagickSetImageOption(wandPtr, format, key, value);
//とあるところを、
// if (strcmp("ImageMagick", MagickGetPackageName()) == 0 &&
//     strcmp("quality", key) == 0) {
//     result = MagickSetImageCompressionQuality(wandPtr, atol(value));
// } else {
//     result = MagickSetImageOption(wandPtr, format, key, value);
// }
//という風に書き換えればOKです。


***ImageMagick用バイナリ
なんだかんだとGraphicsMagickの事をメモっといて何ですが、ImageMagickの方がインストーラつきで配布されてて、使ってる人が多そうだったので、最新版のImageMagick-6.0.5-Q16と、TclMagick0.41とTkMagick0.2でバイナリを作ってみました。ついでに日本語(というかマルチバイトというかエクスターナル)のファイルパス名も通るようにしてみました。Q16で作ったけど、Q8でも動きます。
-バイナリ
--http://reddog.s35.xrea.com/software/TclTkMagick.zip
-パッチ
--http://reddog.s35.xrea.com/software/TclMagick041.patch
-改造したソースコード
--http://reddog.s35.xrea.com/software/TclMagick-0.4.1modified_src.zip

***リンク
-http://tclmagick.sourceforge.net/
-http://www.graphicsmagick.org/

***コメントをどーぞ
#comment

----
[[CategoryTclTk]]


|New|Edit|Diff|History|Attach|Copy|Rename|
HTML convert time: 0.002 sec.