Archive for 6月 2009

リペアマン

ワールドビジネスサテライトを見てたら「リペアマン」なる職業があるらしい。
インタビューに答えていた方の中にも、結構年配の方もいた。
最近、新しく楽器を買うよりも、持っている楽器を直して使用するケースが多いそうだ。

早速ググってみたら、社会人でも入学出来るらしい。

いいなぁ。楽器は弦楽器(ギター等)ばかりで管楽器をやったことはないが、管楽器のリペアして暮らしたい。


gif画像のリサイズ

透過色のあるgif画像の出力
で、透過色付きgif画像の出力は出来たが、出力したgifファイルをリサイズする必要が出てきました。

これを実現するには、アフィン変換(アフィン写像参照)という考え方を使って行うらしい。
アフィーンというかギャフンという感じだ。

実装はAffineTransformOpを使って元イメージをフィルタさせるらしい。

このクラスは、アフィン変換を使用して、ソースのイメージまたは Raster の 2 次元座標からデスティネーションのイメージまたは Raster の 2 次元座標への線形マッピングを実行します。使用される補間のタイプは、コンストラクタを介して、RenderingHints オブジェクトまたはこのクラスで定義されている整数型補間タイプのうちの 1 つによって指定されます。

それにしてもいつもすごく分かりにくい説明ですね。

ちなみに、java.awt.imageパッケージのxxxxOpというクラスは、操作対象があって、その対象に対しての操作が出来るモノらしいです。
AffineTransformOpは、文字通りアフィン変換を対象に対して行うものです。

アフィン変換にはいくつか種類があって、リサイズということは拡大縮小(スケーリング)なので、その内容を指定して
AffineTransformを引数として
AffineTransformOpに渡します。

AffineTransformは、スケーリング変換の場合AffineTransform#getScaleInstance
取得できますが、この引数はリサイズ後のサイズではなく、元画像とリサイズ後画像の比率(リサイズ後画像/元画像)を指定します。

	//比率を出す
	double resizeWidthRatio = (double)resizeWidth / (double)src.getWidth();
	double resizeHeightRatio = (double)resizeHeight / (double)src.getHeight();
 
	AffineTransform at = AffineTransform.getScaleInstance(resizeWidthRatio, resizeHeightRatio);
	AffineTransformOp atOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BICUBIC);

このAffineTransformOpの第二引数には以下の3つのどれかを指定します。

バイキュービック法によると、TYPE_BICUBICを選択するのが画質が良さそう。

しかし、これでgifファイルを書き込みしても透過されてくれないので、自力でやる必要がある。
記事が埋もれそうなので次回に。


WordPressプラグインの作成(3)

WordPressプラグインの作成(2)の続きです。

前回は管理画面で表示できるまでが出来ましたが、その設定値はどこに保存するか?というのが問題です。

Creating Options Pagesを見ると、すごく簡単そう。
WordPress MUでも、ブログ毎に設定が保存されるようなので、これが使えそうです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function wp_head() {		
	echo "\n<!-- My CSS Editor $this->version -->\n";
	if( get_option($this->option_name) ){
		echo '<style type="text/css">';
		echo '<--';
		echo get_option($this->option_name);
		echo '-->';
		echo '</style>';
	}
}
 
function edit_setting() {
	if ( isset($_POST['action']) && $_POST['action'] == 'update' ){
		update_option($this->option_name, $_POST['css_value']);
		echo '<div id="message" class="updated fade"><p><strong>Your Style Sheet was preserved. </strong></p></div>';
	}elseif(isset($_POST['action']) && $_POST['action'] == 'delete'){
		delete_option($this->option_name);
		echo '<div id="message" class="updated fade"><p><strong>Your Style Sheet setting was deleted. </strong></p></div>';
	}
	echo '<div class="wrap">';
	echo '<h2>Edit of your Style Sheet</h2>';
	echo '<form>option_name}\"",  ' action="'.$_SERVER['REQUEST_URI'].'" method="post">';
	wp_nonce_field('update-options');
	echo '<table class="form-table">';
 
	echo '<p>Your Style Sheet setting can be made by editing the text area. <br />';
	echo 'The setting can be deleted with the delete button. </p>';
	echo '<tr valign="top">';
	echo '<th scope="row">$this->option_name</th>';
	echo '<td>';
	echo '<textarea name="css_value">';
 
	if($settings = get_option($this->option_name)){
		echo $settings;
	}else{
		;
	}
 
	echo '</textarea>';
 
	echo '</td>';
	echo '</tr>';
	echo '</table>';
	echo "function delete_setting(){alert('delete?');document.getElementById('action').value='delete';document.getElementById('{$this->option_name}').submit();}";
	echo '';
	echo '<p> </p>';
	echo '<p> </p>';
	echo '</form>';
	echo '</div>';
}

コード書いてもちょっと見難いのですが、
名前を「My CSS Editor」に変更しました。
wp_head()関数では、$this->option_nameでオプションを取得して表示させています。(option_nameというインスタンス変数にオプション名を持たせています)
edit_setting()関数では、つまりは、actionというhiddenの値で、updateとdeleteを切り替えています。
メッセージはプラグインを公開するためにとりあえず英語にしました。
あとは、国際化とWordpress.comに公開することです。