月曜日, 11月 10, 2025

JavaScriptでAI遊び 79 
Illustratorでオブジェクトの色をランダム変更(CMYK)


選択したオブジェクトの色を変更]のアップデート版。複数オブジェクトに対応。ただし、パターやグラデーションには未対応です。CMYK版ですがRGBでも利用出来ます。


// 選択したオブジェクトの塗りカラーをランダムに変更CMYK版
(function () {
if (app.documents.length === 0) {
alert("ドキュメントを開いてください");
return;
}
var doc = app.activeDocument;
if (doc.selection.length === 0) {
alert("オブジェクトを選択してください");
return;
}

var sel = doc.selection;
var count = 0;

for (var i = 0; i < sel.length; i++) {
var obj = sel[i];

// パスやシェイプのみ対象
if (obj.typename === "PathItem" ||
            obj.typename === "CompoundPathItem" ||
            obj.typename === "TextFrame") {
var color = new CMYKColor();
color.cyan = Math.random() * 100;
color.magenta = Math.random() * 100;
color.yellow = Math.random() * 100;
color.black = 0;

try {
obj.fillColor = color; // 塗り色変更
count++;
} catch (e) {
// テキストや特殊オブジェクトで塗りがない場合はスキップ
}
}
}

alert(count + " 個のオブジェクトのカラーをランダムに変更しました");
})();

変更したいオブジェクトのグループを解除して実行します。

直ぐに[何色変更]したのかを表示して結果を確認できます。

結果に対して更に実行した結果です。

TCDW8581 
もしかして部屋に巨大な蚊でもいたのかな

Baby Alien 163
キュートな横綱系(^o^)
いつの間にか?おでこに蚊に刺されたような痕。しかし、直径20mmも有るのでチョット外出が恥ずかしい。もしかして部屋に巨大な蚊でもいたのかな〜。

日曜日, 11月 09, 2025

Illustratorでの作図基本 30 
ブラシはグリッドにスナップしない

出来るとお勘違い(※)していましたが・・・
ブラシツールははグリッドにスナップしません。グリッドにスナップ出来るのはペンツールとシェープツールだけです。ただし、擬似的な処理は可能です。最も、わざわざ使う意味は薄いです。個人的にはペンタブレットを使っているのでスナップ機能をオンオフ出来ると嬉しいです。

※色々なツールを使っていて脳内混乱していました(>_<)

細めにブラシを設定し・・・

描くとき・・・
表示メニューの[グリッドを表示]、[グリッドにスナップ]、[スマートガイド]にチェックが入れてShiftキーを併用して描いても上の様な感じになります。ただし正確さは期待できません。

それでも上の様に、もう少し正確に描画したい場合は・・・

1本ずつカーソルを上げ下げして描きます。

それでも正確さは期待できません。shaperツールも思うようにスナップは期待できません。

TCDW8580 
所用の帰りに時間ができたので速攻で向かったら

お目当てのお菓子を買いに、所用の帰りに時間ができたので速攻で向かったら定休日でした。悔しさマックス。チョット立ち直れないかも(>_<)

土曜日, 11月 08, 2025

Let's start JavaScript 86 
HTML上でファイル名を差し替え


HTML上で指定した2つのファイルのファイル名を指し変えます。HTML/JavaScript だけではローカルファイルを直接リネーム不可なので、変更後のファイルはダウンロードフォルダーにコピーします。

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>ファイル名(拡張子を除く部分)
を入れ替えてダウンロード</title>
<meta name="viewport" content=
    "width=device-width,initial-scale=1" />
<style>
body {
font-family: system-ui, -apple-system,
            "Segoe UI", Roboto,
            "Hiragino Kaku Gothic ProN",
            "メイリオ", sans-serif;
padding:20px;
background: black;
color: white;
}
label {
display:block;
margin:10px 0 6px;
}
.files {
margin-bottom: 12px;
}
.btn {
margin-top: 12px;
padding: 4px 12px;
background: khaki;
}
#log {
margin-top: 12px;
white-space:pre-wrap;
color:white;
}
</style>
</head>
<body>
<h3>2つのファイルの拡張子を除く名前部分を
入れ替えてダウンロード</h3>

<div class="files">
<label>ファイルAを選択</label>
<input id="fileA" type="file" />
<div id="nameA"></div>
</div>

<div class="files">
<label>ファイルBを選択</label>
<input id="fileB" type="file" />
<div id="nameB"></div>
</div>

<button id="swapBtn" class="btn">
    ファイル名を入れ替えてダウンロード</button>

<div id="log"></div>

<script>
(function () {
const fileAInput = document.getElementById('fileA');
const fileBInput = document.getElementById('fileB');
const nameA = document.getElementById('nameA');
const nameB = document.getElementById('nameB');
const swapBtn = document.getElementById('swapBtn');
const log = document.getElementById('log');

function showFileName(el, file) {
if (!file) { el.textContent = ''; return; }
el.textContent = `${file.name} (${file.type ||
     'unknown'}, ${file.size} bytes)`;
}

fileAInput.addEventListener('change', () =>
    showFileName(nameA, fileAInput.files[0]));
fileBInput.addEventListener('change', () =>
    showFileName(nameB, fileBInput.files[0]));

function splitBaseAndExt(filename) {
const i = filename.lastIndexOf('.');
if (i <= 0) { // ドットがないか先頭にある場合は拡張子なし扱い
return { base: filename, ext: '' };
}
return { base: filename.slice(0, i), ext: filename.slice(i) };
    // extにドット含む
}

function downloadBlob(blob, filename) {
const a = document.createElement('a');
const url = URL.createObjectURL(blob);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(() => {
URL.revokeObjectURL(url);
document.body.removeChild(a);
}, 1000);
}

swapBtn.addEventListener('click', async () => {
log.textContent = '';
const fA = fileAInput.files[0];
const fB = fileBInput.files[0];

if (!fA || !fB) {
log.textContent = '両方のファイルを選択してください。';
return;
}

// 同一ファイル選択の防止(同じFileオブジェクトなら中身は同じ)
if (fA === fB) {
log.textContent =
'同じファイルが選ばれています。別々のファイルを選択してください。';
return;
}

// base / ext を分割
const sa = splitBaseAndExt(fA.name);
const sb = splitBaseAndExt(fB.name);

// 新しい名前:ベースを入れ替え、拡張子は元のファイルごとに保持
const newNameA = sb.base + sa.ext;
// fileAの拡張子はそのまま、baseはBのもの
const newNameB = sa.base + sb.ext;

log.textContent = `新しいダウンロード名:
\n- ファイルA → ${newNameA}
\n- ファイルB → ${newNameB}
\n\nダウンロードが開始されます。
(ブラウザにより自動ダウンロードがブロックされる場合があります)`;

try {
// ファイルの内容をそのまま Blob としてダウンロード
// (MIMEタイプは元の file.type を使用)
// ここでは File をそのまま使えるので blob化は不要だが
// download のためにそのまま使う
// いったん arrayBuffer を取って Blob を生成しても可。
// ここでは直接 File を渡す。
downloadBlob(fA, newNameA);
// 少し遅らせて2つ目をダウンロード
// (同時クリックでブロックされるブラウザがあるため)
setTimeout(() => downloadBlob(fB, newNameB), 200);
} catch (err) {
log.textContent += '\nエラー: ' + err;
}
});
})();
</script>
</body>
</html>

実行したら、処理したいファイルを選択します。

次に[ファイル名を入れ替えてダウンロード]をクリックすれば・・・

[許可]をクリックすれば、ダウンロードに変更後のコピーを保存します。


元データ
差し替え後

TCDW8579 
その手で髪を慣らして出て行くオジサンに遭遇

某ショッピングモールのトイレで左手にシンクの水を少しだけつけて,その手で髪を慣らして出て行くオジサンに遭遇。何もしないで出て行く人よりはマシ? しかし、オジサンの頭部は危険ですね(>_<)

金曜日, 11月 07, 2025

Illustratorの遠近グリッドの使い方

質問がありましたので・・・
Illustratorの遠近グリッドの使い方を整理してみました。

以下も参照してください。


例えば室内にワードロープと壁には窓という状態を想定してみます。ワードロープは、総サイズの矩形を用意します。

ツールボックスから遠近グリッドツールを選択し・・・

遠近図形選択ツールに切り換え、作業面をオレンジ色に設定して窓を摘まむとパースに沿って変形します。このとき[5]キーを併用すると奥行きの移動が可能になります。

続けて作業面を青色に切り換え、ワードロープのパースを調整します。

ここで、ワードロープと同サイズの矩形を選択してワードロープと同じ位置に配置し・・・

[5]キーを併用してワードロープよりも置くに移動します。コレがワードロープの厚みになります。

ここで[表示]>[遠近グリッド]>[グリッドを隠す]で通常編集モードに戻ってからワードロープの背面に配置した矩形をダイレクト選択ツールでワードロープの厚みになるように調整します。

調整後の状態です。コレで立体感が生まれました。

窓のサイズを調整してから・・・

任意の矩形を作成し・・・

ツールボックスから遠近グリッドツールを選択し、作業面を緑色に切り換えて床部分を作成します。

床部分がでたら、alt(option)キーを併用して移送して複製を作成し、天井面を演出します。

最後に[表示]>[遠近グリッド]>[グリッドを隠す]で通常編集モードに戻ってから壁面を矩形ツールで追加し、カラーリングをすれば室内が完成します。

TCDW8578 
あって当たり前は空気と水と言われていますが

気がつけば11月。先月は月始めからレジストラダウン騒動に振り回されて散々でした。一応10月末には復活しましたが・・・まだ色々と・・・。あって当たり前は空気と水と言われていますが、ネットも入りますね(>_<)

木曜日, 11月 06, 2025

Vectorpea Basic Operation 03 
整列処理は手動でグループ移動はControlキー併用

まだβ版なので色々気になるところはありますが、一番気になるのは[整列処理]処理が出来ないことです。その場合の対処方法はグループ化とガイドラインですね。

シンメトリーのキャラクタで説明します。まず各パーツをグループ化させます。

次に[表示]>[定規]でルーラー(※)を作成します、ショートカットキーはIllustratorと同じです。

※Control R(macOSの場合はCommand R)でルーラー表示させ、ルーラーの任意の位置をマウスプレスしてドラッグすることでガイドラインを表示で来ます。

ここでグループを選択しControl(※)キーを併用して移動させます。

※macOSの場合はCommandキー

グループの中心点をガイドに合わせれば完成です。

同じように他の部分を処理します。

処理後のイメージです。

微修正を行った最終状態です。

データ保存は[ファイル]>[保存 その他]または[別名で保存]で処理します。

[保存 その他]は保存場所を指定します。なお、VectorpeaはIllustratorのaiファイルの読み書きが出来ます。
Ai形式での書き出しは[ファイル]>[Save as AI]。なお、SVG形式などでもIllustratorにデータを渡す事が出来ます。

TCDW8577 
北海道のクマ牧場にも行きたいです(^o^)

Baby Alien 162
ベタにクマさん系(^o^)
うちにはクマ人形やグッズが沢山有りますが、可愛いクマのグッズを見ると素通りできないです。北海道のクマ牧場にも行きたいです(^o^)

水曜日, 11月 05, 2025

HTMLとCSSの様々な表現 24 
エンドレスでシームレスに画像を流す

エンドレスでシームレスに画像を流してみます。
ここでは幅1920px、高さ360pxの画像を元に処理してみました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<style>
body {
margin: 0;
overflow: hidden;
background: #fff;
}

/* 表示領域 */
.wrapper {
width: 1920px;
/* 1枚分の幅
表示枠(1920×360px)=1枚分のサイズ*/
height: 360px;
overflow: hidden;
/*position: relative;*/
margin: 0 auto;
position: absolute;
top:0;
}

/* スライダー全体
画像を4枚並べて「1→2→1→2」の順に配置*/
.slider {
display: flex;
width: 7680px;
/* (1920px × 4枚) →
image1, image2, image1, image2 */
animation: scroll 20s linear infinite;
/*一定速度で無限ループ、途切れのない動き*/
}

/* 各画像 */
.slider img {
width: 1920px;
height: 300px;
object-fit: cover;
}

/* アニメーション(左方向へ) */
@keyframes scroll {
0% {
transform: translateX(0);
}

100% {
transform: translateX(-3840px);
/* 全体の半分を動かす
translateX(-3840px) で2枚分(全体の半分)だけ動かす*/
}
}

/* アニメーション(右方向へ) */
/* @keyframes scroll {
0% {
transform: translateX(-3840px);
}

100% {
transform: translateX(0);
}
}*/

</style>
</head>
<body>
<div class="wrapper">
<div class="slider">
<img src="pic/image1.jpg" alt="">
<img src="pic/image2.jpg" alt="">
<img src="pic/image1.jpg" alt="">
<img src="pic/image2.jpg" alt="">
</div>
</div>
</body>
</html>


picフォルダーにimage1.jpg、image2.jpgを用意します。2つのファイルは同じ物ですが、両端はシームレスに繋がるように作成しています。

TCDW8576 
例の「8番出口」のイメージの影響かな?(^o^)

気まぐれで、一度も利用していない地下鉄の出口を利用したら、地上に行き着くまで妙に緊張してしまいました。人が少ないし、例の「8番出口」のイメージの影響かな?(^o^)

火曜日, 11月 04, 2025

JavaScriptでAI遊び 78 
Illustratorでオブジェクトの色をランダム変更(RGB)

選択したオブジェクトの色を変更]のアップデート版。複数オブジェクトに対応。ただし、パターやグラデーションには未対応です。RGB版ですがCMYKでも利用出来ます。


// 選択したオブジェクトの塗りカラーをランダムに変更RGB版
(function () {
if (app.documents.length === 0) {
alert("ドキュメントを開いてください");
return;
}
var doc = app.activeDocument;
if (doc.selection.length === 0) {
alert("オブジェクトを選択してください");
return;
}

var sel = doc.selection;
var count = 0;

for (var i = 0; i < sel.length; i++) {
var obj = sel[i];

// パスやシェイプのみ対象
if (obj.typename === "PathItem" ||
            obj.typename === "CompoundPathItem" ||
            obj.typename === "TextFrame") {
var color = new RGBColor();
color.red = Math.random() * 255;
color.green = Math.random() * 255;
color.blue = Math.random() * 255;

try {
obj.fillColor = color; // 塗り色変更
count++;
} catch (e) {
// テキストや特殊オブジェクトで塗りがない場合はスキップ
}
}
}

alert(count + " 個のオブジェクトのカラーをランダムに変更しました");
})();

変更したいオブジェクトのグループを解除して実行します。

直ぐに[何色変更]したのかを表示して結果を確認できます。

結果に対して更に実行した結果です。