クリエイター手抜きプロジェクト[645]Adobe Photoshop CS3〜2021編 選択範囲内に含まれるレイヤーをすべて選択
── 古籏一浩 ──

投稿:  著者:



今回は、Photoshopのスクリプトです。元々は依頼されたものなのですが、掲載してもOKということで、主要な機能だけをピックアップしました。

スクリプトの機能は、矩形範囲を選択してから実行すると、その選択範囲内にあるレイヤーを選択状態にするというものです。レイヤーセット内にレイヤーがあっても機能します。ただ、Photoshopの制約により若干の注意事項があります。

(1)実行前にはレイヤーの選択をすべて解除してください
  逆に現在のレイヤー選択に追加したい場合は、そのまま実行すればOKです。

(2)同じ名前のレイヤーをつけないでください
  これはScripting Listenerで記録したスクリプトの都合によるものです。
  同名のレイヤー名があると、いずれか一つしか選択されません。

実際のスクリプトは、以下のようになります。テキストエディタ等で保存し、Photoshopのファイルメニュー>スクリプト>参照...で、保存したファイルを選択してください。





// 矩形選択された範囲内にある完全内包されているレイヤーを選択 Photoshop版
// 注意:レイヤーはすべて非選択にしてから実行してください
(function (){
var selObj = app.activeDocument.selection;
try{
var gb = selObj.bounds;
}catch(e){
alert("範囲を選択して下さい");
return;
}
var x1 = gb[0]|0; // 単位削除
var y1 = gb[1]|0;
var x2 = gb[2]|0;
var y2 = gb[3]|0;
// 範囲内にレイヤーがあるか調べる
checkLayerSet(app.activeDocument);

// レイヤーセット内を再起処理でチェック
function checkLayerSet(baseLayer){
// 内包されてる全てのレイヤーを調べる
var layObj = baseLayer.layers;
for(var i=0; i<layObj.length; i++){
var gb = layObj[i].bounds;
var lx1 = gb[0]|0;
var ly1 = gb[1]|0;
var lx2 = gb[2]|0;
var ly2 = gb[3]|0;
if ((lx1>=x1) && (ly1>=y1) && (lx2<=x2) && (ly2 <=y2)){
selectLayer(layObj[i].name);
}
}
var laySetObj = baseLayer.layerSets;
for(var i=0; i<laySetObj.length; i++){
checkLayerSet(laySetObj[i]);
}
}

// 指定されたレイヤーを選択(Scripting Listenerで生成したコード)
function selectLayer(LayName){
var idslct = charIDToTypeID( "slct" );
var desc = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref = new ActionReference();
ref.putName( charIDToTypeID( "Lyr " ), LayName);
desc.putReference( idnull, ref );
var idselectionModifier = stringIDToTypeID( "selectionModifier" );
var idselectionModifierType = stringIDToTypeID( "selectionModifierType" );
var idaddToSelection = stringIDToTypeID( "addToSelection" );
desc.putEnumerated( idselectionModifier, idselectionModifierType, idaddToSelection );
var idMkVs = charIDToTypeID( "MkVs" );
desc.putBoolean( idMkVs, false );
executeAction( idslct, desc, DialogModes.NO );
}
})();

上記のスクリプトは、選択範囲内に完全内包されているレイヤーが選択されますが、レイヤーの左上だけが含まれていればよいのであれば、以下のようにスクリプトを変更してください。

if ((lx1>=x1) && (ly1>=y1) && (lx2<=x2) && (ly2 <=y2)){
 ↓
if ((lx1>=x1) && (ly1>=y1) && (lx1<=x2) && (ly1 <=y2)){

また、完全内包されていないレイヤーを選択する場合は、以下のように変更してください。

if ((lx1>=x1) && (ly1>=y1) && (lx2<=x2) && (ly2 <=y2)){
 ↓
if ((lx1<x1) || (ly1<y1) || (lx2>x2) || (ly2>y2)){

上記に関連した補助的なスクリプトもついでに。以下のスクリプトは、アクティブになっているレイヤー(ひとつだけ)を矩形で選択します。

レイヤーに余計なピクセルがあるかどうかなど、チェックする場合に使えるかもしれません。また、レイヤーに枠をつけたい場合とか、文字の下にマット(映像系だと座布団)を作成する場合にも使えるかもしれません。

// アクティレイヤー(ひとつだけ)を矩形範囲選択
(function (){
var layObj = app.activeDocument.activeLayer;
var gb = layObj.bounds;
var x1 = gb[0]|0;
var y1 = gb[1]|0;
var x2 = gb[2]|0;
var y2 = gb[3]|0;
var rect = [[x1,y1],[x2,y1],[x2,y2],[x1,y2],[x1,y1]];
app.activeDocument.selection.select(rect);
})();

なお、複数選択されたレイヤーに対して処理したい場合は、以下のページを参考にして作ってみてください。というか、標準で複数選択されたレイヤーを取得できれば、何の問題もないのですが(最新のPhotoshopのリファレンスはチェックしてないので、もしかしたら最新版ではできるのかも……)。

https://qiita.com/k-wth/items/0268a106de993e777c24

http://nakatoji.lolipop.jp/index.php/extendscript/photoshop/ps-layer/449-2015-05-15-19-07-67


アクティブレイヤーではなく、すべてのレイヤーで矩形選択して、それらをまとめてひとつの選択範囲にしたい場合は、以下のスクリプトを使ってください。

// すべてのレイヤーを矩形範囲選択(追加)
(function (){
var layObj = app.activeDocument.layers;
for(var i=0; i<layObj.length; i++){
if(layObj[i].isBackgroundLayer){ continue; }
var gb = layObj[i].bounds;
var x1 = gb[0]|0;
var y1 = gb[1]|0;
var x2 = gb[2]|0;
var y2 = gb[3]|0;
var rect = [[x1,y1],[x2,y1],[x2,y2],[x1,y2],[x1,y1]];
app.activeDocument.selection.select(rect,SelectionType.EXTEND);
}
})();


【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/


8K/24fpsの映像をGalaxy S20で撮影していたら、どうも5分を超える映像は撮影しないでください、という警告が画面に表示されました。でも、5分でいきなり撮影が中断してしまうわけではなく、継続して撮影は可能。でも、発熱の関係でよろしくないらしい。

Galaxy S20は悪くはないんですが、可能ならファームウェア・ソフトウェアのアップデートで、高画質で録画できるようにしてほしいところ。要するに高ビットレートで撮影したいということです。

今のGalaxy S20のビットレートだと、8K映像らしく撮影するには80%を真っ青な空とか、なるべく単色でブロック圧縮しやすいものを、画面内に入れないといけません(H.265(HEVC)だとH.264の縦横2倍のサイズ最大64x64ブロックで圧縮できる)。

また、24fpsなので速く動くものには向いてないというのもあります。録画時間制約あっても高画質30fpsで撮影するモードが欲しいところ。

でも、まあそれよりも次のiPhoneが8K/30fps撮影できないと、買い換えもできない状態。本当はスマホをiPhone一台にまとめたいけど、スペック不足すぎてどうしようもありません。

それと撮影した8K映像をYouTubeにアップしてみたものの、8Kサイズで表示できるようになるまでの処理が結構長い。まあ、8Kだから仕方ないと言えば仕方ないけど、もうちょっと速く処理して欲しいところ。

●長野県塩尻市








●長野県松本市 北アルプスと街の遠景





・創って学ぼうプログラミング
https://news.mynavi.jp/series/makeprogram


・8K/4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/


・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/