のらぬこの日常を描く

ノージャンルのお役立ち情報やアニメとゲームの話、ソフトウェア開発に関する話などを中心としたブログです。

昔作った画像処理ライブラリ群を公開してみたり

2010/3/5 に

Putty0.60ごった煮版で、壁紙表示を自動スケール表示対応させてみた

というエントリーを書いた。

画像のスケール表示(要は拡大縮小)部分には、6,7年ほど前に書いた画像加工用ライブラリを使いました。

このライブラリが、いま見ても、それなりによくできてんじゃないの?っていう出来栄えだったので、

本日、sourceforgeoss として公開してみました。

http://mk-imagelib.sourceforge.jp/

(最新ソースはコミット済ですが、リリース物件はまだ準備出来ていません)

特徴としては

・メモリー上に展開された画像、ディスク上の画像を共通のインタフェースで処理できる。

・対応形式、フィルタ等は後から自由に追加可能。

 →画像入力、出力、フィルタは、個別のプラグインdllとして実装されています

・当時から有名だった、国産画像ビューア Susieプラグインが、画像入力プラグインとして使える。圧縮ファイル形式のプラグインにも対応している。

・処理中の画像情報の一部(もしくは全部)をディスク上にスワップすることで、メモリーをあまり積んでいないPCでも巨大画像の処理が可能。

 →メモリ管理をWindowsのswapファイルに完全にお任せするよりは、2~3倍高速だったはず(当時)。

今となってはどれも微妙な特徴ですね。。。。


例えば、

入力プラグインdll 出力プラグインdll 入力ファイル名 出力ファイル名

の4つをパラメータとして渡すと、入力ファイルを出力ファイルに変換してくれるようなコードは以下のようになります。

/* input_plugin output_plugin input_file output_file */
int main( int argc, char**argv )
{
	if( argc != 5 )
	{
		cout << "convert.exe <import_plugin.iplg|*> export_plugin.eplg input_file_name output_file_name" << endl;
		return -1;
	}

	HINSTANCE hInstanceImageRead = NULL;
	HINSTANCE hInstanceImageWrite = NULL;
	FP_READ_IMAGE fpReadImage = NULL;
	FP_WRITE_IMAGE fpWriteImage = NULL;

	hInstanceImageRead = ::LoadLibraryA( argv[1] );
	fpReadImage = 
		( FP_READ_IMAGE )::GetProcAddress( hInstanceImageRead, "read_image" );

	hInstanceImageWrite =
		::LoadLibraryA( argv[2] );
	fpWriteImage = 
		( FP_WRITE_IMAGE )::GetProcAddress( hInstanceImageWrite, "write_image" );

	if( fpReadImage == NULL ||
		fpWriteImage == NULL )
	{
		cout << "cannot load input or output plugin dll.\n";
		return -1;
	}

	CPLImage *image = new CPLMemoryImage( );
	image->CreateImage( "IMAGE" );
	if( fpReadImage( argv[3], *image ) )
	{
		if( !fpWriteImage( image, argv[4], NULL ) )
		{
			cout << "fail to write image file.\n";
		}
	}
	else
	{
		cout << "fail to read image file.\n";
	}
	delete image;

	return 0;
}

リファレンスは今のとこないです。

近々用意したいですが、やりたい事とかやらなきゃいけないことがとにかく多すぎる。