
いつもお世話になっております。
初めて質問いたします。
Win XP で Illustrator CSを使用しております。
画像の特定の色の面積を測定したいと思っています。
例えば、http://www12.plala.or.jp/python357/test.gif
のような画像の色それぞれの面積です。
現在は、作成した画像をbmp形式で保存し、「画像から面積」という選択した色のピクセル数を数えるフリーソフトによって測定しています。
しかし、実際にはもっと複雑な形をしており、測定したい領域の数はもっと多いのです。(全て直線のパスで作成しており、ベジェ曲線はなし)
「画像から面積」でも時間をかければ測定することはできるのですが、境界部は色が混ざっており、正確な数値を得ることができません。
そこで、作成した任意のパスのアンカーポイイントから面積を測定し、その結果をテキストファイルに出力することは可能でしょうか?もし良い方法があれば教えていただけると幸いです。よろしくお願い致します。
スクリプトに関しては知識がないので、簡単なコメントをいただけると幸いです。
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();//テキストファイルを閉じる
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/
この回答への補足
ご回答ありがとうございます。
回答をいただき、いろいろ試行錯誤しておりました。
JavascriptはC言語と似た記述をするのですね。
参考URLも大変参考になります。
早速実行してみました。数値が出てきて感動しております。
確かに誤差はありますが、0.1%にも満たないようなので気になりません。
そこで、結果をエクセルに貼り付けやすいようにcsv形式での出力を試みたのですが、レイヤー名が日本語だと、文字コードがUTF-8Nになり、エクセルで開くと文字化けしてしまうようです。
テキストエディタで文字コードを変換して保存すれば解決するのですが、
文字コードを指定することはできるのでしょうか?
また、レイヤー内のパスそれぞれの面積を出力することができるようになりました。
そこで、レイヤー内のパスの面積を縦並びではなく横並びに出力したいと思っているのですが、どのように記述すればよろしいのでしょうか?
例えば、レイヤー1には3つのオブジェクト、レイヤー2には2つのオブジェクトがある場合、この様な感じの出力したいのです。
レイヤー1,***.***,***.***,***,***
レイヤー2,***.***,***.***
もしよろしければ、お時間のあるときに回答頂ければ幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Illustrator(イラストレーター) Illustrator アンカーポイント選択について 3 2023/01/30 12:31
- Illustrator(イラストレーター) ワードに貼った画像のキャンバスと画像本体のサイズの調整 2 2022/05/19 18:31
- 相続・譲渡・売却 境界確定、これは一般的なやり方ですか? 6 2023/01/24 22:10
- Visual Basic(VBA) PowerPoint VBA で画像の鮮明度を変更する方法がわかりません 2 2023/03/24 13:34
- フリーソフト アイコンとして保存アプリが不調 2 2022/04/16 06:39
- 電気工事士 6.6kVケーブル単芯325sq-1.5kmの遮蔽銅テープ抵抗値は何Ω? 1 2023/05/02 21:06
- YouTube ユーチューブへの動画投稿にサムネイルを付ける方法は? 1 2022/07/21 23:45
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- 農学 植物の葉の面積って、植物が双葉だった場合、どちらかを測るんですか?それともどっちとも測りますか? ま 2 2022/08/20 20:46
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
このQ&Aを見た人はこんなQ&Aも見ています
-
イラストレーターで、面積を出す事ができますか? ドットで出せるような事を聞きましたが、使った事もない
Illustrator(イラストレーター)
-
イラストレーターの面積を求める
Illustrator(イラストレーター)
-
イラストレーター10で面積を測りたい
画像編集・動画編集・音楽編集
-
-
4
Photoshopを使った画像の面積の求め方について!
その他(ソフトウェア)
-
5
イラストレータで面積算定
画像編集・動画編集・音楽編集
-
6
Illustratorの面積測定スクリプトが変な挙動をします
CAD・DTP
-
7
描いた図形の面積がわかるソフトウェア
その他(ソフトウェア)
-
8
クリッピングマスクの枠の外を取り除く方法
画像編集・動画編集・音楽編集
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォトショ、または、イラレで...
-
jww レイヤーグループバーの「...
-
Illustratorで作成した画像の面...
-
写真の色を薄くする方法
-
Photohopの「ガイド」はコピー...
-
Illustratorの面積測定スクリプ...
-
MAC/IPアドレスとARPで送信デー...
-
グーグルアースで鉄道関係の駅...
-
G.CREW
-
マイピクチャの画像を編集する...
-
マルチキャストが使えるスイッ...
-
クリッピングマスクの枠の外を...
-
jw_cadで消えない線があります...
-
in Designで一部のページにのみ...
-
バツ印をつけるには??(ワード)
-
指定範囲内で図形等を削除する...
-
エクセルの図形で弧を書く方法
-
エクセルマクロでシート内にあ...
-
EXCEL 一部のオブジェクトだ...
-
エクセルで、渦巻きを作りたい。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Photohopの「ガイド」はコピー...
-
フォトショ、または、イラレで...
-
jww レイヤーグループバーの「...
-
google earth pro をPCで使って...
-
Illustratorで作成した画像の面...
-
写真の色を薄くする方法
-
Illustratorの操作が難しいです...
-
設計用語の意味を教えてください。
-
再質問です。グーグルアースで...
-
【Illustrator】ファイルを開い...
-
Gcrew で作成したファイルを・...
-
フェードアウトした画像をイラ...
-
formZから3dsmaxへデータを渡す...
-
Illustratorの面積測定スクリプ...
-
Photoshopで画像の結合をするに...
-
マルチキャストが使えるスイッ...
-
レイヤ2,レイヤ3、レイヤ4...
-
CADソフト頭脳RAPID15Proのレイ...
-
vectorworksでの印刷方法
-
質問です。
おすすめ情報