Exposure Triangle Calculator

ANALife Services AuthorityNational Calculator Authority›Exposure Triangle Calculator

.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }

Exposure Triangle Calculator

Calculate the relationship between aperture (f-stop), shutter speed, and ISO. Solve for any one value given the other two, or find the equivalent exposure when changing one setting.

### Solve for Unknown Value

Enter any two values to solve for the third (leave one blank).

Aperture (f-stop)

f/0.7 – f/64

Shutter Speed (seconds)

e.g. 0.01 for 1/100s, 2 for 2s

ISO

1 – 3,280,000

### Equivalent Exposure Calculator

Change one setting and find the equivalent value for another to maintain the same exposure.

Original Aperture (f-stop)

Original Shutter Speed (s)

Original ISO

New Aperture (f-stop) — optional

New Shutter Speed (s) — optional

New ISO — optional

Fill in two of the three "New" fields to solve for the third.

Calculate

function expLog2(x) { return Math.log(x) / Math.log(2); }

function expEV(aperture, shutter, iso) { // EV = log2(N^2 / t) - log2(ISO/100) // where N = f-number, t = shutter speed in seconds return expLog2((aperture * aperture) / shutter) - expLog2(iso / 100); }

function expFmtShutter(s) { if (s >= 1) return s.toFixed(2) + "s"; var frac = Math.round(1 / s); return "1/" + frac + "s (" + s.toFixed(6).replace(/0+$/, '') + "s)"; }

function expFmtAperture(n) { return "f/" + n.toFixed(1); } function expFmtISO(iso) { return Math.round(iso).toLocaleString(); }

function expNearestStdAperture(n) { var stops = [0.7,0.8,1,1.1,1.2,1.4,1.6,1.8,2,2.2,2.5,2.8,3.2,3.5,4,4.5,5,5.6,6.3,7.1,8,9,10,11,13,14,16,18,20,22,25,29,32,36,40,45,51,57,64]; return stops.reduce(function(a,b){ return Math.abs(b-n) 64)) errs.push("Aperture must be between f/0.7 and f/64."); if (!shBlank && (sh 3600)) errs.push("Shutter speed must be between 1/8000s and 3600s."); if (!isoBlank && (iso 3280000)) errs.push("ISO must be between 1 and 3,280,000."); if (errs.length) { res.innerHTML = "" + errs.join("") + ""; return; }

// EV = log2(N^2 / t) - log2(ISO/100) // Rearranging: // Solve for aperture: N^2 = t * 2^(EV + log2(ISO/100)) => N = sqrt(t * 2^(EV + log2(ISO/100))) // Solve for shutter: t = N^2 / 2^(EV + log2(ISO/100)) // Solve for ISO: ISO = 100 * 2^(log2(N^2/t) - EV) // But EV is not given — we use the relationship directly: // N^2 / t / (ISO/100) = constant (exposure value in lux-seconds) // So: N1^2 / t1 / ISO1 = N2^2 / t2 / ISO2 // With only two knowns and one unknown, we need a reference EV. // The calculator computes EV from the two known values assuming a standard exposure. // Actually with 3 unknowns and 1 equation we need 2 knowns to solve for 1 unknown. // Here blanks==1 means 2 knowns, 1 unknown — solvable.

// Exposure equation: EV_scene = log2(N^2/t) - log2(ISO/100) // This calculator does not have EV_scene independently, so we use the direct relationship: // The "exposure" H = (t * ISO) / (N^2 * C) where C is a constant. // For equivalent exposure: N^2/t * 1/ISO = constant // We solve using the two known values to find the third.

if (apBlank) { // N = sqrt(sh * iso / 100 * 2^EV) — but the calculator does not have EV // Use: N^2 = (sh * iso) / K where K is derived from... // We need a reference. Without EV we can't solve with just sh and iso. // Actually: EV = log2(N^2/sh) - log2(iso/100) // We need all three to compute EV. With aperture unknown, we need EV from somewhere. // The calculator solves: given EV (from a light meter conceptually), find N. // Since user gave sh and iso but not N, we cannot determine N without EV. // HOWEVER: the common use case is "I know shutter and ISO, what aperture gives correct exposure?" // This requires knowing the scene EV. We'll ask for EV or note this limitation. // Better approach: treat this as "find aperture that gives same EV as a reference" — not applicable here. // We'll inform the user they need a reference EV or use the equivalent exposure section. res.innerHTML = "To solve for aperture, a reference exposure value (EV) is needed. Please use the Equivalent Exposure section below, or provide all three values to compute EV."; return; }

// Actually, the standard approach: the three values together define EV. // With 2 known, we cannot solve for the 3rd without knowing EV independently. // The correct interpretation: user wants to know "what value of X gives the same EV as a known combination?" // That requires a reference. So the "solve for unknown" section only makes sense if we have a target EV. // Let's add an EV input OR reframe: compute EV from all three, or use equivalent exposure. // For simplicity and correctness, let's compute EV when all 3 are given, and for the "solve" case, // require a target EV input. We'll add that field.

// Re-reading: with blanks==1, we have 2 knowns. The equation N^2/(t*ISO) = 2^EV / 100 // has 4 unknowns (N, t, ISO, EV). With 2 of N/t/ISO known, we still have 2 unknowns (the blank + EV). // So it's underdetermined. We need EV as input too. // Let's handle this gracefully: res.innerHTML = "Solving for a single unknown requires a target Exposure Value (EV). Please provide all three values to compute EV, or use the Equivalent Exposure section to find an equivalent setting."; return;

} else if (blanks === 0) { // All three provided — compute EV and exposure info var errs = []; if (ap 64) errs.push("Aperture must be between f/0.7 and f/64."); if (sh 3600) errs.push("Shutter speed must be between 1/8000s and 3600s."); if (iso 3280000) errs.push("ISO must be between 1 and 3,280,000."); if (errs.length) { res.innerHTML = "" + errs.join("") + ""; return; }

var ev = expEV(ap, sh, iso); var ev100 = expLog2((ap * ap) / sh); // EV at ISO 100

// Exposure stops relative to "correct" exposure (subjective, but we show EV) // Luminance from EV: L = 2^EV / (pi * reflectance) — standard reflectance 18% = 0.18 // H = (t * ISO) / (N^2 * C) where C = 250 (ISO 2720 standard, C=250 for reflected light) var H = (sh * iso) / (ap * ap * 250);

html += "### Exposure Analysis "; html += ""; html += "ParameterValue"; html += "Aperture" + expFmtAperture(ap) + ""; html += "Shutter Speed" + expFmtShutter(sh) + ""; html += "ISO" + expFmtISO(iso) + ""; html += "EV (at ISO 100)" + ev100.toFixed(2) + " EV"; html += "EV (at ISO " + expFmtISO(iso) + ")" + ev.toFixed(2) + " EV"; html += "Exposure (H)" + H.toExponential(3) + " lux·s"; html += "Depth of Field" + (ap "; html += "Motion Blur Risk" + (sh >= 1/60 ? "High (use tripod)" : sh >= 1/250 ? "Moderate" : "Low (freezes motion)") + ""; html += "Noise Level" + (iso "; html += "";

// EV reference table html += "#### Common Scene EV₁₀₀ Reference "; html += "SceneEV₁₀₀Match?"; var scenes = [ ["Starry sky (no moon)", -6], ["Milky Way", -4], ["Quarter moon", 0], ["Full moon", 3], ["Indoor (dim)", 5], ["Indoor (bright)", 7], ["Overcast outdoors", 12], ["Sunny outdoors (f/16 rule)", 15], ["Bright snow/sand", 16] ]; scenes.forEach(function(s) { var match = Math.abs(ev100 - s[1]) " + s[0] + "" + s[1] + "" + match + ""; }); html += "";

} else if (blanks === 3) { // Nothing entered in part 1 — skip silently } else { html += "Exposure Triangle section: provide all three values to compute EV, or use the Equivalent Exposure section below.

"; }

// --- Part 2: Equivalent Exposure --- var oAp = parseFloat(document.getElementById("exp-orig-aperture").value); var oSh = parseFloat(document.getElementById("exp-orig-shutter").value); var oIso = parseFloat(document.getElementById("exp-orig-iso").value); var nAp = parseFloat(document.getElementById("exp-new-aperture").value); var nSh = parseFloat(document.getElementById("exp-new-shutter").value); var nIso = parseFloat(document.getElementById("exp-new-iso").value);

var nApBlank = isNaN(nAp) || document.getElementById("exp-new-aperture").value.trim() === ""; var nShBlank = isNaN(nSh) || document.getElementById("exp-new-shutter").value.trim() === ""; var nIsoBlank = isNaN(nIso) || document.getElementById("exp-new-iso").value.trim() === ""; var newBlanks = (nApBlank?1:0) + (nShBlank?1:0) + (nIsoBlank?1:0);

var origFilled = !isNaN(oAp) && !isNaN(oSh) && !isNaN(oIso);

if (origFilled && newBlanks === 1) { var errs2 = []; if (oAp 64) errs2.push("Original aperture must be f/0.7–f/64."); if (oSh 3600) errs2.push("Original shutter speed out of range."); if (oIso 3280000) errs2.push("Original ISO out of range."); if (!nApBlank && (nAp 64)) errs2.push("New aperture must be f/0.7–f/64."); if (!nShBlank && (nSh 3600)) errs2.push("New shutter speed out of range."); if (!nIsoBlank && (nIso 3280000)) errs2.push("New ISO out of range."); if (errs2.length) { res.innerHTML += "" + errs2.join("") + ""; res.style.display="block"; return; }

// Equivalent exposure: N1^2 / t1 / ISO1 = N2^2 / t2 / ISO2 // => N2^2 * t2 * ISO2 = N1^2 * t1 * ISO1 (wait, let's be careful) // H = t * ISO / (N^2 * C) = constant // So: t1 * ISO1 / N1^2 = t2 * ISO2 / N2^2 // K = oSh * oIso / (oAp * oAp)

var K = oSh * oIso / (oAp * oAp); var solved, solvedLabel, solvedVal, stdVal;

if (nApBlank) { // N2^2 = t2 * ISO2 / K var n2sq = nSh * nIso / K; if (n2sq Invalid: computed aperture is non-positive."; res.style.display="block"; return; } solved = Math.sqrt(n2sq); solvedLabel = "New Aperture"; solvedVal = expFmtAperture(solved); stdVal = expFmtAperture(expNearestStdAperture(solved)); } else if (nShBlank) { // t2 = K * N2^2 / ISO2 solved = K * nAp * nAp / nIso; if (solved Invalid: computed shutter speed is non-positive."; res.style.display="block"; return; } solvedLabel = "New Shutter Speed"; solvedVal = expFmtShutter(solved); stdVal = expFmtShutter(expNearestStdShutter(solved)); } else { // ISO2 = K * N2^2 / t2 solved = K * nAp * nAp / nSh; if (solved Invalid: computed ISO is non-positive."; res.style.display="block"; return; } solvedLabel = "New ISO"; solvedVal = expFmtISO(solved); stdVal = expFmtISO(expNearestStdISO(solved)); }

// Stops difference var origEV = expEV(oAp, oSh, oIso); var newAp2 = nApBlank ? solved : nAp; var newSh2 = nShBlank ? solved : nSh; var newIso2 = nIsoBlank ? solved : nIso; var newEV = expEV(newAp2, newSh2, newIso2); var stopsDiff = Math.abs(origEV - newEV);

html += "### Equivalent Exposure Result "; html += ""; html += "SettingOriginalNew"; html += "Aperture" + expFmtAperture(oAp) + "" + expFmtAperture(nApBlank ? solved : nAp) + ""; html += "Shutter Speed" + expFmtShutter(oSh) + "" + expFmtShutter(nShBlank ? solved : nSh) + ""; html += "ISO" + expFmtISO(oIso) + "" + expFmtISO(nIsoBlank ? solved : nIso) + ""; html += "EV (ISO 100)" + expLog2(oApoAp/oSh).toFixed(2) + "" + expLog2(newAp2newAp2/newSh2).toFixed(2) + ""; html += ""; html += "" + solvedLabel + " (exact): " + solvedVal + "

"; html += "" + solvedLabel + " (nearest standard): " + stdVal + "

"; html += "Exposure difference: " + stopsDiff.toFixed(3) + " stops " + (stopsDiff "; html += "ParameterChange (stops)Effect"; html += "Aperture" + (apStops >= 0 ? "+" : "") + apStops.toFixed(2) + "" + (apStops > 0 ? "Less light, more DoF" : apStops "; html += "Shutter Speed" + (shStops >= 0 ? "+" : "") + shStops.toFixed(2) + "" + (shStops > 0 ? "More light, motion blur risk" : shStops "; html += "ISO" + (isoStops >= 0 ? "+" : "") + isoStops.toFixed(2) + "" + (isoStops > 0 ? "More sensitive, more noise" : isoStops "; html += "";

} else if (origFilled && newBlanks !== 1 && newBlanks !== 3) { html += "Equivalent Exposure: fill in exactly two of the three 'New' fields to solve for the third.

"; }

if (!html) { html = "Please fill in the fields above and click Calculate.

"; }

res.innerHTML = html; res.style.display = "block"; }

#### Formulas

Exposure Value (EV) at ISO 100: EV₁₀₀ = log₂(N² / t) where N = f-number (aperture), t = shutter speed in seconds

EV at any ISO: EV = log₂(N² / t) − log₂(ISO / 100)

Exposure (luminous exposure H): H = (t × ISO) / (N² × C) where C = 250 (ISO 2720 standard calibration constant for reflected-light meters)

Equivalent Exposure (same H): t₁ × ISO₁ / N₁² = t₂ × ISO₂ / N₂² Solve for any unknown: N₂ = √(t₂ × ISO₂ × N₁² / (t₁ × ISO₁)) t₂ = t₁ × ISO₁ × N₂² / (ISO₂ × N₁²) ISO₂ = ISO₁ × t₁ × N₂² / (t₂ × N₁²)

Stops difference: Aperture stops = 2 × log₂(N₂ / N₁) Shutter stops = log₂(t₂ / t₁) ISO stops = log₂(ISO₂ / ISO₁)

#### Assumptions & References

More Calculators

Read Next

Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...

References