• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Illustratorで作成した画像の面積の測定)

Illustratorで作成した画像の面積を測定する方法

このQ&Aのポイント
  • Illustratorで作成した画像の面積を正確に測定する方法をご紹介します。
  • 現在はフリーソフトを使用して画像の色ごとの面積を測定していますが、境界部の色の混ざり具合により正確な数値が得られないことがあります。
  • 任意のパスのアンカーポイントから面積を測定し、結果をテキストファイルに出力する方法についてもご説明します。

質問者が選んだベストアンサー

  • ベストアンサー
  • grazie
  • ベストアンサー率56% (200/355)
回答No.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();//テキストファイルを閉じる

riverengineer
質問者

お礼

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

その他の回答 (1)

  • grazie
  • ベストアンサー率56% (200/355)
回答No.1

//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/
riverengineer
質問者

補足

ご回答ありがとうございます。 回答をいただき、いろいろ試行錯誤しておりました。 JavascriptはC言語と似た記述をするのですね。 参考URLも大変参考になります。 早速実行してみました。数値が出てきて感動しております。 確かに誤差はありますが、0.1%にも満たないようなので気になりません。 そこで、結果をエクセルに貼り付けやすいようにcsv形式での出力を試みたのですが、レイヤー名が日本語だと、文字コードがUTF-8Nになり、エクセルで開くと文字化けしてしまうようです。 テキストエディタで文字コードを変換して保存すれば解決するのですが、 文字コードを指定することはできるのでしょうか? また、レイヤー内のパスそれぞれの面積を出力することができるようになりました。 そこで、レイヤー内のパスの面積を縦並びではなく横並びに出力したいと思っているのですが、どのように記述すればよろしいのでしょうか? 例えば、レイヤー1には3つのオブジェクト、レイヤー2には2つのオブジェクトがある場合、この様な感じの出力したいのです。 レイヤー1,***.***,***.***,***,*** レイヤー2,***.***,***.*** もしよろしければ、お時間のあるときに回答頂ければ幸いです。

関連するQ&A