カテゴリ別アーカイブ

6 Articles

JScriptバッチ処理用ライブラリ 20130825公開

私のサイトで公開している
JScriptバッチ処理用ライブラリのバージョン「20130825」を公開しました。

主な内容は、JavaのString.formatを、JScriptでも使用できるようにするというものです。
JavaのString.formatは、大体はCのsprintfと似ているのですが、もっといろいろできます。
ただ、今回JScriptで使用できるようにしたString.formatは、Cのsprintfを似せて作りました。

コードを作成するに当たっては、
正規表現を使ってすっきり書くけど、分かりやすいコードを心がけて作りました。
String.formatの定義だけ抜き出せば、JavaScriptでも使用できるように作りました。
速度は、恐らく遅いと思いますが、最近のパソコンなら関係ないと思います。


ライブラリを使用した場合次のコードで

function main(args) {

	System.out.println("String.format のサンプル");
	
	var format = [
		"",
		" ",
		"+",
		"2",
		"10",
		".2",
		".10",
		"-16",
		" 16",
		"016",
		"#16",
		"#16.",
		"#-+16.",
		"#16.4"
	];
	
	System.out.println("動作例");
	for(var i = 0;i < format.length; i++) {
		var x = 10;
		// 整数10進数
		System.out.println(String.format("%%" + format[i] + "d [%" + format[i] + "d]", x));
		// 整数2進数
		System.out.println(String.format("%%" + format[i] + "b [%" + format[i] + "b]", x));
		System.out.println(String.format("%%" + format[i] + "B [%" + format[i] + "B]", x));
		// 整数8進数
		System.out.println(String.format("%%" + format[i] + "o [%" + format[i] + "o]", x));
		// 整数16進数
		System.out.println(String.format("%%" + format[i] + "x [%" + format[i] + "x]", x));
		System.out.println(String.format("%%" + format[i] + "X [%" + format[i] + "X]", x));
		// 小数形式浮動小数点数
		System.out.println(String.format("%%" + format[i] + "f [%" + format[i] + "f]", x));
		// 指数形式浮動小数点数
		System.out.println(String.format("%%" + format[i] + "e [%" + format[i] + "e]", x));
		System.out.println(String.format("%%" + format[i] + "E [%" + format[i] + "E]", x));
		// fかeで適した方
		System.out.println(String.format("%%" + format[i] + "g [%" + format[i] + "g]", x));
		System.out.println(String.format("%%" + format[i] + "G [%" + format[i] + "G]", x));
		// 文字
		System.out.println(String.format("%%" + format[i] + "c [%" + format[i] + "c]", "A".charCodeAt(0)));
		// 文字列
		System.out.println(String.format("%%" + format[i] + "s [%" + format[i] + "s]", "ABCDEFG"));
	}

	System.out.println("引数順指定");
	System.out.println(String.format("%%1$d %%2$d %%3$d [%1$d %2$d %3$d]" ,1 ,2 ,3 ));
	System.out.println(String.format("%%3$d %%2$d %%1$d [%3$d %2$d %1$d]" ,1 ,2 ,3 ));

	System.out.println("引数によるフィールド幅指定");
	for(var i = 1;i < 10; i++) {
		var x = 1;
		System.out.println(String.format("%%*d(" + i + ") [%*d]" ,i ,x ));
	}

	System.out.println("引数による精度指定(実数)");
	for(var i = 1;i < 10; i++) {
		var x = 1;
		System.out.println(String.format("%%.*f(" + i + ") [%.*f]" ,i ,x ));
	}

	System.out.println("引数による精度指定(文字列)");
	for(var i = 1;i < 10; i++) {
		var x = "ABCDEFGHIJKLMN";
		System.out.println(String.format("%%.*s(" + i + ") [%.*s]" ,i ,x ));
	}

	System.out.println("組合せ");
	for(var i = 1;i < 10; i++) {
		var x = 1;
		System.out.println(String.format("%%*.*f(" + i + ") [%*.*f]" ,i * 2 ,i ,x ));
	}

	System.out.println("動作例(マイナスの数字)");
	for(var i = 0;i < format.length; i++) {
		var x = -10;
		// 整数10進数
		System.out.println(String.format("%%" + format[i] + "d [%" + format[i] + "d]", x));
		System.out.println(String.format("%%" + format[i] + "u [%" + format[i] + "u]", x));
		// 整数2進数
		System.out.println(String.format("%%" + format[i] + "b [%" + format[i] + "b]", x));
		System.out.println(String.format("%%" + format[i] + "B [%" + format[i] + "B]", x));
		// 整数8進数
		System.out.println(String.format("%%" + format[i] + "o [%" + format[i] + "o]", x));
		// 整数16進数
		System.out.println(String.format("%%" + format[i] + "x [%" + format[i] + "x]", x));
		System.out.println(String.format("%%" + format[i] + "X [%" + format[i] + "X]", x));
		// 小数形式浮動小数点数
		System.out.println(String.format("%%" + format[i] + "f [%" + format[i] + "f]", x));
		// 指数形式浮動小数点数
		System.out.println(String.format("%%" + format[i] + "e [%" + format[i] + "e]", x));
		System.out.println(String.format("%%" + format[i] + "E [%" + format[i] + "E]", x));
		// fかeで適した方
		System.out.println(String.format("%%" + format[i] + "g [%" + format[i] + "g]", x));
		System.out.println(String.format("%%" + format[i] + "G [%" + format[i] + "G]", x));
	}

	System.stop();

}

結果はこうなります。

String.format のサンプル
動作例
%d [10]
%b [1010]
%B [1010]
%o [12]
%x [a]
%X [A]
%f [10.000000]
%e [1.000000e+001]
%E [1.000000E+001]
%g [10]
%G [10]
%c [A]
%s [ABCDEFG]
% d [ 10]
% b [ 1010]
% B [ 1010]
% o [ 12]
% x [ a]
% X [ A]
% f [ 10.000000]
% e [ 1.000000e+001]
% E [ 1.000000E+001]
% g [ 10]
% G [ 10]
% c [A]
% s [ABCDEFG]
%+d [+10]
%+b [+1010]
%+B [+1010]
%+o [+12]
%+x [+a]
%+X [+A]
%+f [+10.000000]
%+e [+1.000000e+001]
%+E [+1.000000E+001]
%+g [+10]
%+G [+10]
%+c [A]
%+s [ABCDEFG]
%2d [10]
%2b [1010]
%2B [1010]
%2o [12]
%2x [ a]
%2X [ A]
%2f [10.000000]
%2e [1.000000e+001]
%2E [1.000000E+001]
%2g [10]
%2G [10]
%2c [ A]
%2s [ABCDEFG]
%10d [		10]
%10b [	  1010]
%10B [	  1010]
%10o [		12]
%10x [		 a]
%10X [		 A]
%10f [ 10.000000]
%10e [1.000000e+001]
%10E [1.000000E+001]
%10g [		10]
%10G [		10]
%10c [		 A]
%10s [   ABCDEFG]
%.2d [10]
%.2b [1010]
%.2B [1010]
%.2o [12]
%.2x [0a]
%.2X [0A]
%.2f [10.00]
%.2e [1.00e+001]
%.2E [1.00E+001]
%.2g [10]
%.2G [10]
%.2c [A]
%.2s [AB]
%.10d [0000000010]
%.10b [0000001010]
%.10B [0000001010]
%.10o [0000000012]
%.10x [000000000a]
%.10X [000000000A]
%.10f [10.0000000000]
%.10e [1.0000000000e+001]
%.10E [1.0000000000E+001]
%.10g [10]
%.10G [10]
%.10c [A]
%.10s [ABCDEFG]
%-16d [10			  ]
%-16b [1010			]
%-16B [1010			]
%-16o [12			  ]
%-16x [a			   ]
%-16X [A			   ]
%-16f [10.000000	   ]
%-16e [1.000000e+001   ]
%-16E [1.000000E+001   ]
%-16g [10			  ]
%-16G [10			  ]
%-16c [A			   ]
%-16s [ABCDEFG		 ]
% 16d [			  10]
% 16b [			1010]
% 16B [			1010]
% 16o [			  12]
% 16x [			   a]
% 16X [			   A]
% 16f [	   10.000000]
% 16e [   1.000000e+001]
% 16E [   1.000000E+001]
% 16g [			  10]
% 16G [			  10]
% 16c [			   A]
% 16s [		 ABCDEFG]
%016d [0000000000000010]
%016b [0000000000001010]
%016B [0000000000001010]
%016o [0000000000000012]
%016x [000000000000000a]
%016X [000000000000000A]
%016f [000000010.000000]
%016e [0001.000000e+001]
%016E [0001.000000E+001]
%016g [0000000000000010]
%016G [0000000000000010]
%016c [			   A]
%016s [		 ABCDEFG]
%#16d [			  10]
%#16b [		  0b1010]
%#16B [		  0B1010]
%#16o [			 012]
%#16x [			 0xa]
%#16X [			 0XA]
%#16f [	   10.000000]
%#16e [   1.000000e+001]
%#16E [   1.000000E+001]
%#16g [		 10.0000]
%#16G [		 10.0000]
%#16c [			   A]
%#16s [		 ABCDEFG]
%#16.d [			  10]
%#16.b [		  0b1010]
%#16.B [		  0B1010]
%#16.o [			 012]
%#16.x [			 0xa]
%#16.X [			 0XA]
%#16.f [			 10.]
%#16.e [		 1.e+001]
%#16.E [		 1.E+001]
%#16.g [		 1.e+001]
%#16.G [		 1.E+001]
%#16.c [				]
%#16.s [				]
%#-+16.d [+10			 ]
%#-+16.b [+0b1010		 ]
%#-+16.B [+0B1010		 ]
%#-+16.o [+012			]
%#-+16.x [+0xa			]
%#-+16.X [+0XA			]
%#-+16.f [+10.			]
%#-+16.e [+1.e+001		]
%#-+16.E [+1.E+001		]
%#-+16.g [+1.e+001		]
%#-+16.G [+1.E+001		]
%#-+16.c [				]
%#-+16.s [				]
%#16.4d [			0010]
%#16.4b [		  0b1010]
%#16.4B [		  0B1010]
%#16.4o [		   00012]
%#16.4x [		  0x000a]
%#16.4X [		  0X000A]
%#16.4f [		 10.0000]
%#16.4e [	 1.0000e+001]
%#16.4E [	 1.0000E+001]
%#16.4g [		   10.00]
%#16.4G [		   10.00]
%#16.4c [			   A]
%#16.4s [			ABCD]
引数順指定
%1$d %2$d %3$d [1 2 3]
%3$d %2$d %1$d [3 2 1]
引数によるフィールド幅指定
%*d(1) [1]
%*d(2) [ 1]
%*d(3) [  1]
%*d(4) [   1]
%*d(5) [	1]
%*d(6) [	 1]
%*d(7) [	  1]
%*d(8) [	   1]
%*d(9) [		1]
引数による精度指定(実数)
%.*f(1) [1.0]
%.*f(2) [1.00]
%.*f(3) [1.000]
%.*f(4) [1.0000]
%.*f(5) [1.00000]
%.*f(6) [1.000000]
%.*f(7) [1.0000000]
%.*f(8) [1.00000000]
%.*f(9) [1.000000000]
引数による精度指定(文字列)
%.*s(1) [A]
%.*s(2) [AB]
%.*s(3) [ABC]
%.*s(4) [ABCD]
%.*s(5) [ABCDE]
%.*s(6) [ABCDEF]
%.*s(7) [ABCDEFG]
%.*s(8) [ABCDEFGH]
%.*s(9) [ABCDEFGHI]
組合せ
%*.*f(1) [1.0]
%*.*f(2) [1.00]
%*.*f(3) [ 1.000]
%*.*f(4) [  1.0000]
%*.*f(5) [   1.00000]
%*.*f(6) [	1.000000]
%*.*f(7) [	 1.0000000]
%*.*f(8) [	  1.00000000]
%*.*f(9) [	   1.000000000]
動作例(マイナスの数字)
%d [-10]
%u [4294967286]
%b [11111111111111111111111111110110]
%B [11111111111111111111111111110110]
%o [37777777766]
%x [fffffff6]
%X [FFFFFFF6]
%f [-10.000000]
%e [-1.000000e+001]
%E [-1.000000E+001]
%g [-10]
%G [-10]
% d [-10]
% u [ 4294967286]
% b [ 11111111111111111111111111110110]
% B [ 11111111111111111111111111110110]
% o [ 37777777766]
% x [ fffffff6]
% X [ FFFFFFF6]
% f [-10.000000]
% e [-1.000000e+001]
% E [-1.000000E+001]
% g [-10]
% G [-10]
%+d [-10]
%+u [+4294967286]
%+b [+11111111111111111111111111110110]
%+B [+11111111111111111111111111110110]
%+o [+37777777766]
%+x [+fffffff6]
%+X [+FFFFFFF6]
%+f [-10.000000]
%+e [-1.000000e+001]
%+E [-1.000000E+001]
%+g [-10]
%+G [-10]
%2d [-10]
%2u [4294967286]
%2b [11111111111111111111111111110110]
%2B [11111111111111111111111111110110]
%2o [37777777766]
%2x [fffffff6]
%2X [FFFFFFF6]
%2f [-10.000000]
%2e [-1.000000e+001]
%2E [-1.000000E+001]
%2g [-10]
%2G [-10]
%10d [	   -10]
%10u [4294967286]
%10b [11111111111111111111111111110110]
%10B [11111111111111111111111111110110]
%10o [37777777766]
%10x [  fffffff6]
%10X [  FFFFFFF6]
%10f [-10.000000]
%10e [-1.000000e+001]
%10E [-1.000000E+001]
%10g [	   -10]
%10G [	   -10]
%.2d [-10]
%.2u [4294967286]
%.2b [11111111111111111111111111110110]
%.2B [11111111111111111111111111110110]
%.2o [37777777766]
%.2x [fffffff6]
%.2X [FFFFFFF6]
%.2f [-10.00]
%.2e [-1.00e+001]
%.2E [-1.00E+001]
%.2g [-10]
%.2G [-10]
%.10d [-0000000010]
%.10u [4294967286]
%.10b [11111111111111111111111111110110]
%.10B [11111111111111111111111111110110]
%.10o [37777777766]
%.10x [00fffffff6]
%.10X [00FFFFFFF6]
%.10f [-10.0000000000]
%.10e [-1.0000000000e+001]
%.10E [-1.0000000000E+001]
%.10g [-10]
%.10G [-10]
%-16d [-10			 ]
%-16u [4294967286	  ]
%-16b [11111111111111111111111111110110]
%-16B [11111111111111111111111111110110]
%-16o [37777777766	 ]
%-16x [fffffff6		]
%-16X [FFFFFFF6		]
%-16f [-10.000000	  ]
%-16e [-1.000000e+001  ]
%-16E [-1.000000E+001  ]
%-16g [-10			 ]
%-16G [-10			 ]
% 16d [			 -10]
% 16u [	  4294967286]
% 16b [ 11111111111111111111111111110110]
% 16B [ 11111111111111111111111111110110]
% 16o [	 37777777766]
% 16x [		fffffff6]
% 16X [		FFFFFFF6]
% 16f [	  -10.000000]
% 16e [  -1.000000e+001]
% 16E [  -1.000000E+001]
% 16g [			 -10]
% 16G [			 -10]
%016d [-000000000000010]
%016u [0000004294967286]
%016b [11111111111111111111111111110110]
%016B [11111111111111111111111111110110]
%016o [0000037777777766]
%016x [00000000fffffff6]
%016X [00000000FFFFFFF6]
%016f [-00000010.000000]
%016e [-001.000000e+001]
%016E [-001.000000E+001]
%016g [-000000000000010]
%016G [-000000000000010]
%#16d [			 -10]
%#16u [	  4294967286]
%#16b [0b11111111111111111111111111110110]
%#16B [0B11111111111111111111111111110110]
%#16o [	037777777766]
%#16x [	  0xfffffff6]
%#16X [	  0XFFFFFFF6]
%#16f [	  -10.000000]
%#16e [  -1.000000e+001]
%#16E [  -1.000000E+001]
%#16g [		-10.0000]
%#16G [		-10.0000]
%#16.d [			 -10]
%#16.u [	  4294967286]
%#16.b [0b11111111111111111111111111110110]
%#16.B [0B11111111111111111111111111110110]
%#16.o [	037777777766]
%#16.x [	  0xfffffff6]
%#16.X [	  0XFFFFFFF6]
%#16.f [			-10.]
%#16.e [		-1.e+001]
%#16.E [		-1.E+001]
%#16.g [		-1.e+001]
%#16.G [		-1.E+001]
%#-+16.d [-10			 ]
%#-+16.u [+4294967286	 ]
%#-+16.b [+0b11111111111111111111111111110110]
%#-+16.B [+0B11111111111111111111111111110110]
%#-+16.o [+037777777766   ]
%#-+16.x [+0xfffffff6	 ]
%#-+16.X [+0XFFFFFFF6	 ]
%#-+16.f [-10.			]
%#-+16.e [-1.e+001		]
%#-+16.E [-1.E+001		]
%#-+16.g [-1.e+001		]
%#-+16.G [-1.E+001		]
%#16.4d [		   -0010]
%#16.4u [	  4294967286]
%#16.4b [0b11111111111111111111111111110110]
%#16.4B [0B11111111111111111111111111110110]
%#16.4o [	037777777766]
%#16.4x [	  0xfffffff6]
%#16.4X [	  0XFFFFFFF6]
%#16.4f [		-10.0000]
%#16.4e [	-1.0000e+001]
%#16.4E [	-1.0000E+001]
%#16.4g [		  -10.00]
%#16.4G [		  -10.00]
HSPの画像処理モジュールipmpackをアフィン変換対応しました

HSPの画像処理モジュールipmpackをアフィン変換対応しました

久しぶりにipmpackを更新しました。
まだvectorからはダウンロード出来ません。
placearkの方からダウンロードして下さい。

今回オマケとして、sample\ipmpackの中に、
少しだけコンパイル前のソースコードが入っています。

ipmpack 1.050
(公開したてなので、バージョン据え置きの細かい修正が入るかも。vector公開まで待つといいかも。)

いろいろと更新しました。
主な更新点は次のような感じです。
・アフィン変換機能
・画像の一部コピー機能
・カラーマトリックス変換のオフセット値の設定機能
・命令の引数の省略可能な箇所を増やす
・一部の変な命令名を変更
・HSPの新しいサムネイル機能付きヘルプに対応

詳しいところは、ヘルプやreadmeに任せまして、
目玉のアフィン変換機能の紹介。


上のように、アフィン変換を用いて、拡大回転思いのままです。
回転なら、grotateより品質がよく綺麗に回転できます。
線形補間にも対応しています。

ただ少し処理が重たいです。
ソースコードが「sample\ipmpack\sample_vram.zip」の中に入っているので、
自由にいじって下さい。
ライセンスは前の通りNYSLのような感じです。

ヘルプでサムネイルが表示されます!

HSPでアルファチャンネル付きレイヤードウィンドウを実装した

HSPでアルファチャンネル付きレイヤードウィンドウを実装した

以前、アルファ値付きのウィンドウを作りたくて、
リージョンではなくレイヤードウィンドウについて色々調べてたのですが、なかなかうまくいかず。
結局HSPは32bitのウィンドウではなくて24bitのウィンドウのために、
アルファ値付きは不可能なんだと勝手に決めつけ断念していました・・・

それで、もう1度、昨日から再度調査しなおしていたのですが、
UpdateLayeredWindowを使えばいいことが判明!
駄目もとで、一度HSPで作ってみようと頑張ったら完成しました!

32bitのDIBの作り方は、すぽいと君のBITMAPのコピー処理の時に勉強してたので、そこらへんを流用。
何とか動いたんだけど、なんとなくで動いている部分もありプログラム的にはちょっと心配。
ゲームとかと違って、Windowsプログラムはソース自体は短いのに理解するまでが大変だ。

ちなみに、ただ単に透過色指定のSetLayeredWindowAttributesを利用したレイヤードウィンドウや、リージョンウィンドウと比べると
やっぱり、半透明の値をしっかりもっているので、UpdateLayeredWindowで作ったウィンドウはめっちゃきれい!!

アルファチャンネル付きレイヤードウィンドウとの比較画像

下の方は、ディザリング処理と言うか、灰色の中間色が透過されないためギザギザしている・・・

モジュール化して公開してみたのでよかったら使ってください!
なたでラボHSPのモジュールの「レイヤードウィンドウ総合モジュール」です。
Windows2000はGetLayeredWindowAttributesがないので動きません。

HSP用の画像処理モジュールipmpackで手書き風画像処理

HSP用の画像処理モジュールipmpackで手書き風画像処理

前からやってみたかった手書き風の画像処理をしてみた。

#include "ipmpack.hsp"
dialog "bmp;*.gif;*.jpg",16
exist refstr
if (strsize==-1){end}else{picload refstr:title getpath(refstr,8)}
mref vram,66
size=ginfo(26),ginfo(27)
ipm_m_vraminit buf1,size(0),size(1)
ipm_m_vramcopy buf1,vram,size(0),size(1)
n=5
ipm_f_circle f_fil,n
ipm_m_double2int f_fil,i_fil,n*n
ipm_codemedianfilter varptr(vram),varptr(buf1),0,0,size(0),size(1),size(0),size(1),n,n,varptr(i_fil),varptr(i_fil),varptr(i_fil),n*n-n,0
ipm_m_vramcopy vram,buf1,size(0),size(1)
ipm_codekuwaharafilter varptr(vram),varptr(buf1),0,0,size(0),size(1),size(0),size(1),3,3,0
ipm_m_vraminit buf2,size(0),size(1)
n=3
ipm_f_gauss f_fil,n,2
f_fil(n*n/2+n/2-1)=-1.0+f_fil(n*n/2+n/2-1)
ipm_m_double2int f_fil,i_fil,n*n
ipm_codefilter varptr(buf1),varptr(buf2),0,0,size(0),size(1),size(0),size(1),n,n,varptr(i_fil),varptr(i_fil),varptr(i_fil),0,0,0,0
sdim table,257:repeat 256:if (cnt<=5){poke table,cnt,0}else{poke table,cnt,limit(cnt*3,50,255)}:loop
ipm_codegrayscale varptr(buf2),varptr(buf2),0,0,size(0),size(1),size(0),size(1),varptr(table),varptr(table),varptr(table)
ipm_codesubtraction varptr(buf1),varptr(vram),0,0,size(0),size(1),size(0),size(1),varptr(buf2)
n=2
ipm_f_average f_fil,n*n
ipm_codemedianfilter varptr(vram),varptr(buf1),0,0,size(0),size(1),size(0),size(1),n,n,varptr(i_fil),varptr(i_fil),varptr(i_fil),1,0
ipm_m_vramcopy vram,buf1,size(0),size(1)
n=2
ipm_f_circle f_fil,n*n
ipm_codemedianfilter varptr(vram),varptr(buf1),0,0,size(0),size(1),size(0),size(1),n,n,varptr(i_fil),varptr(i_fil),varptr(i_fil),n*n-n,0
ipm_m_vramcopy vram,buf1,size(0),size(1)

それにしてもこのblog(MSN Spaces blog)、pngとかでアップできないから困る!
JPEGにしても勝手に圧縮率変えて再圧縮されて汚くなるし。
MSN Spaces余分なことするんじゃねえええええ。
50kb未満のサイズならそのまま通して下さい。

そもそも今時JPEGって、JPEG2000が標準になってくれればいいなあ。

HSP用の画像処理モジュールipmpackの開発 part1

HSP用の画像処理モジュールipmpackの開発 part1

ついにHSPのモジュールのver1.002が完成。

そのモジュールでフィルタを作りました。

これが、前からやってみたかった処理。

これをやるためだけに作ったんだぜ^^

後はストローク・波・ノイズとかがあれば。

%d人のブロガーが「いいね」をつけました。