木曜日, 6月 05, 2025

カメラ用自作の覗き穴フィルターは加工次第で可能性大

カメラ用自作の覗きフィルターは加工次第で可能性が広がります。

クリアフォルラーをカットして、穴を開けただけです。

ここで、むかし活用していたゼラチンフィルターを挟むフォルダーを使えば・・・と思ったら、内側のモール(スポンジ)が劣化していて張り替えしないと使えないので、今回は撮影に影響のない位置にセロテープで留めました。

自作フィルターなしの状態

センター位置に穴が来るように設定した結果。

右端に穴が来るように設定した結果。
地麻美に絞り値を変更してもそれほど効果は変わりませんでした。

TCDW8423
超広角は13mm、2倍は48mm(昔の標準)

数年前からiPhoneでも積極的に写真を撮るようになったのですが、撮り始めると違和感がほとんど無いのです。そして、その理由が判明しました。iPhoneの標準画角は24mmなのです。私は学生のときは24mmが好きで多用していました。だから親近感があったのかもしれません。ちなみに超広角は13mm、2倍は48mm(ほぼ昔の標準)、3倍で72mm(昔の中望遠)だそうです。 

水曜日, 6月 04, 2025

Excelで関数リストにないDATEDIF関数

日数を計算するDATEIF関数は、なぜか関数リストにない関数です。よって、手入力しなけらばなりません。以下の追加情報です。


構造は・・・

=DATEIF(開始日 , 終了日 , 単位)
・開始日 : 日数を数え始める日を指定する
・終了日 : 日数を数え終える日を指定する
・単 位 : 求めた日数の表示形式を " " で囲んで指定する

というコトで具体的なサンプルを作りました。
C2:期間内の年数(満たしている年数)
D2:1年未満の月数(年数表示での端数の月数)
E2:1年未満の日数(年数表示での端数の日数)
F2:1か月未満の日数(月数表示での端数の日数)
G2:期間内の月数(満たしている月数)
H2:期間内の日数

※執筆日は2005年4月10日

C2〜H2に以下の記述を行います。

C2:=DATEDIF(B2,TODAY(),"y")
D2:=DATEDIF(B2,TODAY(),"ym")
E2:=DATEDIF(B2,TODAY(),"yd")
F2:=DATEDIF(B2,TODAY(),"md")
G2:=DATEDIF(B2,TODAY(),"m")
H2:=DATEDIF(B2,TODAY(),"d")

TCDW8422
とんでもない行数になるので今回はパス

Baby Alien 090
可愛いぷっちょ系〜(^o^)
「ぷっちょ」以外に、ついつい食べ過ぎてしまうのが「ギンビスアスパラガス」と「草加煎餅」(^o^)。いやもっとあるのですが・・・とんでもない行数になるので今回はパス(^o^)

火曜日, 6月 03, 2025

JavaScriptでAI遊び 49 
Illustratorで集中線を描画

Illustratorで集中線を描画してみました。

// 集中線を作成するIllustratorスクリプト
function createSpeedLines() {
if (app.documents.length == 0) {
alert("ドキュメントが開かれていません。");
return;
}

var doc = app.activeDocument;
var artboard =
        doc.artboards[doc.artboards.getActiveArtboardIndex()];
var abBounds = artboard.artboardRect;
// アートボード中心座標
var centerX = (abBounds[0] + abBounds[2]) / 2;
var centerY = (abBounds[1] + abBounds[3]) / 2;

// ユーザー入力
var lineCount =
        parseInt(prompt("線の本数を入力:", "100"), 10);
if (isNaN(lineCount) || lineCount < 1) return;

var minLength =
        parseFloat(prompt("線の最小長さ (mm):", "50"));
var maxLength =
        parseFloat(prompt("線の最大長さ (mm):", "200"));
if (isNaN(minLength) || isNaN(maxLength) ||
        minLength >= maxLength) return;

var strokeWidth = parseFloat(prompt("線の太さ (pt):", "1"));
if (isNaN(strokeWidth) || strokeWidth <= 0) return;

var group = doc.groupItems.add(); // まとめるためのグループ

for (var i = 0; i < lineCount; i++) {
var angle = Math.random() * 360; // 0°〜360°のランダムな角度
var length = minLength + Math.random() *
            (maxLength - minLength); // ランダムな長さ

// 角度をラジアンに変換
var rad = angle * (Math.PI / 180);
// 終点の座標を計算
var endX = centerX + Math.cos(rad) * length;
var endY = centerY + Math.sin(rad) * length;
// 線を作成
var line = doc.pathItems.add();
line.setEntirePath([[centerX, centerY], [endX, endY]]);
line.stroked = true;
line.strokeWidth = strokeWidth;
line.filled = false;

line.move(group, ElementPlacement.PLACEATEND);
}

alert("集中線を作成しました!");
}

createSpeedLines();

実行して、各パラメーターの値を入力すれば描画が実行されます。

デフォルト設定の処理結果です。


ここで右上のようなオブジェをアートブラシ登録し・・・

作成した集中線に指定すれば上のようなイメージを簡単に作成出来ます。

TCDW8421
小さな文具店が出来そうかもしれない状況に苦笑い

ふと冷静になって考えてみると・・・どうして筆記用具は増え続けるのだろうか? 下手をすると小さな文具店が出来そうかもしれない状況に苦笑い。私だけ?

月曜日, 6月 02, 2025

Let's start JavaScript 69 
HTML上で入力テキストを音声変換

HTML上で入力テキストを音声変換します。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<title>テキスト読み上げ</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin: 10px;
background-color: mediumseagreen;
color: white;
}
textarea {
direction: ltr;
text-align: left;
}
</style>
</head>
<body>
<h3>テキスト読み上げ</h3>
<textarea id="userText" rows="8" cols="55"></textarea><br>
<!-- textarea に入力されたテキストを読み上げ -->
<label>速 度: <input type="range" id="rate" min="0.5"
max="2" step="0.1" value="1"></label><br>
<label>音 程: <input type="range" id="pitch" min="0.5"
max="2" step="0.1" value="1"></label><br>
<label>音 量: <input type="range" id="volume"
min="0" max="1" step="0.1" value="1"></label><br>
<!-- rate (速度): 0.5(遅い)~ 2.0(速い)
pitch (音程): 0.5(低い)~ 2.0(高い)
volume (音量): 0.0(ミュート)~ 1.0(最大)-->

<label>声を選択:
<select id="voiceSelect"></select></label><br><br>

<button onclick="speakText()">▶ 読み上げ</button>&nbsp;
<button onclick="pauseSpeech()">⏸ 一時停止</button>&nbsp;
<button onclick="resumeSpeech()">▶ 再  開</button>&nbsp;
<button onclick="stopSpeech()">⏹ 停  止</button>

<script>
let voices = [];
let utterance = new SpeechSynthesisUtterance();

// 音声リストを取得してドロップダウンに追加
// speechSynthesis.getVoices(); を使い、
// ブラウザが提供する音声リストを取得
// option を生成して <select> に追加
function loadVoices() {
voices = speechSynthesis.getVoices();
let voiceSelect = document.getElementById("voiceSelect");

voiceSelect.innerHTML = "";
voices.forEach((voice, index) => {
let option = document.createElement("option");
option.value = index;
option.textContent = `${voice.name} (${voice.lang})`;
voiceSelect.appendChild(option);
});
}

// 開始 (speakText()) → speechSynthesis.speak(utterance);
function speakText() {
if (speechSynthesis.speaking) {
speechSynthesis.cancel(); // 連続読み上げ防止
}
utterance.text =
                document.getElementById("userText").value;
utterance.rate =
                document.getElementById("rate").value; // 速度
utterance.pitch =
                document.getElementById("pitch").value; // 声の高さ
utterance.volume =
                document.getElementById("volume").value; // 音量
let selectedVoice =
                voices[document.getElementById("voiceSelect").value];
if (selectedVoice) {
utterance.voice = selectedVoice;
}

speechSynthesis.speak(utterance);
}

// 一時停止 (pauseSpeech()) → speechSynthesis.pause();
function pauseSpeech() {
speechSynthesis.pause(); // 一時停止
}

// 再開 (resumeSpeech()) → speechSynthesis.resume();
function resumeSpeech() {
speechSynthesis.resume(); // 再開
}

// 停止 (stopSpeech()) → speechSynthesis.cancel();
function stopSpeech() {
speechSynthesis.cancel(); // 停止
}

// 音声データがロードされたときに実行
speechSynthesis.onvoiceschanged = loadVoices;
</script>
</body>
</html>

表示直後の状態

テキストを入力して[▶読み上げ]で読み上げてくれます。

TCDW8420
効果って限りなく皆無に近いと思うのですが・・・

間違った情報を元に昨年末から届くDMにウンザリ。まっ、すぐ廃棄しちゃうので、どうでもいい話しなのです。そもそも、投げ込みチラシの効果って限りなく皆無に近いと思うのですが・・・。

日曜日, 6月 01, 2025

Photoshopでのマスキング処理はレイヤーマスクと大胆さ

質問がありましたあので・・・
Photoshopでのマスキング処理はレイヤーマスクと大胆さがキモです。

サンプル画像のデニム地の色を赤に変更する想定で説明します。

上に新規レイヤーを描画モード[ソフトライト]で作成して求める色で塗り潰します。

こんな感じです。

ここでレイヤーマッスクを作成して、ザックリとマスクを作成します。

この段階で細部は見死します。

次に元画像をスマートオブジェクトに変更します。

これで影になっている部分の可視を高めるためにレベル補正で明るめに調整します。スマートオブジェクトなので、いつでも修正あるいは変更しても元画像はいつでも元に戻せます。

処理後のイメージです。これで細部の状態が解りやすくなります。

後は細部調整です。

上は処理後の状態です。

ちなみにブラシの硬さを適宜調整します。最初のザックリ処理の時は硬さ[100] 、細部の曖昧な部分はブラシサイズを小さめにして硬さ[0]で乗り切ります。

処理が完了したら,レベル補正のチェックを外すだけで元のイメージになります。

取りあえずの完成イメージです。

TCDW8419
私は落ちていない〜と思っていたら・・・

カメラ好きはレンズ沼に落ちると言うお約束ですが、私は落ちていない〜と思っていたら・・・35本あり、完全に沼っていました(^o^)汗