Cross-Platform · Flutter · Photography Tools
露出帳 (Roshutsucho) — Flutter で実装したフィルム写真家向け露出計算アプリ
フィルム写真家のための露出計算アプリを Flutter で実装し、iPhone / iPad / Mac (Apple Silicon) / visionOS / Android の 5 プラットフォームに単一コードベースで展開した事例。Sunny 16、相反則不軌補正、Push/Pull 現像、ND フィルター、蛇腹補正、フラッシュガイドナンバー計算など、フィルム写真の現場で使う計算機能を一つのアプリに統合。
プラットフォーム
iPhone / iPad / Mac (Apple Silicon) / visionOS / Android — 単一コードベースで 5 プラットフォーム展開
言語・技術
Flutter / Dart
対応言語
日本語・英語(バイリンガル対応)
課金モデル
Free / Pro(買い切り ¥800 / $7.99)
主な機能
Sunny 16 / ND フィルター / 相反則不軌補正 / Push/Pull 現像 / 蛇腹補正 / フラッシュ GN 計算 / 統合計算機
担当範囲
企画・設計・実装・UI・ローカライズ・ストア申請・運用(全て一人)
プロジェクト概要
露出帳は、フィルム写真家とプロフェッショナルフォトグラファーのための露出計算専用アプリです。Sunny 16 ルール、ND フィルター補正、EV/LV 変換などの基本機能は無料で提供。Pro 機能(¥800 買い切り)として、相反則不軌補正、Push/Pull 現像計算、蛇腹補正、フラッシュガイドナンバー計算、そしてこれらを連鎖して計算できる統合計算機を提供しています。
本アプリは「VJ-CONNECT Photography Series」の第 1 弾と位置付けられており、単独製品ではなく、フィルム写真家向けツール群の最初のピースとしてリリースされています。シリーズ第 2 弾以降との共通化を見据えた設計判断も含まれています。
また、開発者自身がフィルム写真家であり、自分が現場で使いたい計算機能を統合する形でアプリを設計しました。**実ユーザー目線でのプロダクト設計** がそのまま反映されています。
技術的な難所
「動くプロトタイプ」ではなく「ストア配信できる完成品」にするため、以下のハードルがありました:
- フィルム銘柄ごとの相反則不軌データの構造化:20 種類以上のフィルム(Kodak、Fujifilm、Ilford、CineStill 等)の相反則特性を、メーカー仕様と実測データに基づいて整備
- 計算ロジックの正確性:Sunny 16・ND・相反則・Push/Pull・蛇腹・フラッシュ GN それぞれが写真技術として正しい計算結果を返す必要がある
- 複数計算の連鎖(統合計算機):「Sunny 16 → ND → 相反則」のようにチェーンしても、途中段階を含めて正しく計算され、UI に追随して表示される
- マルチプラットフォーム展開:iPhone / iPad / Mac / visionOS / Android のそれぞれで自然に動く UI/UX を、単一コードベースで実現
- UI が両 OS のデザイン慣習に違和感なく馴染むこと:Flutter で書きながら、iOS では iOS らしく、Android では Android らしく振る舞わせる
主要な技術判断
1. ネイティブではなく Flutter を選択 — ドメインに応じた技術選定
同じ個人開発でも、PocketTune(リアルタイム音声合成)では Android Kotlin + iOS Swift のネイティブ実装を選びました。Roshutsucho では真逆の Flutter を選択しています。理由を明確に持って使い分けています:
- リアルタイム音声処理が不要:本アプリは計算 UI が中核で、低遅延な OS 固有 API への依存がない
- プラットフォーム固有の深い統合が不要:センサー連携やバックグラウンド処理など、ネイティブの強みが効く要件がない
- マルチプラットフォーム展開が価値になる:フィルム写真家層は iPhone / iPad / Mac / Android のいずれも使う。Flutter なら一つのコードベースで全部届く
- 開発速度・保守性が個人開発の生命線:両ネイティブで重複実装するコストを払う合理性が、本アプリではない
「ネイティブが常に正解ではなく、Flutter が常に正解でもない。アプリの性質によって判断する」という考え方を、PocketTune と Roshutsucho の対比で具体的に示しています。
2. 単一コードベースで 5 プラットフォーム展開
Flutter の利点を最大限に活かし、iPhone / iPad / Mac (Apple Silicon) / visionOS / Android の 5 プラットフォームに単一コードベースで展開しています。
- Apple ファミリーは単一ビルド — iPhone・iPad・Mac・visionOS は Flutter の Universal Binary で対応
- iOS / Android の見た目の差異 — Cupertino / Material のウィジェット使い分けで、それぞれのプラットフォーム慣習に馴染ませる
- 機能追加・バグ修正が全プラットフォームに即時反映 — 個人開発では運用効率がそのまま生産性
3. ドメイン知識をデータ駆動で設計
露出計算は、計算式そのものは古典的(Sunny 16 など 100 年以上の歴史を持つ写真技術)ですが、フィルム銘柄ごとの相反則不軌特性を正確にデータベース化することが、競合アプリとの差別化要素になります。
Kodak Portra、Ektar、T-Max、Fujifilm Provia、Velvia、Acros、Ilford HP5、Delta、CineStill 50D/800T など、20 種類以上のフィルム特性をメーカー仕様と実測データに基づいて整備。データを差し替え可能な構造にしているため、将来「カスタムフィルム登録」「Presets & History」機能(ロードマップで宣言済み)も同じ基盤で追加できます。
4. シリーズ展開を見据えた基盤設計
Roshutsucho は「VJ-CONNECT Photography Series」の第 1 弾という位置付けで、単発のアプリとして閉じない設計にしています。露出計算の基盤ロジックは将来別アプリで再利用可能な構造に切り出し、写真関連の他ツール(フィルター計算、撮影記録、現像管理など)への展開を見据えています。
これは「アプリを 1 本作る」だけでなく、「個人開発でアプリ群をシリーズとして育てる」というプロダクト戦略でもあり、Flutter を選んだ判断はこの戦略とも整合しています(共通基盤を複数製品で活かせる)。
マルチプラットフォーム展開
Flutter の特性により、Apple エコシステム全体(iPhone / iPad / Mac / visionOS)と Android に単一コードベースで対応。各プラットフォームのストア審査・配信を一人で完結しました。
UI は Flutter の Cupertino / Material 双方を使い分け、iOS / iPadOS ではネイティブの見た目に馴染ませ、Android では Material 3 の表現を使う構成。「Flutter で書いてもプラットフォーム固有感を損なわない」ことを意識した実装になっています。
結果
- iPhone / iPad / Mac (Apple Silicon) / visionOS / Android の 5 プラットフォームでリリース完了
- 単一 Flutter コードベースで全プラットフォーム対応
- 20+ フィルム銘柄の相反則不軌データを内蔵
- Sunny 16・ND・相反則・Push/Pull・蛇腹・フラッシュ GN の 6 種類の専門計算機能を統合
- Google Play / App Store 両方で Pro 機能の買い切り IAP を実装
- 日本語・英語のバイリンガル対応
- VJ-CONNECT Photography Series の第 1 弾としてリリース
What this project demonstrates
このプロジェクトで証明できること
- Flutter による効率的なクロスプラットフォーム開発が可能
- ネイティブと Flutter の使い分けの判断軸を持っている(PocketTune との対比)
- 単一コードベースで Apple エコシステム全体 + Android にリーチできる
- ドメイン知識(写真技術)をプロダクトに落とし込める
- 個人開発をシリーズ戦略として設計・運用できる
- Cupertino / Material 両対応でプラットフォーム慣習に馴染む UI を作れる