2024/06/26

天体写真撮影用 露光時間計算アプリ

天体写真を撮る時に被写体やピント、露光時間等の確認のため、まずは超高感度で絞り開放にするなどをしてテスト撮影の時間を短縮することがあります。

本番撮影時はノイズを減らすため感度を落とし、収差も減らすため絞りも絞るなどをする場合、テストで撮ったデータから感度や絞りの変動分を加味して露光時間を決めなければなりません。

そういったことをチャチャっと計算するwebアプリを作りました。

直接URLを開いて使うことができますし、JavaScriptなのでローカルに保存してからwebブラウザで使用することもできます。

HTMLは任意のファイル名.html、JavaScriptファイル名はLongTimeExposure.jsにしてhtmlと同一階層に保存すればそのまま動きます。


露光時間計算アプリ

https://www.renachan.com/script/LongTimeExposure.html


テスト撮影のISO感度、絞り、露光時間を入力して、本番で撮影したいISO感度、絞りを決定すれば、自動的に露光時間が表示されます。

本番撮影のISO感度とf値はローカルストレージに保存されますので、次回からは同じ条件がデフォルトでセットされます。



HTML

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>露光時間計算アプリ</title>
<script src="LongTimeExposure.js" defer></script>
<style>
body {
background-color: #000;
color: #aaa;
font-family: Arial, sans-serif;
padding: 20px 20px 20px 30px;
}
h2 {
color: #aaa;
margin-bottom: 10px;
}
select {
width: 150px;
padding: 5px;
font-size: 16px;
}
#ss2, #ss2min {
color: #cf0000;
font-weight: bold;
font-size: 2rem;
}
label, select {
display: block;
width: 100%;
max-width: 6rem;
}
select {
width: calc(100% - 10px);
padding: 5px;
font-size: 1rem;
background-color: #555;
color: #eee;
}
</style>
</head>
<body>
<h2>Initial Capture Data</h2>
<label for="iso1">ISO:</label>
<select id="iso1">
<option value="50">50</option>
<option value="64">64</option>
<option value="80">80</option>
<option value="100">100</option>
<option value="125">125</option>
<option value="160">160</option>
<option value="200">200</option>
<option value="250">250</option>
<option value="320">320</option>
<option value="400">400</option>
<option value="500">500</option>
<option value="640">640</option>
<option value="800">800</option>
<option value="1000">1000</option>
<option value="1250">1250</option>
<option value="1600">1600</option>
<option value="2000">2000</option>
<option value="2500">2500</option>
<option value="3200">3200</option>
<option value="4000">4000</option>
<option value="5000">5000</option>
<option value="6400" selected>6400</option>
<option value="8000">8000</option>
<option value="10000">10000</option>
<option value="12800">12800</option>
<option value="16000">16000</option>
<option value="20000">20000</option>
<option value="25600">25600</option>
<option value="32000">32000</option>
<option value="40000">40000</option>
<option value="51200">51200</option>
</select><br>
<label for="f1">f:</label>
<select id="f1">
<option value="1.0">1.0</option>
<option value="1.1">1.1</option>
<option value="1.2">1.2</option>
<option value="1.4">1.4</option>
<option value="1.6">1.6</option>
<option value="1.8">1.8</option>
<option value="2.0">2.0</option>
<option value="2.2">2.2</option>
<option value="2.5">2.5</option>
<option value="2.8" selected>2.8</option>
<option value="3.2">3.2</option>
<option value="3.5">3.5</option>
<option value="4.0">4.0</option>
<option value="4.5">4.5</option>
<option value="5.0">5.0</option>
<option value="5.6">5.6</option>
<option value="6.3">6.3</option>
<option value="7.1">7.1</option>
<option value="8.0">8.0</option>
<option value="9.0">9.0</option>
<option value="10.0">10.0</option>
<option value="11.0">11.0</option>
<option value="13.0">13.0</option>
<option value="14.0">14.0</option>
<option value="16.0">16.0</option>
<option value="18.0">18.0</option>
<option value="20.0">20.0</option>
<option value="22.0">22.0</option>
</select><br>
<label for="ss1">SS:</label>
<select id="ss1">
<option value="1">1s</option>
<option value="1.3">1.3s</option>
<option value="1.6">1.6s</option>
<option value="2">2s</option>
<option value="2.5">2.5s</option>
<option value="3.2">3.2s</option>
<option value="4">4s</option>
<option value="5">5s</option>
<option value="6">6s</option>
<option value="8" selected>8s</option>
<option value="10">10s</option>
<option value="13">13s</option>
<option value="15">15s</option>
<option value="20">20s</option>
<option value="25">25s</option>
<option value="30">30s</option>
<option value="40">40s</option>
<option value="50">50s</option>
<option value="60">60s</option>
</select><br>

<h2>Final Capture Data</h2>
<label for="iso2">ISO:</label>
<select id="iso2">
<option value="50">50</option>
<option value="64">64</option>
<option value="80">80</option>
<option value="100">100</option>
<option value="125">125</option>
<option value="160">160</option>
<option value="200">200</option>
<option value="250">250</option>
<option value="320">320</option>
<option value="400">400</option>
<option value="500">500</option>
<option value="640">640</option>
<option value="800">800</option>
<option value="1000">1000</option>
<option value="1250">1250</option>
<option value="1600" selected>1600</option>
<option value="2000">2000</option>
<option value="2500">2500</option>
<option value="3200">3200</option>
<option value="4000">4000</option>
<option value="5000">5000</option>
<option value="6400">6400</option>
<option value="8000">8000</option>
<option value="10000">10000</option>
<option value="12800">12800</option>
<option value="16000">16000</option>
<option value="20000">20000</option>
<option value="25600">25600</option>
<option value="32000">32000</option>
<option value="40000">40000</option>
<option value="51200">51200</option>
</select><br>
<label for="f2">f:</label>
<select id="f2">
<option value="1.0">1.0</option>
<option value="1.1">1.1</option>
<option value="1.2">1.2</option>
<option value="1.4">1.4</option>
<option value="1.6">1.6</option>
<option value="1.8">1.8</option>
<option value="2.0">2.0</option>
<option value="2.2">2.2</option>
<option value="2.5">2.5</option>
<option value="2.8">2.8</option>
<option value="3.2">3.2</option>
<option value="3.5">3.5</option>
<option value="4.0" selected>4.0</option>
<option value="4.5">4.5</option>
<option value="5.0">5.0</option>
<option value="5.6">5.6</option>
<option value="6.3">6.3</option>
<option value="7.1">7.1</option>
<option value="8.0">8.0</option>
<option value="9.0">9.0</option>
<option value="10.0">10.0</option>
<option value="11.0">11.0</option>
<option value="13.0">13.0</option>
<option value="14.0">14.0</option>
<option value="16.0">16.0</option>
<option value="18.0">18.0</option>
<option value="20.0">20.0</option>
<option value="22.0">22.0</option>
</select><br>
<label for="ss2">SS:</label>
<div id="ss2">-- s</div>
<div id="ss2min">-- m -- s</div><br>
</body>
</html>

JavaScript

function calculateAndDisplay() {
// 仮撮影データの値を取得
let iso1 = parseFloat(document.getElementById('iso1').value);
let f1 = parseFloat(document.getElementById('f1').value);
let ss1 = parseFloat(document.getElementById('ss1').value);

// 本番データの値を取得
let iso2 = parseFloat(document.getElementById('iso2').value);
let f2 = parseFloat(document.getElementById('f2').value);

// Av値、Tv値、Sv値の計算
let av1 = Math.log2(f1 * f1);
let sv1 = Math.log2(iso1 / 100);
let sv2 = Math.log2(iso2 / 100);
// EV値の計算
let ev1 = av1 + Math.log2(1 / ss1) - sv1;

// Tv値の計算
let tv2 = ev1 + sv2 - Math.log2(f2 * f2);

// 本番データのシャッタースピードを計算
let ss2 = Math.pow(2, -tv2);

// 結果を表示する要素に結果を設定(秒と分+秒)
let ss2div = document.getElementById('ss2');
let ss2min = document.getElementById('ss2min');

ss2div.textContent = ss2.toFixed(2) + ' s';

let minutes = Math.floor(ss2 / 60);
let seconds = ss2 - minutes * 60;
ss2min.textContent = minutes + ' m ' + seconds.toFixed(2) + ' s';
}

// ISO2とF2の変更時にローカルストレージに保存
document.getElementById('iso2').addEventListener('change', function() {
localStorage.setItem('iso2', this.value);
calculateAndDisplay();
});

document.getElementById('f2').addEventListener('change', function() {
localStorage.setItem('f2', this.value);
calculateAndDisplay();
});

// 各プルダウンメニューに変更イベントを追加
document.getElementById('iso1').addEventListener('change', calculateAndDisplay);
document.getElementById('f1').addEventListener('change', calculateAndDisplay);
document.getElementById('ss1').addEventListener('change', calculateAndDisplay);

// ページ読み込み時にローカルストレージから値を適用
document.addEventListener('DOMContentLoaded', function() {
// ローカルストレージからISO2の値を取得して適用
if (localStorage.getItem('iso2')) {
document.getElementById('iso2').value = localStorage.getItem('iso2');
}

// ローカルストレージからF2の値を取得して適用
if (localStorage.getItem('f2')) {
document.getElementById('f2').value = localStorage.getItem('f2');
}

// 初期表示時にも計算を実行
calculateAndDisplay();
});