Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Web技術を最大限活用してRAW画像を現像する / Developing RAW Images...
Search
TOMIKAWA Sotaro
September 21, 2025
Programming
3.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Web技術を最大限活用してRAW画像を現像する / Developing RAW Images on the Web
https://fec-tokyo.connpass.com/event/352581/
TOMIKAWA Sotaro
September 21, 2025
More Decks by TOMIKAWA Sotaro
See All by TOMIKAWA Sotaro
ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS
ssssota
3
2.6k
Atomics APIを知る / Understanding Atomics API
ssssota
2
1.4k
なんでRustの環境構築してないのにRust製のツールが動くの? / Why Do Rust-Based Tools Run Without a Rust Environment?
ssssota
15
56k
漸進。
ssssota
0
3.7k
Preact、HooksとSignalsの両立 / Preact: Harmonizing Hooks and Signals
ssssota
1
3.8k
useSyncExternalStoreを使いまくる
ssssota
6
7k
React CompilerとFine Grained Reactivityと宣言的UIのこれから / The next chapter of declarative UI
ssssota
8
6.3k
新しいAPI createRawSnippet触ってみた / What is the createRawSnippet?
ssssota
2
340
脱法Svelte / Evasion of svelte rules
ssssota
1
350
Other Decks in Programming
See All in Programming
バグを直したら useEffect が消えた
colorful12
3
780
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
120
源内ハンズオン概要編
hideg
0
230
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.8k
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
270
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
360
Cloudflare is Agents
chimame
0
190
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
330
T3DD26: From RAGs to Riches
martinhelmich
0
130
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
560
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
170
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
500
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
430
Navigating Team Friction
lara
192
16k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
240
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
700
How to train your dragon (web standard)
notwaldorf
97
6.8k
It's Worth the Effort
3n
188
29k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
180
Transcript
Web技術を最⼤限活⽤して RAW画像を現像する sssssota / #fec_tokyo
⾃⼰紹介 ssssota (冨川宗太郎) sは4つ テックリード(写真・現像は素人) { x: "ssssotaro", gh: "ssssota",
cameras: ["S5IIX", "S9", "fp L"] }
RAW画像とは何か カメラをやっているとRAW画像という概念に出会う (最近ではiPhoneなどのスマホでもRAW画像を出力できる) 一般的な写真のフォーマットであるJPEGはRGB各8bit、 計24bitで色を表現する すると (28)3=約1680万色 になる
RAW画像とは何か カメラのセンサーは各色12bit〜16bitといった解像能を持つ 8bit→1680万色だったのが14bit→4兆色になる すると、ファイルサイズがでかくなる。(30MiB〜100MiB)
RAW画像とは何か そんなとても大きいRAW画像 カメラメーカー各社が独自規格で出力してくれる オープンな規格(TIFF, DNG)も存在するが 日本の大手メーカー各社は使わず...
RAW画像を現像する とにかくデカい、独自規格なバイナリ 一般的には デスクトップアプリケーション・モバイルアプリケーションで ネイティブな並列処理、GPU処理を活用しながら行う
Webエンジニアなので Webで完結させたい
resolve.photos
概観
課題の整理 1. カメラメーカー各社の独自フォーマット 2. デカいファイルに対する処理速度
LibRaw RAW画像を読めるOSS メーカー独自の規格の多くを自前でサポートするのは困難 ただしC++
C++のLibRawをブラウザで動かすためにWASMを使う WASMへのコンパイルにはEmscriptenを使う libraw.wasm
WebAssemblyの制約 現在も仕様の策定が進行しているが、JS - WASM間で 文字列や構造体などの非数な値をやりとりするのは難しい メモリ空間は共有できるので、 構造体をメモリに直接読み書きする手法を用いる
メモリから構造体を読むために C/C++の構造体は定義からメモリレイアウトが確定する struct Sample { uint8_t foo; uint16_t bar; }
typed-cstruct 構造体の定義をTypeScriptで書き下すと型付きで バイナリを読み書きできるようになるライブラリ 構造体がたくさんあると手書きが大変なので @typed-cstruct/generator でCのヘッダーファイルからTypeScriptも生成
WebAssemblyは速いが WebAssemblyはそれなりに速いが、 JavaScriptと同じスレッドで動くために メインスレッドでヘビーな利用をするとUIが硬直する
Web Worker WebAssemblyで動かすようなCPUヘビーな処理は 往々にしてWeb Workerに逃がす Web Workerに逃がすことでUIをブロッキングせずに 処理を進める Comlinkやbidcを用いてWeb Workerとの通信を
抽象化するのが一般的
レンダリングする ここまででビットマップ画像が得られる Canvas APIではRGB各色16bitのビットマップを扱えない WebGL 2.0を使うことになる
現像する 現状resolve.photosはノイズ除去や収差補正はサポートせず とある動画編集ソフトを参考にノードベースのLUT適用を実現
⾼速なLUT適⽤ 6000x4000ピクセルの色を取得、1つずつLUTに入れて... とするととても遅い 1つのことを繰り返しするのはGPUが得意 → WebGPU WebGL2でレンダリング時に
LUTをテクスチャとして読み込み、WebGLで画像に対し適用 ノードベースで複数のノード(=LUT)があることもあるので WebGLのフラグメントシェーダーは動的に生成する WebGLを⽤いたLUT適⽤
概観
改善余地 • そもそも機能数が全く足りてない ◦ 技術的におもしろい部分だけ作って満足している節がある ◦ PoCとしては十分... • WebAssembly Multithreading
◦ 検証不足 • RAW画像解析をそもそもGPGPUできる説 ◦ 現実的ではないが夢はある • 最近はAI現像っていうのが流行ってるらしい ◦ マルチモーダルなローカルLLMがWebにきたらアツいですね
おわり 参考 • https://github.com/ssssota/resolve.photos • https://github.com/ssssota/libraw.wasm • https://github.com/LibRaw/LibRaw • https://github.com/ssssota/typed-cstruct