2013年4月26日金曜日

Photoshop.Application.DoJavaScriptをjscript(jsxではない)から呼び出す時に嵌ったのでメモ

Photoshopを外部スクリプトから操作するとき

var app = new ActiveXObject('Photoshop.Application');

とPhotoshopオブジェクトを作っておいて

app.DoJavaScriptを呼び出すのですが、外部のスクリプトから引数を渡さなければ
問題ないのですが、引数を渡したいときに嵌った。
引数は第二パラメータに配列で渡す必要があるので以下のようなコードを書いた。

app.DoJavaScript("alert('Hello World!:' + arguments[0]);", ['引数1'], 1);

これを実行すると、「無効な引数 - 引数2 - 配列が必要」というエラーが発生してしまう。
JavaScriptの配列はCOMでは配列扱いにしてくれない臭い。

同じようなことをVBScriptで書いた場合、すんなりと動いてしまう。。。。


Dim app
Set app = CreateObject("Photoshop.Application")
Dim arg
arg = Array("引数1", "2")
app.DoJavaScript "alert('Hello World!' + arguments[0]);", arg, 1

実行するとPhotoshop上で「Hello World! 引数1」とメッセージが表示される。
VBScriptの配列はCOMの配列として扱ってくれるようだ。

これを解決するために以下の様な関数を作ってみた。

function toVBArray(arry)
{
var dic = new ActiveXObject("Scripting.Dictionary");
for(var i = 0; i < arry.length; ++i) {
dic.add(i, arry[i]);
}
return dic.Items();
}


JScriptの配列をVBScript互換の配列に変換したい場合、一旦Dictionaryを経由すれば良いらしい。
先ほどのDoJavaScriptの呼び出しコードを以下のように変更する。

app.DoJavaScript("alert('Hello World!:' + arguments[0]);", toVBArray(['引数1']), 1);

これで無事に引数を渡すことができた!!

2013年3月29日金曜日

シンボルサーバーを設定する

シンボルサーバーを設定した(する)ので自分用のメモ

シンボルサーバーを設定する

マイコンピュータの環境設定の環境変数「_NT_SYMBOL_PATH」にシンボルサーバーへのパスを設定します。

例えば、

  • D:\symbols
  • \\symserver\symbols
  • http://msdl.microsoft.com/download/symbols

にシンボルサーバーだよと設定したい場合、環境変数に

Srv*D:\symbols*\\symserver\symbols*http://msdl.microsoft.com/download/symbols

というように設定します。
これを設定しておくと、「D:\symbols」と「\\symserver\symbols」共有フォルダにシンボルファイルが格納されます。

シンボルサーバーへシンボルの追加

共有フォルダへシンボルファイルを追加する場合、「symstore.exe」を使用します。
これはMicrosoft Debugging Tools for Windowsのパッケージに含まれています。

例えば、「C:\svn\projects」フォルダ下に生成されたシンボルファイルを共有フォルダに登録したい場合、以下のように実行します。

symstore.exe add /f "c:\svn\projects\*.pdb" /s "\\symserver\sysmbols" /r

このコマンドで「C:\svn\projects」フォルダ下の*.pdbファイルを再帰的探して共有フォルダに設定します。

2013年3月5日火曜日

icc profileを使った色変換



ここではicc profileを使った色変換をWPFのGraphicsを使ってやってみようと思う。
まず、WPFのGraphicsについて簡単に
GDIやGDI+と比較してWPFのGraphics(System.Windows.Media.Imaging)は割りとよくできている。

特徴


・RGBだけではなく、様々なピクセルフォーマットに対応している
 →RGB(A)/CMYK/Gray
・icc profileを使用した色変換もサポートしているよ
・Regionではなくパスの論理演算ができるよ
・ビットマップのエフェクト周りがいろいろ捗るよ
・2DGraphicだけではなくて3DGraphicもサポートしているよ

やりたいこと


  • icc profileを使った画像の色変換
  • ビットマップの画素を弄る
  • icc profileを埋め込んだ画像の生成

icc profileを埋め込んだ画像の生成


JPEGファイルを生成する場合

JpegBitmapEncoderというクラスを使用する。
こいつは任意のピクセルフォーマットのビットマップからJpegを生成するクラスだ。

元のビットマップデータはWritableBitmapというクラスで予め設定しておく。

var w = 640; var h = 480;
var bmp = WriatableBitmap(w, h, 72, 72, PixcelFormats.Cmyk32, null);

的な感じでやると幅/高さ = 640/480ピクセルの1画素がCMYK(4byte)のビットマップ
バッファが生成される。
こいつの偉いところはピクセルフォーマットによって内部の構造を隠蔽しているところだ。

こいつに予め用意しておいたCMYKのbyte配列・・・buffでFillする場合、

bmp.WritePixcels(new Int32Rect(0, 0, w, h), buff, w * 4, 0);

というように書くとCMYKのビットマップがWritableBitmapに設定される。
後は、icc profileを埋め込んだJPEGファイルの生成だ。


WriteableBitmapをJpegBitmapEncoderに渡す場合、BitmapFrameというクラスを介在
させる必要があるらしい。

つまり、BitmapFrameにWriteableBitmapを設定して、そのBitmapFrameをJpegBitmapEncoder
に渡すような感じだ。

icc profileの表現


WPFのGraphicにおけるicc profileはColorContextクラスで表現される。

var cc = new ColorContext(new Uri(@"c:\spool\JapanColor2001Coated.icc"));

といった感じだ。

icc profileの埋め込み指定


生成するJpegファイルにicc profileを埋め込む場合、

JpegBitmapEncoder.ColorContext

というプロパティがあるのでこれに設定すればうまくいきそうだが、そうは行かない。
実行時にエラーが発生してしまう。

icc profileを埋め込んだJPEGを生成する場合、BitmapFrameをCreateする際にColorContextを渡す必要がある。
※なんでわざわざこんな実装にするんだろう?

以下のようなコードになる。


var bmpframe = BitmapFrame.Create(bmp, null, new BitmapMetadata("jpg"),
new ReadOnlyCollection<ColorContext>(new List<ColorContext>() { cc }));


後は、普通にjpegを保存するコードを書く

var enc = new JpegBitmapEncoder();
enc.Frames.Add(bmpframe);
using(var fs = new FileStream(@"c:\aa.jpeg", FileMode.Create, FileAccess.Write)) {
  enc.Save(fs);
}

うーん、実に簡単だ。



ちなみに、同じCMYKのビットマップからprofileの埋め込みあり、なしでJPEGを比較した。随分違うことがわかる。

2013年2月26日火曜日

バックアップソフト

データベースの二重化はDBMS自身が機能として持っているけれどファイルシステムの二重化は何があるかを調べたメモ。
仮想環境とかでH/W的なところはあまり考えない(考えられない)環境でソフトウェア的に何か対策をしなければならないという状況での引き出し。

有償:

・ARCServe Replication HA
 いわゆるアークサーブ。10~20万円くらい

・Tivoliリアルタイムバックアップ
 IBM社製。1万円~ライセンス数に応じて価格が決まる一番多い25ライセンスで20万位

無償:
・Bvckup
 リアルタイムでミラーリングを実現してくれる。
 結構軽いとのうわさ。

・BackupF2F

・rsync
 →linuxでのミラーリングアプリ

・BanBackup