Javascriptからの書き出しコントロール

AIのDOMはドキュメントに対するエクスポート処理を扱うクラスが貧弱で、PNGとかJPGとかTIFF等のビットマップへの変換等をストレートには実装できません。しかしながら、やらなければならない場合なんかも多々あるわけですからなんとかするわけですが、こう言った場合、最後の手段というのを使います。
先日のネタ記事をストレートに解析してしまった方がいましたので、そこにある程度の詳細は書いているのですが、何が一番不満かというと、どれを取ってみてもオレオレ実装で統一感の無いプラグインばかりを並べ立てているところです。ある程度プログラマのクセや好みというのが出てくるのも致し方がないことです。しかし、各プラグインや機能を詳細に調べてみると挙動に統一感が全く無いのが分かります。また、SDKなんかのサンプル見てると実装の手順がまちまちでサンプルを書いた個人の個性がモロに反映された、とても中途半端なものが多いのです。
脱線していますが今回はPNGとJPGへのドキュメントからのエクスポートを行う例です。

exportplugin.png

上のプラグインは今回のエクスポートに関係するものです。

まずはJPGから行ってみましょう。

function exportJPG(pth){ //Export 300dpi CMYK jpg
    var str = “”;
    for (var i=0;i<pth.length;i++) str += u16to8(pth.charCodeAt(i));
    var act = “/version 3/name [ 4 73657431]/isOpen 1”
            + “/actionCount 1/action-1 {/name [ 4 61637431]/keyIndex 0/colorIndex 0/isOpen 1/eventCount 1”
            + “/event-1 {/useRulersIn1stQuadrant 0/internalName (adobe_exportDocument)”
            + “/isOpen 0/isOn 1/hasDialog 1/showDialog 0/parameterCount 7”
            + “/parameter-1 {/key 1885434477/showInPalette 0/type (raw)”
            + “/value < 100 0a00000001000000030000000100000000002c01020000000000000001000000”
            + “69006d006100670065006d006100700000000000000000000000000000000000”
            + “0000000000000000000000000000000000000000000000000000000000000000”
            + “00000100>/size 100}” //Probably, parameter for exporter plugin
            + “/parameter-2 {/key 1851878757/showInPalette 4294967295”
            + “/type (ustring)/value [ ” + str.length/2 + ” ” + str + “]}”  //fullPath of the export target
            + “/parameter-3 {/key 1718775156/showInPalette 4294967295”
            + “/type (ustring)/value [ 16 4a5045472066696c6520666f726d6174]}” // JPEG file format
            + “/parameter-4 {/key 1702392942/showInPalette 4294967295”
            + “/type (ustring)/value [ 12 6a70672c6a70652c6a706567]}” //jpg,jpe,jpeg
            + “/parameter-5 {/key 1936548194/showInPalette 4294967295/type (boolean)/value 0}”
            + “/parameter-6 {/key 1935764588/showInPalette 4294967295/type (boolean)/value 1}”
            + “/parameter-7 {/key 1936875886/showInPalette 4294967295/type (ustring)/value [ 0]}}}”;
    var tmp = File(Folder.desktop + “/set1.aia”); 
    tmp.open(‘w’); 
    tmp.write(act);
    tmp.close();
    app.loadAction(tmp);
    app.doScript(“act1”, “set1”, false); 
    app.unloadAction(“set1″,””);
    tmp.remove();
    }

function u16to8(cd) {
    var out =
        (cd < 0x80
            ? toHex2(cd)
            : (cd < 0x800
                ? toHex2(cd >> 6 & 0x1f | 0xc0)
                : toHex2(cd >> 12 | 0xe0) +
                    toHex2(cd >> 6 & 0x3f | 0x80)
            ) + toHex2(cd & 0x3f | 0x80)
        );
    return out;
    }

function toHex2(num) {
    var out = ‘0’ + num.toString(16);
    return out.slice(-2);
}

var pth = Folder.selectDialog(“target Folder?”).fsName + “/test.jpg”;
exportJPG(pth);<pth.length;i++) str="" +="u16to8(pth.charCodeAt(i));" var="" act="/version 3/name [ 4 73657431]/isOpen 1" "="" actioncount="" 1="" action-1="" {="" name="" [="" 4="" 61637431]="" keyindex="" 0="" colorindex="" isopen="" eventcount="" 1"="" event-1="" userulersin1stquadrant="" internalname="" (adobe_exportdocument)"="" ison="" hasdialog="" showdialog="" parametercount="" 7"="" parameter-1="" key="" 1885434477="" showinpalette="" type="" (raw)"="" value=""

ご覧の様にこのスクリプトはアクションを一時的に登録し、それを実行することにより機能を実現しています。このアクションを組み立てる手法ではアクションパラメータを編集することにより変数を組み込むことが出来る点にアドバンテージがあります。

+ “/type (ustring)/value [ ” + str.length/2 + ” ” + str + “]}” //fullPath of the export target

これは書き出し先のファイル名を指定している部分です。引数を2点わたします。1点目が引き渡す文字列のコード数。純粋な文字数ではありません。2点目が文字列のコードです。こちらはUTF-8で書く必要があります。なのでu16to8というファンクションを組み込んであります。1点目のコード数ですが、データ単位が2byteとなっています。ですから2点目のUTF-8のコードbyte数を2で割ったものを与えれば良いということになります。そしてそれぞれの引数を分けるのはスペースです。おそらく正規表現の\sに該当するものであれば認識するのだと思います。アクションを書きだした場合、改行で表現される部分です。フォーラム等を見ているとこの部分はただ単に文字コードを拾い上げている場合が多いのですが、彼らは日々の殆どをシングルバイトの文字コードで過ごしていますからこの部分が解らなかったようです。
JPGの場合、主要なパラメータについてはアクションからは全くアクセスできません。

+ “/value < 100 0a00000001000000030000000100000000002c01020000000000000001000000”
+ “69006d006100670065006d006100700000000000000000000000000000000000”
+ “0000000000000000000000000000000000000000000000000000000000000000”
+ “00000100>/size 100}” //Probably, parameter for exporter plugin

この部分がpluginへ渡すパラメータを記述している部分です。解析するのも面倒ですので各プリセット毎にこのパラメータを用意しておくのが良いだろうと思います。
次にPNGへの書き出しです。大筋では変わりません。

function exportPNG(pth, res){
    app.preferences.setIntegerPreference(“plugin/PNGFileFormat/Resolution”,res);
    var str = “”;
    for (var i=0;i<pth.length;i++) str += u16to8(pth.charCodeAt(i));
    var act = “/version 3”
        + “/name [ 4 73657431]”
        + “/isOpen 1/actionCount 1”
        + “/action-1 {/name [ 7 616374696f6e31]”
        + “/keyIndex 0/colorIndex 0/isOpen 1/eventCount 1”
        + “/event-1 {“
        + “/useRulersIn1stQuadrant 0”
        + “/internalName (adobe_exportDocument)”
        + “/isOpen 0/isOn 1/hasDialog 1/showDialog 0”
        + “/parameterCount 6”
        + “/parameter-1 {/key 1851878757/showInPalette 4294967295”
        + “/type (ustring)”
        + “/value [ ” + str.length/2 + ” ” + str + “]}”//Fullpath of the target file in UTF-8 Hexadecimal
        + “/parameter-2 {/key 1718775156/showInPalette 4294967295”
        + “/type (ustring)/value [ 16 41646f626520504e4720466f726d6174]}”//Adobe PNG Format
        + “/parameter-3 {/key 1702392942/showInPalette 4294967295”
        + “/type (ustring)/value [ 3 706e67]}” //png
        + “/parameter-4 {/key 1936548194/showInPalette 4294967295/type (boolean)/value 0}”
        + “/parameter-5 {/key 1935764588”
        + “/showInPalette 4294967295/type (boolean)/value 1}”
        + “/parameter-6 {/key 1936875886/showInPalette 4294967295/type (ustring)/value [ 0]}}}”
       
    var tmp = File(Folder.desktop + “/tmpSet1.aia”); 
    tmp.open(‘w’); 
    tmp.write(act);
    tmp.close();
    app.loadAction(tmp);
    app.doScript(“action1”, “set1”, false); 
    app.unloadAction(“set1″,””);
    tmp.remove();
    }

function u16to8(cd) {
    var out =
        (cd < 0x80 ? toHex2(cd): (cd < 0x800
                ? toHex2(cd >> 6 & 0x1f | 0xc0)
                : toHex2(cd >> 12 | 0xe0) +
                    toHex2(cd >> 6 & 0x3f | 0x80)
            ) + toHex2(cd & 0x3f | 0x80)
        );
    return out;
    }

function toHex2(num) {
    var out = ‘0’ + num.toString(16);
    return out.slice(-2);
}

var pth = Folder.selectDialog(“target Folder?”).fsName + “/test.png”;
exportPNG(pth, 300);<pth.length;i++) str="" +="u16to8(pth.charCodeAt(i));" var="" act="/version 3" "="" name="" [="" 4="" 73657431]"="" isopen="" 1="" actioncount="" 1"="" action-1="" {="" 7="" 616374696f6e31]"="" keyindex="" 0="" colorindex="" eventcount="" event-1="" {"="" userulersin1stquadrant="" 0"="" internalname="" (adobe_exportdocument)"="" ison="" hasdialog="" showdialog="" parametercount="" 6"="" parameter-1="" key="" 1851878757="" showinpalette="" 4294967295"="" type="" (ustring)"="" value="" str.length="" 2="" "]}"="" fullpath="" of="" the="" target="" file="" in="" utf-8="" hexadecimal="" parameter-2="" 1718775156="" (ustring)="" 16="" 41646f626520504e4720466f726d6174]}"="" adobe="" png="" format="" parameter-3="" 1702392942="" 3="" 706e67]}"="" parameter-4="" 1936548194="" 4294967295="" (boolean)="" 0}"="" parameter-5="" 1935764588"="" 1}"="" parameter-6="" 1936875886="" 0]}}}"="" tmp="File(Folder.desktop" tmpset1.aia");="" tmp.open('w');="" tmp.write(act);="" tmp.close();="" app.loadaction(tmp);="" app.doscript("action1",="" "set1",="" false);="" app.unloadaction("set1","");="" tmp.remove();="" }="" function="" u16to8(cd)="" out="(cd"

しかし、PNGの場合エクスポート設定がAI初期設定に含まれます。また、ここで使われるエクスポートプラグインはエクスポートの度にこの設定を読み込みます。ですから…

app.preferences.setIntegerPreference(“plugin/PNGFileFormat/Resolution”,res);

と、出力解像度をプレファレンスを調整することで設定出来るのです。とまあ、コードを比較してみると実装がどの程度違うかは見えますよね? 実際、ひどいものですw

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中