January 17, 2005

perlでゴミ箱へ

いつもはperlで削除する場合、unlink()で消してしまうが、いきなり消すのではなく、ゴミ箱へ一度入れたいと思った。
で、SHFileOperationが使えたらゴミ箱へ移動出来るはず。
ActiveStateで検索すると、Win32-ShellExtと言うちょうどいいのがあった。
ppm install Win32-ShellExt とやるが、インストールできない。
上述のページを見るとPlatforms: Hpux-ia64 とある。
これってIA64用ってこと?
うーん、他にないのかなぁ。

投稿者 Takenori : 11:51 PM | コメント (0) | トラックバック

January 13, 2005

ImageMagickを使う

以下は、VC 2003で確認した。
まずはVCを起動し、新規プロジェクトでコンソールアプリのプロジェクトを作った。
そして、インクルードディレクトリに ImageMagick-6.1.8/Magick++/lib とImageMagick-6.1.8 を追加。
ライブラリパスを設定に追加し、ライブラリをフルパスで指定しなくても良いようにした。
ライブラリはいっぱいあって面倒なので、次のように入力して一覧が記述されたテキストファイルを作った。
perl -e "foreach( glob(\"*.lib\") ) { if( /DB/ ) { print $_.\" \"; } }" > DB.txt
Release版も同様に次のようにして一覧テキストを作った。
perl -e "foreach( glob(\"*.lib\") ) { if( /RL/ ) { print $_.\" \"; } }" > RL.txt
で、出力されたテキストファイルからプロジェクトの追加ライブラリにコピペ。
Socket関連も使うようなので、Ws2_32.lib も追加ライブラリに追加。
LIBCMTD を無視するライブラリに追加。
以上で、Magick++を使える環境が整ったはず。
サンプルにあった物とほぼ同じ以下のようなソースをビルド。
#include "stdafx.h"
#include <Magick++.h>
#include <iostream>
using namespace std;
using namespace Magick;

int _tmain(int argc, _TCHAR* argv[])
{
 // Construct the image object. Seperating image construction from the
 // the read operation ensures that a failure to read the image file
 // doesn't render the image object useless.
 Image image;

 try {
  // Read a file into image object
  image.read( "test.jpg" );

  // Crop the image to specified size (width, height, xOffset, yOffset)
  image.crop( Geometry(100,100, 100, 100) );

  // Write the image to a file
  image.write( "x.jpg" );
 }
 catch( Exception &error_ )
 {
  cout << "Caught exception: " << error_.what() << endl;
  return 1;
 }
 return 0;
}
で、実行したらException。
調べると、どうやら ImageMagick-6.1.8/config/magic.xml が実行ファイルと同じディレクトリに必要なようだ。
magic.xml をコピーし、実行したらうまくいった。
以上でVCからはImageMagickが使えるようになった。
ちなみに、上記コードの実行ファイルのサイズは3.6MB。やはりでかいな。

投稿者 Takenori : 05:16 PM | コメント (0) | トラックバック

ImageMagickライブラリのビルド

ImageMagickを使えば、かなり多くのフォーマットに対応できるし、C++での使い方もPerlMagickのように簡単に見える。
また、ライセンスもApache-style licenseで、たぶんオープンもプロプラエタリにも使えるとある。
たぶんと書いてあるのは、リンクするライブラリが多いためだろう。
以上のようなことから、ImageMagickを使いたいと思い、ビルドしてみることにした。
バイナリのインストーラーもあるが、いろいろとインストールされてしまうので、必要な物のみスタティックなライブラリとしてビルドし、必要に応じてリンクするような形態にしたいため、ソースからビルドすることにした。

Install-windows.txtを見ながら進めた。
使用したのは、Windows Source 6.1.8-5で、VCは2003。
まずは、ImageMagick-6.1.8/VisualMagick/configure にあるVCのプロジェクトを開き、Releaseビルドでconfigure.exeをビルド。
出来たconfigure.exeをダブルクリックして起動するとダイアログが開く。
"次へ" をクリックした後、Build type setupでStatic Multi-threaded runtimesを選択。
Use X11 stubs to... のチェックははずした。
Build optionsはGenerate Visual Studio 7 formatにだけチェックが入った状態にし"次へ"をクリック。
次のパスの設定などはそのままにし、完了すると、VisualStaticMT.sln がImageMagick-6.1.8/VisualMagick に出来る。他にも各ライブラリのプロジェクトファイルが生成されたようだ。
VisualStaticMT.sln でVCを起動し、ビルド。
しばらく待てばImageMagick-6.1.8/VisualMagick/libにわんさかライブラリが出来る。
また、ImageMagick-6.1.8/VisualMagick/binに実行ファイルがいろいろと出来る。
Debug版、Release版はそれぞれ、途中のDBとRLの文字が異なるライブラリが生成される。
以上で必要なライブラリは生成されたはず。
次は、簡単なサンプルを作れるかどうか確認する。

投稿者 Takenori : 04:37 PM | コメント (0) | トラックバック

October 12, 2004

ボタン絵結合ツール

吉里吉里のボタン絵には通常、押下、選択の3つを横に並べたものが必要だ。
単純に横にくっつけると言うのは、プログラムでは簡単だが、普通のペイントツールを使うとかなり面倒だ。(単純に並べるだけなのに、ドットがずれないかどうかに神経を使う)
ペイントツールでこのような機能を持ったものが存在するかもしれないが、知らないので作ることにした。
仕様は、
フォルダをD&Dすればその中にあるBitmapをすべてくっける。
くっつける時のルールは"名前.bmp", "名前_d.bmp", "名前_s.bmp"と言う名前のファイルを一組として、横にくっつくていく。
くっつけられた画像は、D&Dされたフォルダの下にbuttonフォルダを作り、その中へ"名前.bmp"というファイル名で出力する。
とする。
で、なにげにC++Builderでボタンとテキストボックスをくっつけて、D&Dのハンドラ書いて、FindFirstで"*.bmp"を列挙するところまで作った。
そして、くっつける処理はGDI+でも使ってみようと思い、ヘッダーをインクルードするとエラーが山のように出てくる。
あらら。
すごく行き当たりばったりだが、C#で.Net Frameworkを使い作る方向に変更。
少しC#に興味があったからだ。
で、まずはフォームにボタンやエディットボックスを置く。
でも、これはC++Builderに近いなぁ。
これは意外といいかも。
そして、D&Dの処理を調べる。
テキストをD&Dするサンプルがすぐに見つかったので、それを適当に改造して、フォームに対するドロップを処理するようにしようとするが、よくわからない。
そもそも、C#でプログラムを一度も組んだことがないので、文法などもよくわかっていない。
Cを半音上げたものだから、C#って聞いていたので、Cと似たようなものかなぁと思っていたのだが、それほどすんなりとは行かないようだ。
コードの一部に波線が引かれていたので、カーソルを置くとツールチップで説明が出たが、よくわからない。
C#独特の記法のようだ。
C#入門ぐらいは読まないとダメかな。

今やるのはちょっと面倒臭いなぁと思って、どうしようと考えていたらImageMagick(PerlMagick)を使うことを思い付く。
PerlMagickは使ったことがないけど、これなら簡単に出来そうな気がした。(根拠なし)
で、ImageMagickのページのAPI->PerlMagickを読んで適当に作ってみる。(このページの日本語訳ないかなぁ?)
少し悩むが、意外とあっさり出来た。
次のコードで、'b_fast.bmp', 'b_fast_d.bmp', 'b_fast_s.bmp'の3つファイルを横にくっつけて、x.pngという名前で出力する。

use Image::Magick;

$image = Image::Magick->new;
$x = $image->Read('b_fast.bmp', 'b_fast_d.bmp', 'b_fast_s.bmp');
warn "$x" if "$x";
$p = $image->Append(stack=>'false'); # stack falseでLeft to Rightでくっつける
#warn "$x" if "$x";
$x = $p->Write('x.png');
warn "$x" if "$x";

やはり、PerlMagickは便利だ。これから少しずつ使っていきたいなぁと思う。
それはともかく、ここまで出来れば後はいつも通り書けばいい。
次のような感じ。

use Image::Magick;

foreach( glob('*.bmp') ) {
 if( /.+_d\.[bB][mM][pP]/ ) { next; }
 if( /.+_s\.[bB][mM][pP]/ ) { next; }
 /(.+)\.[bB][mM][pP]/;
 $base_name = $1;
 {
  local($image,$x,$p);
  $image = Image::Magick->new;
  $x = $image->Read($base_name.'.bmp', $base_name.'_d.bmp', $base_name.'_s.bmp');
  if( "$x" ) { warn "$x"; next; }
  $p = $image->Append(stack=>'false');
  if( "$x" ) { warn "$x"; next; }
  $x = $p->Write($base_name.'.png');
  if( "$x" ) { warn "$x"; next; }
 }
}

buttonフォルダは作らないが、pngで出力するようにしたのでかまわないだろう。
PerlMagickを使えば楽勝だったな。

投稿者 Takenori : 12:14 AM | コメント (3) | トラックバック

September 19, 2004

画像結合ツールの開発 その1

ヤフオクに出品するものの写真の結合をやりながら思う、面倒くせー。
これは明らかに自動化できる作業だ。
で、画像結合ツールを作ると思い立ち、作業に取りかかった。
今回はめずらしくGUIで作る。
いつもは、Perlとかでさっさとやってしまうのに。
まあ、気まぐれだ。
そして、C++Builderを起動してぺこぺこやる。
C++Builderはあまり慣れていないので、少々手こずるけど、GUIアプリを作るのはすごく楽だ。

とりあえず、DrawGridに画像をD&Dして結合するようなIFにしようと思い、DrawGridをいじる。
でも、エクスプローラーからファイルをD&D出来ない。
ドラッグ&ドロップ用のイベントを書いてもうまくできない。
セル同士のドラッグ&ドロップが出来るようになっただけだ。
調べてみると::DragAcceptFiles( Handle, TRUE );とやって、WM_DROPFILESメッセージを処理するようにしないといけないらしい。
メッセージ処理用メソッドを作るにはBEGIN_MESSAGE_MAPを使うらしい。
なんか、MFCみたいだ。
でも、調べてみると、このマクロは単にDispatchに展開されるだけのようだ。
マクロだとデバッグ時にいろいろと面倒なこともあるので、Dispatchは自分でオーバーライドすることにした。
そして、DragAcceptFilesにDrawGridのハンドルを渡しメイク。
カーソルが変わった。
D&D出来るようだ。
で、ドロップ。
・・・
WM_DROPFILESのハンドラに来ない。
なぜ?
って、DrawGridのDispatchにWM_DROPFILESハンドラを書かないといけないんじゃないか。
普通にメインのフォームのやつに書いていた。

DrawGridを継承するコンポーネントを作る。
きちんとWM_DROPFILESハンドラに来るようなった。
次に画像データの保持だが、面倒なのでvectorで10*10決め打ちで作ることにした。ま、ツールだしね。
std::vector > m_Cells; こんな感じ。
そして値初期化の時にm_Cells.reserve(10)とやって作る。当然2次元なので2次元目もreserveし、NULLで初期化。
画像はTJPEGImageで保持させた。
そして、メイクしてインストールしようとしたら、"パッケージ'vcljpg60'にもユニット'Jconsts'が含まれるためパッケージ'dclusr60'は読み込めません。"と出た。
なんだ、コンポーネントでTJPEGImageを使うのはまずいのか?
よくわからん。
じゃ、libjpegを使おうと言うことで、検索。
とりあえず、ここを参考にする。
他にも検索していて、GDI+と言う言葉が目に入った。
そうだ、GDI+を使った方が楽かも。
急遽ligjpegからGDI+に方向転換。
少し調査。

少し時間が空いて、今日。
Cマガを見るとちょうどGDI+の話題だった。
なんと間のいい。
とりあえず購入。

投稿者 Takenori : 10:09 PM | コメント (0) | トラックバック

Total : Today : Yesterday :