アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
初めて質問いたします。

Win XP で Illustrator CSを使用しております。

画像の特定の色の面積を測定したいと思っています。
例えば、http://www12.plala.or.jp/python357/test.gif
のような画像の色それぞれの面積です。

現在は、作成した画像をbmp形式で保存し、「画像から面積」という選択した色のピクセル数を数えるフリーソフトによって測定しています。

しかし、実際にはもっと複雑な形をしており、測定したい領域の数はもっと多いのです。(全て直線のパスで作成しており、ベジェ曲線はなし)
「画像から面積」でも時間をかければ測定することはできるのですが、境界部は色が混ざっており、正確な数値を得ることができません。

そこで、作成した任意のパスのアンカーポイイントから面積を測定し、その結果をテキストファイルに出力することは可能でしょうか?もし良い方法があれば教えていただけると幸いです。よろしくお願い致します。
スクリプトに関しては知識がないので、簡単なコメントをいただけると幸いです。

A 回答 (2件)

文字コードの指定はよくわかりません。

たぶんできない...。

各オブジェクトの面積を並べる場合、Illustrator上から書き出される順番(重なり順)がわかりづらいので、
名前をつけるようにしました。名前の“テキスト”も置くようにもしました。
レイヤ名も英数字に直すようにしました。

あとは好きなようにいじってください。
IllustratorのJavascriptのことは、"AIJavaScriptReference.pdf"を参照してください。







//outputFileは、書き出すテキストのパス。
var outputFile = new File("/C/Documents and Settings/ログイン名/デスクトップ/Output.csv");
outputFile.open("write");//テキストファイルを開く
var lays =activeDocument.layers;
var mm=2.8346456;//Illustratorの内部計算はポイントで行われる。mmに変換するための数値

outputFile.writeln("LayerName"+",1"+",2");//ヘッダ書き込み,後はドラッグする...。

for (var i=0 ; i <lays.length; i++){
if(lays[i].visible != true)continue;//非表示レイヤは無視
var str="";//初期化
var area_value=0;//初期化
var laynum=i+1;
lays[i].name="Layer "+laynum;//レイヤ名を英数字に変換
if (lays[i].pathItems.length==0)continue;//パスが無いレイヤは無視
for (var j=0 ; j < lays[i].pathItems.length; j++){
var obj=lays[i].pathItems[j];//オブジェクトを取得

/*オブジェクトに名前を付ける*/
obj.name=j+1;


/*オブジェクトの上に名前のテキストを置く*/
var textArt = lays[i].textFrames.add();
textArt.textRange.size = 6;//テキストサイズ
var xcod=obj.left+obj.width/2-textArt.width/2;
var ycod=obj.top-obj.height/2+textArt.height/2;
textArt.position = Array(xcod, ycod);//テキストの位置
textArt.contents =j+1;//テキストの内容


/*面積を求めてまとめる*/
area_value=obj.area;//1つのオブジェクトの面積
area_value=area_value/mm/mm;//square pointsで計算された値をミリ平方に変換
str+=","+area_value;//1行分のデータをまとめる
}
outputFile.writeln(lays[i].name+str);//書き込み
}
outputFile.close();//テキストファイルを閉じる
    • good
    • 1
この回答へのお礼

すばやい回答ありがとうございます。
非常に助かりました。
Javascriptをもっと勉強してみたいと思いました。

お礼日時:2006/04/25 09:48

//outputFileは、書き出すテキストのパス。


var outputFile = new File("/C/Documents and Settings/ログイン名/My Documents/Output.txt");
outputFile.open("write");//テキストファイルを開く
var lays =app.activeDocument.layers;
var mm=2.8346456;//Illustratorの内部計算はポイントで行われる。mmに変換するための数値
var area_value=0;//初期化
for (var i=lays.length-1 ; i >=0 ; i--){
if (lays[i].pathItems.length==0)continue;
for (var j=0 ; j < lays[i].pathItems.length; j++){
var obj=lays[i].pathItems[j];
area_value+=obj.area;
}
area_value=area_value/mm/mm;//square pointsで計算された値をミリ平方に変換
outputFile.writeln(lays[i].name+"\t"+area_value);//書き込み
area_value=0;//次のレイヤのために初期化
}
outputFile.close();//テキストファイルを閉じる








Javascriptでやるとこんな感じ。
はじめに、outputFileのとこをご自分の環境に合わせて直してくださいね...。

Illustrator上で、色違いのオブジェクトを“レイヤごと”に分けてください。
パス以外のオブジェクトがあると正しく計算しません。

計算誤差が大きいのはIllustrator程度では仕方ありません...。
ポイントを変換してるし...Javascriptだし...。
(VectorWorksとかでやった方が精度は高くなりますよ。)

上をテキストファイルにコピペして適当な名前で保存します。
拡張子を .js にしてください。
スクリプトメニューから参照して実行してください。
よく使うなら、Illustratorフォルダ以下のスクリプトフォルダに入れておくと、
いつでもスクリプトメニューから使えます。
(C:\Program Files\Adobe\Illustrator CS\プリセット\スクリプト)
ちなみに、“選択図形”の合計面積を得たいだけなら以下を。







var objs = app.activeDocument.selection;
var mm=2.8346456;//Illustratorの内部計算はポイントで行われる。mmに変換するための数値
var area_value=0;
for(var i=0; i<objs.length; i++){
var obj=objs[i];
area_value+=obj.area;//面積を合計していく
}
area_value=area_value/mm/mm;//square pointsで計算された値をミリ平方に変換
var tx="面積  単位:平方ミリメートル";
prompt( tx, area_value );

参考URL:http://www.openspc2.org/book/IllustratorCS/

この回答への補足

ご回答ありがとうございます。
回答をいただき、いろいろ試行錯誤しておりました。
JavascriptはC言語と似た記述をするのですね。
参考URLも大変参考になります。

早速実行してみました。数値が出てきて感動しております。
確かに誤差はありますが、0.1%にも満たないようなので気になりません。
そこで、結果をエクセルに貼り付けやすいようにcsv形式での出力を試みたのですが、レイヤー名が日本語だと、文字コードがUTF-8Nになり、エクセルで開くと文字化けしてしまうようです。
テキストエディタで文字コードを変換して保存すれば解決するのですが、
文字コードを指定することはできるのでしょうか?

また、レイヤー内のパスそれぞれの面積を出力することができるようになりました。
そこで、レイヤー内のパスの面積を縦並びではなく横並びに出力したいと思っているのですが、どのように記述すればよろしいのでしょうか?
例えば、レイヤー1には3つのオブジェクト、レイヤー2には2つのオブジェクトがある場合、この様な感じの出力したいのです。
レイヤー1,***.***,***.***,***,***
レイヤー2,***.***,***.***

もしよろしければ、お時間のあるときに回答頂ければ幸いです。

補足日時:2006/04/24 20:20
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています