# DICOMビューア｜ブラウザで動くDCMファイルビューア

CT・MRI・レントゲン・超音波を、ウィンドウとヘッダーと計測つきで。

> .dcmの検査画像をブラウザで開く無料のDCMファイルビューアです。CT、MRI、レントゲン、超音波に対応し、インストールは不要です。ウィンドウと中心値を調整し、シリーズ全体を送り、ミリ単位で測り、すべてのDICOMタグと患者の特定につながる情報を確認できます。何もアップロードしません。

これはhttps://abox.tools/ja/dicom-viewer/にあるブラウザー用の対話型ツールです。ファイルはそのブラウザーを実行する端末上で処理します。意図した共有や任意の通信機能はページ内で説明します。以下は文章による説明です。利用するにはアドレスを開いてください。

## 検査画像は**ブラウザー内で処理**されます。処理のためのアップロードはありません。

検査画像の読み込みとデコードは、ヘッダーも画素もウィンドウも計測も、すべて手元のブラウザが行います。このページの向こう側には診療情報を送る先のサーバーがそもそも存在せず、ここにあるどれかが送りたがったとしても送れません。そしてこのファイルについては何ひとつ、患者の氏名も、検査の内容も、ファイル名も、誰にも伝わりません。

- ✗ アップロードなし
- ✗ アカウント不要
- ✓ オフラインで動く
- ✓ オープンソース
- ✓ ファイルは端末に残る

## DCM（DICOM）ファイルの開き方

1. **ファイルを選びます。** `.dcm`ファイルを1つ、またはディスクのフォルダごとです。CTやMRIは1スライスに1ファイルなので、まとめてドラッグして入れることがシリーズを組み直す方法になります。ファイルはブラウザがディスクから直接読みますし、その間どこへも何も送られません。
2. **シリーズを選びます。** 1つの検査にはたいてい複数入っています。スカウト画像があり、そのあとに撮影ごとのものが続きます。各シリーズは装置が撮った順に重ねられますが、その順は番号ではなく、各スライスが体のどこにあるかから導かれます。番号はいつも同じ向きに振られるとはかぎりません。
3. **ウィンドウを合わせます。** 検査画像を読めるようにする操作であり、画像編集ソフトにはないものです。画像の上を横にドラッグするとウィンドウが広がり、上下にドラッグすると中心が動きます。CTなら肺・骨・脳・軟部組織といった名前つきのウィンドウも選べます。CTの単位は世界中のどの装置でも同じだからです。
4. **スライスを送ります。** 画像の下のスライダーがスライスを送り、画像を一度クリックしたあとは矢印キーでも同じことができます。複数フレームのファイル、たとえば超音波のループや血管造影は、隣のボタンで再生されます。
5. **何かを計測します。** 計測に切り替えて線を引いてください。ファイルが画素の間隔を書いていれば、答えはミリで返り、正方形でない画素もきちんと考慮されます。書いていなければ答えは画素数で返り、そうだと明記します。勝手に尺度を作ることはしません。
6. **ヘッダーを読みます。** ファイルのすべての要素を、番号と、規格が与えている名前と、中身とともに、検索できる形で並べます。その上には、まさにこのファイルの何が患者を特定するのかという一覧が出ます。氏名だけではとてもすみません。
7. **必要なものを持ち帰ります。** 画面に出ている画像を、合わせたウィンドウのまま、何も焼き込まずにPNGで。あるいはヘッダー全体をテキストで。どちらもすでにページ上にあるものから、このページの中で作られます。

## 詳しい解説

[DCMファイルの開き方と、その中身](https://abox.tools/ja/guides/open-a-dicom-file/): .dcmファイルとは何か、何で開けるか、病院のディスクの中身、拡張子のない理由、DCMファイルをブラウザで開く方法、ウィンドウと中心値の働き、画像のほかに患者について何を抱えているかを説明します。

## 箱の中のほかのツール

- [画像→ICO変換ツール](https://abox.tools/ja/image-to-ico/): 画像を1枚入れれば、ブラウザもWindowsもMacも、求めるサイズがすべて出てきます。
- [画像→データURI変換ツール](https://abox.tools/ja/image-to-data-uri/): 画像まるごとを1行のテキストに。そのままCSSやHTMLに貼れます。
- [SVG→画像変換ツール](https://abox.tools/ja/svg-to-image/): サイズを指定するだけ。ベクターには、失うサイズがそもそもありません。
- [画像→SVG変換ツール](https://abox.tools/ja/image-to-svg/): ひとつの形に、ひとつの輪郭。あってはいけないものを指さすだけです。

## よくある質問

### 検査画像はどこかへアップロードされますか。

いいえ。ファイルの読み込み、デコード、描画はすべて手元のブラウザが手元のハードウェアで行います。この道具にはサーバー側というものがそもそもなく、ページの`Content-Security-Policy`には接続しうるアドレスがすべて書かれていますが、そのどれもこのサイトのものではありません。回線を抜いても検査画像は開けます。\
\
このサイトのどのページよりも、ここではその事実が効いてきます。DICOMファイルはヘッダーに患者の氏名・生年月日・患者番号を抱えているので、それをビューアへ上げるというのは、見知らぬ相手に画像ではなく診療記録を手渡すということです。

### .dcmファイルをどう開けばいいですか。

このページの上にある枠へドロップしてください。`.dcm`ファイルは、病院の撮影装置が使うDICOM形式のファイルです。このページはブラウザでファイルを読み、検査画像を表示します。インストールもアップロードも必要ありません。Windows、Mac、Linux、Chromebook、スマホで同じように動きます。使うプログラムは、すでにあるブラウザだけです。\
\
ファイル1つではなくディスクやフォルダを渡された場合は、フォルダ全体をドロップしてください。CTやMRIはスライスごとに1ファイルで、名前の末尾に`.dcm`がないこともよくあります。一緒に開くことで検査画像が正しい順序に戻ります。ディスクの`DICOMDIR`ファイルやWindows用ビューアは、そのまま置いておけます。どちらも必要ありません。

### .dcmファイルとは何ですか。ダブルクリックしても開かないのはなぜですか。

医療用撮影装置が作った1枚の画像、または画像のループをDICOM形式で保存したものです。患者、撮影装置、画素の配置などを記した数百のフィールドからなるヘッダーの後に、画素そのものが続きます。JPEGの名前を変えただけのものではないため、写真アプリ、画像編集ソフト、ブラウザのタブでは開けません。医療用ビューアを一度もインストールしていない端末には、この形式を開くプログラムが登録されていません。\
\
`.dcm`で終わるファイルがすべて検査画像とは限りません。同じ3文字をディスクの目録プログラムや自動車のエンジン調整ファイルも使います。このページは名前ではなくファイルそのものを確認し、DICOMではない場合はそう明示します。

### どのDICOMファイルを開けますか。

基本のtransfer syntax3種類の非圧縮ファイル、つまりimplicitとexplicitのlittle endian、それに廃止されたbig endianです。さらにdeflated、RLE Lossless、baseline JPEG、そしてJPEG Losslessも開けます。病院のディスクに入っているCTとMRIの検査の大半は、最後のもので圧縮されています。\
\
JPEG 2000、JPEG-LS、そして動画に使われるMPEGとHEVCの各syntaxはデコードできません。それらにはコンパイル済みライブラリが数メガバイト必要で、必要になったときにそれを取りに行くページは、オフラインで動くページではなくなってしまいます。そうした形式のファイルも開くことは開きます。ヘッダー全体は読んで表示しますし、画像の場所にはコーデック名を書いた一行が入ります。何も教えてくれない壊れた画像のアイコンよりはましだからです。

### 「ウィンドウと中心値」とは何で、なぜ必要なのですか。

CTの1スライスにはおよそ4000通りの値が入っていて、画面が出せるグレーは256階調です。その4000のうちどの範囲が256を丸ごと受け取るのかを何かが決めなければならず、その選択がウィンドウです。それより下はすべて黒、上はすべて白、あいだの範囲がグレーに広がります。\
\
同じファイルが2つの設定で別の検査画像のように見えるのはそのためですし、肺と骨を同時に見られないのもそのためです。CTの数値はハウンスフィールド単位で、絶対的に定義されています。水が0、空気が−1000で、世界中のどのCT装置でもそうです。ですからこのページの名前つきウィンドウは、放射線科医がワークステーションで使うのと同じ数値です。MRIや超音波にはそうした尺度がなく、開いたときのウィンドウはファイル自身が求めているものです。

### 計測がなぜ画素で出るのですか。

そのファイルが画素1つの大きさを書いていないからです。それを持っているのがPixelSpacing (0028,0030)でミリ単位ですが、超音波の画像、紙をスキャンしたもの、secondary captureの多くには、そもそも入っていません。\
\
入っている場合は計測はミリで返り、軸ごとにその軸の間隔で測ります。画素が正方形でない画像ではこれが効いてきます。入っていない場合の正直な答えは画素数で、尺度を勝手に選んで結果を長さのように見せるのではなく、そうだと書きます。

### フォルダを開いたら複数のシリーズに分かれました。なぜですか。

中身がそうだからです。1つの検査はシリーズからできています。スカウト画像があり、そのあとに撮影や再構成ごとのものが続きます。そしてどのファイルも、自分がどれに属するかをSeries Instance UID (0020,000E)に書いています。一覧はフォルダではなくそれをもとに作られます。フォルダのほうはたいてい、全部が名前の一覧として混ざっているだけだからです。\
\
シリーズの中では、スライスは各々が体のどこにあるかで並べられ、それはImagePositionとImage Orientationから導かれます。Instance Numberはいかにもな手がかりですが、第一候補ではなく代替です。それを振るのはファイルを書いた何かであって、患者の向きと同じ向きに走る必要はないからです。

### 「何が患者を特定するのか」の一覧はどういう意味ですか。

あなたのファイルの中で、その検査画像に写っている人を名指しする、あるいは誰なのかを絞り込むフィールドのすべてで、手元の端末上のこのファイルから読み取ったものです。一覧の根拠はDICOM規格のPS3.15、つまりあるデータセットを非識別化されたと呼べるようになる前に何が消えていなければならないかを定めた部分です。\
\
これがあるのは、人が間違えるのが「検査画像に氏名が入っている」という点ではないからです。問題はほかにどれだけ入っているかです。生年月日、受付番号、依頼医、施設、装置の製造番号、そして検査のUID。UIDはそのファイルを作ったアーカイブへ戻る完璧な鍵です。氏名だけ消した検査画像は匿名ではありません。\
\
この道具は見せるだけです。何も書かず何も変えないので、そのどれかを取り除くこともできません。

### 検査画像を匿名化できますか。

できませんし、できるふりも意図的にしません。このページは読みます。DICOMファイルを書くコードはありません。このページがするのは、あなたのファイルに何が入っているのかを正確に伝えることで、それこそが調べにくく、人が間違える部分です。\
\
特定につながる項目を取り除く道具は、はるかに高い水準を求められる別の仕事です。画素に触れずにファイルを書き直し、検査全体でUIDを一貫して置き換え、装置によっては氏名の2つめの写しを隠している私的要素についても正しくなければなりません。それはビューアに付け足すものではなく、このサイトのロードマップにあるものです。

### .dcm拡張子のないファイルや、壊れたファイルも開けますか。

どちらも開けます。拡張子は見ておらず、確かめるのはファイルそのものです。よくある128バイトの前置きなしに書かれたデータセット、つまりネットワークから直接出てきた検査画像はそう見えますが、それは最初の要素から符号化を割り出して読み、ページはそうしたと書きます。\
\
途中で切れているファイルは、行けるところまで読みます。壊れる前のすべてを表示し、何バイト目で止まったかを添えます。ビューアがいちばん必要になるのはまさにそういう場合なので、最後の12バイトのために全体を捨てるのは間違った振る舞いになります。

### これは診断用のビューアですか。

いいえ。医療機器ではなく、いかなる規制上の評価も受けておらず、ここにあるどれも臨床的な判断に使うべきではありません。画面は校正されておらず、ブラウザは検証された描画系ではありませんし、そのどちらもウェブページの内側からは直せません。\
\
一方で、人が検査画像を開くほかのすべての理由には向いています。ディスクに何が入っているかを確かめる、講義や論文のために1枚取り出す、ヘッダーを読む、別のプログラムがなぜこのファイルを拒むのかを調べる、そして検査画像がその人について何を抱えているのかを見る、といったことです。

### ファイルは書き換えられますか。

いいえ。この道具は読むだけです。出力ファイルも再エンコードもなく、DICOMを書くボタンもここにはありません。ダウンロードできるのは画面に出ている画像のPNGと、ヘッダーのテキストです。元のファイルはディスクにそのまま残ります。

### 無料ですか。アカウントは必要ですか。

無料で、アカウントもログインも試用期間もありません。ファイルの大きさにも、いくつ開くかにも制限はなく、あるのは手元の端末のメモリだけです。このサイトは広告で運営されていて、広告側にはあなたのファイルについて何も渡されません。

### オフラインで動きますか。

はい。ページを一度読み込んだあと、回線を切っても動き続けます。何もアップロードされていないことを示すいちばん簡単な方法でもあります。検査画像をどこかへ送って描かせる道具なら、線を抜いた瞬間に止まるからです。

## この主張を確かめる方法

- **処理はこのブラウザー内で行います。** 入力と結果はブラウザー内で処理し、処理コードはそれらを処理用にアップロードしません。Content-Security-Policyは資源と接続先を制限しますが、許可済みの相手はリクエストを受け取れます。内容は検査せず、何も送られないことを単独で証明しません。具体的な操作の要求とソースを比較するか、切断中にローカル操作を完了してください。
- **ここでは他のページよりも重く効いてきます。** DICOMファイルは、メタデータの付いた画像ではありません。画像の入った診療記録です。患者の氏名、生年月日、患者番号、受付番号、依頼した医師、施設名、装置の製造番号は、どれもヘッダーのフィールドで、ファイルが行く先へそのまま付いていきます。見るためだけにどこかのサイトへ上げるというのは、それをすべてそのサイトの運営者に手渡すということです。このページは、まさにそれをしないためにあります。
- **読み手はこのリポジトリの14個のファイルです。** ここではどこかから取ってきたライブラリを使っている箇所はひとつもありません。`src/dicom.js`がファイルをたどり、`src/dictionary.js`がタグの名前を知っていて、`src/pixels.js`がバイト列を測定値に戻し、`src/rle.js`と`src/jpeg-lossless.js`がこのページの展開できる2つの圧縮形式を開き、`src/window.js`が測定された値を画面のグレーに割り当てます。
- **特定につながる項目は、あなたのためだけに並べられます。** このページは、その検査画像に写っている人を名指しする、あるいは誰なのかを絞り込むフィールドをすべて書き出します。1枚を誰かに渡そうとしている人こそその答えを必要としているのに、どのビューアもそれに答えないからです。それは目の前の画面に出るだけで、ほかのどこへも行きません。このリポジトリにはその内容を運ぶ分析イベントはありません。 任意のフィードバックはツール識別子、固定回答、固定理由だけを送り、ファイルから読んだメタデータは送りません。
- **読むだけです。書きません。** ファイルを書き換えるボタンはここになく、書き換えうるコードもありません。持ち出せるのは画面に出ている画像のPNGと、ヘッダーのテキストです。どちらもすでにページ上にあるものから、このページの中で組み立てられます。元のファイルはディスクにそのまま残りますし、タブを閉じたらどうなるかという問いへの正直な答えもそれです。
- **Googleが読み込むものと、渡されないもの。** 広告と計測のスクリプトはGoogleから来ます。どちらにも、あなたのファイルについては何も渡されません。画素も、サムネイルも、名前も、タグも、患者も、ファイル名もです。検査画像を解析し、デコードし、描くすべての行はこのオリジンから配信され、リポジトリに載っています。
- **寄付ボタンが読み込むものと、渡されないもの。** 上部の「Buy me a coffee」ボタンはcdnjs.buymeacoffee.comのスクリプトが描き、文字はGoogle Fontsから読み込みます。それはリンクにすぎません。訪問を報告することもなく、あなたやあなたのファイルについて何かを受け取ることもありません。押さなければ何も起きませんし、押した先は他人のサイトです。
- **オフラインで動きます。** 回線を切っても、このページのどの部分もそのまま動きます。いちばん簡単な証拠です。検査画像をどこかへ送って描かせる道具なら、線を抜いた瞬間に止まるからです。

**自分で確かめてください。**以上のどれも、鵜呑みにする必要はありません。このページは、リポジトリにあるテンプレートと設定から、誰でも読んで実行できるビルドスクリプトが生成しています。その結果は`dist`ブランチに置いてあるので、配信されているものと、ソースをビルドした結果とを差分で比べられます。 https://github.com/A-Box-of-Tools/website

まず読むとよいのは、Content-Security-Policyについては`config/site.toml`、ファイルをたどるパーサーは`src/dicom.js`、画素のデコードは`src/pixels.js`、病院からの書き出しでいちばん多く使われるコーデックは`src/jpeg-lossless.js`、ウィンドウと中心値は`src/window.js`です。どれにも、ネットワークに届きうる行は一行もありません。
