リンクをクリップボードにコピー
コピー完了
お世話になっております。
白地に黒いオブジェクトがある画像をトレースするのですが、
カラーを透過で白を選択しておけば、白部分はトレースしないという設定になるのですよね?
現状、カラーを透過で色を設定していないプリセットでやっているのですが、白部分はトレースしていません。
でもカラーを透過で色を設定していても、白部分をトレースしてしまうこともあります。
何が違うのでしょうか?
わかる方がいらっしゃったら教えていただきたいです。
リンクをクリップボードにコピー
コピー完了
ちっと整理させてください
画像トレース時の、画像トレースパネル下部の「カラーを透過」チェックについて
・チェックを無効にしても白の領域が含まれないことがある
・チェックを有効にしても白の領域が含まれることもある
でいいでしょうか。
以下どうでしょう?
・それぞれの元画像のカラーモード(RGB, CMYK, グレスケ, モノクロ2階調)わかりますか
・それぞれの元画像をPhotoshopで開いたとき、白の領域はほんとうの白でしょうか
・「カラーを透過」チェックを入れた際、カラーピッカーで背景色を拾ったでしょうか
あと、ベテラン投稿者さんには常にOSとAiのバージョンは意識をお願いしたいです 😇
リンクをクリップボードにコピー
コピー完了
失礼いたしました。
macOS sonoma 14.5
イラレ 27.9.4
・チェックを無効にしても白の領域が含まれないことがある
・チェックを有効にしても白の領域が含まれることもある
これで合っております。
・元画像のカラーモードは必ずグレースケールです。
・白の領域はPhotoshop上ではC:0,M:0,Y:0,K:0の白でした。
・カラーを透過のチェックは背景色をひろったものではなく、チェックを入れると自動的に白になるのでそのままにしています。チェック入れただけです。
すみませんがお願いいたします。
リンクをクリップボードにコピー
コピー完了
ちなみに、前のバージョンで「ホワイトを無視」にチェックを入れて保存していたプリセットをそのまま使用しています。それを今のバージョンで使用したら、カラーの透過は有効になってなかったって感じです。
リンクをクリップボードにコピー
コピー完了
何度も後出しになってすみません。
「チェックを有効にしても白の領域が含まれる」に関してですが、
有効にしているプリセットを実行を組み込んでいるスクリプトでやると、白の領域が含まれてしまうということに気づきました。
もしかしたらスクリプトの問題もあるのかもしれません。。。
リンクをクリップボードにコピー
コピー完了
手作業と結果が異なるということであれば、スクリプト掲載してもらったほうがいいですね。
投稿フォームの </> を使ってみてください。
リンクをクリップボードにコピー
コピー完了
var sel = app.activeDocument.selection ; //選択オブジェクト
var tracePre = 'トレース'; //トレースプリセット名
(function(){
if(sel.length != 1){alert('選択アイテムが一つではありません。一つだけ画像を選択してください。'); return;}
t = sel[0].trace(); //トレース
t.tracing.tracingOptions.loadFromPreset(tracePre); //トレースプリセット
t.tracing.expandTracing();//拡張
})();
トレースプリセットではなく、
スクリプト上で色々設定してもダメみたいです。
var sel = app.activeDocument.selection; //選択オブジェクト
(function () {
if (sel.length != 1) {
alert('選択アイテムが一つではありません。一つだけ画像を選択してください。');
return;
}
t = sel[0].trace(); //トレース
t.tracing.tracingOptions.viewMode = ViewType.TRACINGVIEWVECTORTRACINGRESULT;
t.tracing.tracingOptions.tracingMode = TracingModeType.TRACINGMODEBLACKANDWHITE;
t.tracing.tracingOptions.threshold = 128;
t.tracing.tracingOptions.pathFidelity = 75;
t.tracing.tracingOptions.cornerFidelity = 75;
t.tracing.tracingOptions.noiseFidelity = 10;
t.tracing.tracingOptions.tracingMethod = TracingMethodType.TRACINGMETHODABUTTING;
t.tracing.tracingOptions.fills = true;
t.tracing.tracingOptions.strokes = false;
t.tracing.tracingOptions.snapCurveToLines = false;
t.tracing.tracingOptions.ignoreWhite = true;
app.redraw();
t.tracing.expandTracing();
})();
また上記のスクリプトについては、
イラレ 27.9.4だとホワイトを無視してくれましたが、イラレのバージョンが28.5になると使えなくなってしまいました。
リンクをクリップボードにコピー
コピー完了
リンクをクリップボードにコピー
コピー完了
上記に書いたスクリプトの後、白のオブジェクトを削除することはできないかやってみました。
トレースする画像はグレースケールです。
sel = app.activeDocument.selection; //選択オブジェクト
items = sel[0].pageItems; //トレース後はグループアイテムになっているので選択オブジェクトの中のページアイテムを拾う
for (var i = items.length - 1; i >= 0; i--) {//塗りがグレースケールで0のものを削除
if (items[i].fillColor) {
if (items[i].fillColor.typename === 'GrayColor') {
if (items[i].fillColor.gray === 0)
items[i].remove();
}
}
}
}
これで削除できるものもあるのですが、同じような画像なのに削除できないものもありました。
画像のせいなのか、スクリプトのせいなのか分かりません。
リンクをクリップボードにコピー
コピー完了
>調べたらスクリプトだと動かないみたい
アクションで動くようなら可能性あるのですが…
リンクをクリップボードにコピー
コピー完了
アクション経由でも、イラレ2024の場合はカラーを透過(白を無視)のオプションが外れてしまうようです・・・。
2023でどうにか誤魔化しています。。
リンクをクリップボードにコピー
コピー完了
↑でスクリプトでカラー透過が動かないと投稿した主です。
結局、最新バージョンでも修正される気配もなくバージョンアップできないのは業務上問題がでてしまうため私のほうでは白を消すというnekkonekoさんと同じ処理をスクリプトで作成して疑似対策としています。
nekkonekoさんのスクリプトとちょっと違うのはトレースが完了したグループに対して一旦パスファインダーで分解をかけた後にグループ内の「パス(pathItems)」と「複合パス(compoundPathItems)」を拾ってきてfillColorのRGBが200,200,200以上になってるものを削除するという手順になってます(グレースケールだとちょっと変える必要があるかも)。
参考になれば。
リンクをクリップボードにコピー
コピー完了
追記です。
こちらではトレース元の画像の関係でパスファインダーで分割や刈り込みが必要だったのですが元画像によってはこの処理は不要かもしれないです。
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
使用する画像に関してはパスファインダーが必要なかったのですが、グレースケールだとなかなか上手くいきませんでした。
削除したいパスアイテムを調べると、fillColorが「undefined」と表示されてしまうのです・・・。
IM-HIDEさんのようにRGBにしたら出来るのか試してみたいと思います。
リンクをクリップボードにコピー
コピー完了
いろいろ検証してみたのですが、グレースケールでもRGBでもCMYKでも、どちらにせよトレース後のオブジェクト内にfillColorが「undefined」になるものがあったり、例えばCMYKで「
var sel = app.activeDocument.selection[0];//選択オブジェクト
var items = sel.pageItems;//選択オブジェクト内のパス
var threshold = 200;
for (var i = items.length-1; i > 0; i--) {
var color = items[i].fillColor;
if (color.red > threshold && color.green > threshold && color.blue > threshold) {
items[i].remove();
}
}
RGBだとこうでしょうか?
これでは動かなかったのですが、何がおかしいでしょうか・・・
」
リンクをクリップボードにコピー
コピー完了
こちらではfillColorがundefinedを返すことはありませんでした。
undefinedになるのは
1.color.red, color.black 等で取得した値が undefine
2.var color = items[i].fillColor;この時点でcolorにundefined
どちらになる感じですか?
1の場合はこちらでやってみた感じドキュメントのカラーモード(app.activeDocument.documentColorSpace)で取得するカラーとfillColorで数値を取得するカラー指定が違うとundefinedを返しましたが(ドキュメントがCMYKモードなのにcolor.redと指定するとundefinedになる等)
2の場合は alert( items[i] ) などで pathItemオブジェクト が返っているのか確認してもらったほうがいいかと。
リンクをクリップボードにコピー
コピー完了
undefinedが出るのは、2の時です。
調べてみたら、どうやら複合パスのもののみundefinedが返っているようでした。
pathItemオブジェクトやcompoundPathItemオブジェクトはちゃんと返っているようですが、fillColorは複合パスだけundefinedです・・・。
その複合パスを解除して出来たパスにはfillcolorはあるようです。
複合パス自体にfillColorがないということなんでしょうか。
複合パスの場合だけ、複合パス内のパスの色を取得したらundefinedではなくなりましたが・・・これでやるしかなさそうです。。
リンクをクリップボードにコピー
コピー完了
複合パス(compoundPathItem)はそれ自体にfillColorは持たずにグループと同じ様に配列になっています。
コード提供したいところですが現在コードがわからないので私のやってる処理の手順を。
注)画像を配置してトレース拡張までして結果としてグループが1つだけが前提としてます。
トレース以外のものがある等の場合適時読み替えてください。
1.全体を選択 - app.executeMenuCommand('selectall');
※通常であればここで1つのグループが選択されてるはずです。
2.グループ内のパス配列[ pathItems ]をデクリメントループしていく
2_1.パス「pathItems[i]」のfillColorを取得させ希望の数値のものを条件作成(if等)してパス削除
3.グループ内の複合パスの配列[ compoundPathItems ]をデクリメントループしていく
3_1.複合パス内「compoundPathItems[j]」のパスの配列[ pathItems ]をデクリメントループしていく
3_1_1.パス「pathItems[k]」のfillColorを取得させ希望の数値のものを条件作成(if等)してパス削除
リストのインデントが下がってるものはループ内処理です。
i,j,k はループのカウンタ変数です。
これで伝わりますか。。。?
リンクをクリップボードにコピー
コピー完了
教えていただきありがとうございます!伝わりました!
グループ内のpageItems内でループして、typenameがPathItemだったら・・みたいな条件作成でしていましたが、普通にpathItemsとcompoundPathItemsそれぞれでループしたらよかったのですね。
遠回りしていました・・・!
それで再度作ってみます。わざわざありがとうございました!