# DICOM 뷰어 — .dcm 영상을 브라우저에서 열기

CT, MRI, 엑스레이, 초음파를 창과 헤더와 계측까지.

> CT, MRI, 엑스레이, 초음파 영상을 브라우저에서 엽니다. 창과 레벨, 시리즈 전체 넘겨보기, 밀리미터 단위 계측, 모든 DICOM 태그 읽기, 그리고 이 파일에서 무엇이 환자를 가리키는지까지. 아무것도 업로드되지 않습니다.

이 페이지는 브라우저 안에서만 동작하는 대화형 도구입니다(https://abox.tools/ko/dicom-뷰어/). 도구에 넘긴 어떤 것도 업로드되지 않습니다. 아래는 이 페이지가 도구에 대해 글로 설명하는 내용 전부입니다. 도구를 쓰려면 이 주소를 여세요.

## 영상은 **절대 업로드되지 않습니다**. 서버가 아예 없으니까요.

영상을 열고 디코딩하는 일은 모두 이 브라우저가 합니다. 헤더도, 픽셀도, 창도, 계측도 그렇습니다. 이 페이지 건너편에는 진료 정보를 보낼 서버가 아예 없어서, 여기 있는 무언가가 보내고 싶어도 보낼 곳이 없습니다. 그리고 이 파일에 대한 어떤 것도 — 환자 이름도, 검사도, 파일 이름도 — 누구에게도 전해지지 않습니다.

- ✗ 업로드 없음
- ✗ 계정 없음
- ✓ 오프라인 작동
- ✓ 오픈 소스
- ✓ 파일은 기기에 남습니다

## DICOM 파일 여는 법

1. **파일을 고르십시오.** `.dcm` 파일 하나, 아니면 디스크의 폴더 전체입니다. CT나 MRI는 한 장에 파일 하나라서, 전부 한꺼번에 끌어다 놓는 것이 시리즈를 다시 맞추는 방법입니다. 파일은 브라우저가 디스크에서 바로 읽고, 그러는 동안 어디로도 아무것도 보내지 않습니다.
2. **시리즈를 고르십시오.** 한 검사에는 보통 여러 개가 들어 있습니다. 스카우트 영상이 있고, 그다음에 촬영마다 하나씩입니다. 각 시리즈는 장비가 찍은 순서대로 쌓이는데, 그 순서는 번호가 아니라 각 장이 몸의 어디에 있는지에서 나옵니다. 번호는 늘 같은 방향으로 매겨지지 않습니다.
3. **창을 맞추십시오.** 영상을 읽을 수 있게 만드는 조작이고, 이미지 편집기에는 없는 것입니다. 영상 위를 가로로 끌면 창이 넓어지고 위아래로 끌면 중심이 움직입니다. CT라면 이름이 붙은 창 — 폐, 뼈, 뇌, 연부조직 — 을 골라도 됩니다. CT의 단위는 세상 어느 장비에서나 같습니다.
4. **쌓인 장을 넘기십시오.** 영상 아래의 슬라이더가 장을 넘기고, 영상을 한 번 클릭한 뒤에는 화살표 키도 같은 일을 합니다. 여러 프레임이 든 파일 — 초음파 루프나 혈관조영 — 은 옆의 버튼으로 재생됩니다.
5. **무언가를 재 보십시오.** 계측으로 바꾸고 선을 그으십시오. 파일이 픽셀 간격을 밝혀 두었다면 답은 밀리미터로 나오고, 정사각형이 아닌 픽셀도 감안합니다. 밝혀 두지 않았다면 답은 픽셀로 나오고 그렇다고 말합니다. 없는 배율을 지어내지 않습니다.
6. **헤더를 읽으십시오.** 파일의 모든 요소를 번호와 표준이 부르는 이름과 담긴 값까지, 검색할 수 있게 보여 줍니다. 그 위에는 바로 이 파일에서 무엇이 환자를 가리키는지가 나열됩니다. 이름보다 훨씬 많습니다.
7. **필요한 것을 가져가십시오.** 화면에 보이는 영상을 PNG로, 맞춘 창 그대로, 아무것도 태워 넣지 않고 가져가거나, 헤더 전체를 일반 텍스트로 가져갑니다. 둘 다 이미 페이지에 있는 것으로 이 안에서 만듭니다.

## 자세한 설명

[DICOM 파일 여는 법, 그리고 그 안에 무엇이 있는지](https://abox.tools/ko/가이드/dicom-파일-여는-법/): 병원 CD에 무엇이 들어 있는지, 파일에 왜 확장자가 없는지, .dcm 영상을 브라우저에서 어떻게 여는지, 창과 레벨이 실제로 무슨 일을 하는지, 그리고 영상이 그림 말고 환자에 대해 무엇을 지니고 있는지.

## 상자 속 다른 도구

- [이미지를 ICO로](https://abox.tools/ko/파비콘-만들기/): 그림 하나를 넣으면, 브라우저와 윈도우와 맥이 요구하는 모든 크기가 나옵니다.
- [이미지를 데이터 URI로](https://abox.tools/ko/이미지-base64-변환/): 사진 전체를 텍스트 한 줄로. CSS나 HTML에 그대로 붙여 넣으세요.
- [SVG를 이미지로](https://abox.tools/ko/svg-png-변환/): 크기를 말하세요. 벡터에는 잃어버릴 자기 크기가 없습니다.
- [이미지를 SVG로](https://abox.tools/ko/이미지-svg-변환/): 형태 하나, 윤곽선 하나. 있으면 안 되는 것은 가리키기만 하세요.

## 자주 묻는 질문

### 제 영상이 어딘가로 업로드되나요?

아닙니다. 파일을 읽고 디코딩하고 그리는 일은 모두 이 브라우저가 이 기기의 하드웨어에서 합니다. 이 도구에는 서버 쪽이 없고, 페이지의 `Content-Security-Policy`에는 접속할 수 있는 주소가 모두 적혀 있는데 그중 이 사이트의 것은 하나도 없습니다. 네트워크 선을 뽑아도 영상은 계속 열립니다. \
\
이 사이트의 다른 어떤 페이지보다 여기서 그 사실이 중요합니다. DICOM 파일은 헤더에 환자 이름과 생년월일과 등록번호를 담고 있어서, 그것을 뷰어에 올린다는 것은 낯선 사람에게 그림이 아니라 진료 기록을 건넨다는 뜻입니다.

### 어떤 DICOM 파일을 열 수 있나요?

기본 transfer syntax 세 가지 — implicit과 explicit little endian, 그리고 폐기된 big endian — 의 비압축 파일에, deflated, RLE Lossless, baseline JPEG, JPEG Lossless까지 열립니다. 마지막 것이 병원 디스크에 담긴 CT와 MRI 검사 대부분이 압축된 방식입니다. \
\
JPEG 2000, JPEG-LS, 그리고 동영상에 쓰이는 MPEG과 HEVC 계열은 디코딩하지 못합니다. 그것들은 컴파일된 라이브러리 수 메가바이트가 필요한 코덱이고, 필요할 때 그것을 받아 오는 페이지는 오프라인에서 동작하는 페이지가 아닐 것입니다. 그런 형식의 파일도 열리기는 합니다. 헤더 전체를 읽어서 보여 주고, 그림 자리에는 코덱 이름을 밝힌 한 줄이 들어갑니다. 아무 말도 해 주지 않는 깨진 이미지 아이콘 대신입니다.

### ‘창과 레벨’이 무엇이고 왜 필요한가요?

CT 한 장에는 서로 다른 값이 사천 개쯤 들어 있고 화면은 회색 이백쉰여섯 단계를 보여 줍니다. 그 사천 개 중 어느 구간이 그 이백쉰여섯을 모두 차지할 것인가를 고르는 것이 **창**입니다. 그 아래는 전부 검정, 위는 전부 흰색, 사이에 있는 것이 회색들에 펼쳐집니다. \
\
같은 파일이 설정 두 가지에서 다른 영상처럼 보이는 이유가 그것이고, 폐와 뼈를 동시에 볼 수 없는 이유도 그것입니다. CT의 숫자는 하운스필드 단위이고 절대적으로 정의되어 있습니다. 물이 0이고 공기가 −1000입니다. 그래서 이 페이지의 이름 붙은 창들은 영상의학과 의사가 판독 장비에서 쓰는 것과 같은 숫자입니다. MRI나 초음파에는 그런 척도가 없고, 열릴 때의 창은 파일 자신이 요청하는 창입니다.

### 제 계측이 왜 픽셀로 나오나요?

그 파일이 픽셀 하나의 크기를 밝히지 않아서입니다. 그것을 담는 필드가 Pixel Spacing (0028,0030)이고 단위는 밀리미터인데, 아주 많은 초음파 영상과 스캔한 문서와 secondary capture에는 그 필드가 그냥 없습니다. \
\
있는 경우에는 계측이 밀리미터로 나오고 축마다 자기 간격으로 재는데, 픽셀이 정사각형이 아닌 영상에서는 그것이 중요합니다. 없는 경우에 정직한 답은 픽셀 수이고, 배율을 골라서 결과를 길이인 양 내놓는 대신 그렇다고 말합니다.

### 폴더를 열었더니 여러 시리즈로 나뉘었습니다. 왜죠?

안에 들어 있는 것이 그러해서입니다. 한 검사는 시리즈로 이루어집니다. 스카우트 영상, 그다음에 촬영이나 재구성마다 하나씩입니다. 그리고 모든 파일은 자기가 어느 시리즈에 속하는지를 Series Instance UID (0020,000E)에 적어 둡니다. 목록은 폴더가 아니라 그것으로 만들어집니다. 폴더는 보통 전부 뒤섞인 이름 목록이니까요. \
\
시리즈 안에서 장의 순서는 각 장이 몸의 어디에 있는지로 정해지고, 그것은 Image Position과 Image Orientation에서 나옵니다. Instance Number가 뻔한 기준이지만 첫 번째가 아니라 대비책입니다. 그 번호는 파일을 쓴 무언가가 매기는 것이고, 환자가 누운 방향과 같은 방향으로 갈 이유가 없습니다.

### ‘무엇이 환자를 가리키는가’ 목록은 무슨 뜻인가요?

영상 속 사람의 이름을 적었거나 그 사람이 누구인지 좁히는 필드를, 이 기기 위의 이 파일에서 읽어 모두 적은 것입니다. 목록의 근거는 DICOM 표준의 PS3.15입니다. 어떤 데이터셋을 비식별화되었다고 부르려면 무엇이 빠져야 하는지를 정한 부분입니다. \
\
이것이 있는 이유는, 사람들이 틀리는 지점이 영상에 이름이 들어 있다는 사실이 아니기 때문입니다. 그 밖에 얼마나 더 들어 있느냐가 문제입니다. 생년월일, 접수번호, 의뢰 의사, 기관, 장비 일련번호, 그리고 검사 UID들이 있는데, 그 UID는 파일을 만든 아카이브로 정확히 되돌아가는 열쇠입니다. 이름만 지운 영상은 익명이 아닙니다. \
\
이 도구는 보여 줄 뿐입니다. 아무것도 쓰지 않고 아무것도 바꾸지 않으므로, 그중 어느 것도 빼 줄 수 없습니다.

### 영상을 익명화할 수 있나요?

못 하고, 할 수 있는 척도 일부러 하지 않습니다. 이 페이지는 읽습니다. DICOM 파일을 쓰는 코드가 없습니다. 이 페이지가 하는 일은 당신의 파일에 정확히 무엇이 들어 있는지 알려 주는 것이고, 그것이 알아내기 어려운 부분이자 사람들이 틀리는 부분입니다. \
\
식별 정보를 빼내는 도구는 기준이 훨씬 높은 별개의 작업입니다. 픽셀은 건드리지 않으면서 파일을 다시 쓰고, 검사 전체에 걸쳐 UID를 일관되게 바꾸고, 일부 장비가 이름의 두 번째 사본을 숨겨 두는 비공개 요소까지 맞혀야 합니다. 그것은 뷰어에 덧붙일 일이 아니라 이 사이트의 로드맵에 올라 있는 일입니다.

### .dcm 확장자가 없는 파일이나 깨진 파일도 열리나요?

둘 다 열립니다. 확장자는 보지 않습니다. 확인하는 것은 파일 자체입니다. 흔히 붙는 128바이트 서문 없이 쓰인 데이터셋 — 네트워크에서 바로 받아 온 영상이 그렇게 생겼습니다 — 은 첫 번째 요소에서 인코딩을 알아내어 읽고, 페이지는 그렇게 했다고 말합니다. \
\
중간에서 끊긴 파일은 끊긴 데까지 읽습니다. 손상 이전의 모든 것을 보여 주고, 몇 번째 바이트에서 멈췄는지 적어 둡니다. 뷰어가 가장 아쉬운 경우가 바로 그런 파일이라, 마지막 열두 바이트 때문에 파일 전체를 버리는 것은 잘못된 동작일 것입니다.

### 이것이 판독용 뷰어인가요?

아닙니다. 의료기기가 아니고, 어떤 규제 평가도 거치지 않았으며, 여기 있는 어떤 것도 임상적 판단에 쓰여서는 안 됩니다. 화면은 보정되어 있지 않고, 브라우저는 검증된 렌더링 경로가 아니며, 그 둘 다 웹 페이지 안에서 고칠 수 있는 것이 아닙니다. \
\
대신 사람들이 영상을 여는 다른 모든 이유에는 잘 맞습니다. 디스크에 무엇이 들어 있는지 확인하기, 강의 자료나 논문에 쓸 한 장 꺼내기, 헤더 읽기, 다른 프로그램이 왜 이 파일을 거부하는지 알아보기, 그리고 영상이 그 사람에 대해 무엇을 지니고 있는지 보기입니다.

### 제 파일을 바꾸나요?

아닙니다. 이 도구는 읽기만 합니다. 결과 파일도, 재인코딩도 없고, DICOM을 쓰는 버튼도 여기에는 없습니다. 내려받을 수 있는 것은 화면에 보이는 영상의 PNG와 헤더의 일반 텍스트 사본입니다. 원본은 디스크에 그대로 있습니다.

### 무료인가요? 계정이 필요한가요?

무료이고, 계정도 로그인도 체험판도 없습니다. 파일 크기에도, 여는 파일 개수에도 제한이 없습니다. 이 기기의 메모리 말고는요. 이 사이트는 광고로 운영되고, 광고 쪽에는 파일에 대한 것이 전해지지 않습니다.

### 오프라인에서 작동하나요?

예. 페이지를 한 번 불러온 다음 인터넷을 끊어도 계속 동작합니다. 아무것도 업로드되지 않는다는 것을 보이는 가장 간단한 방법이기도 합니다. 영상을 어딘가로 보내 그려 오는 도구였다면 선을 뽑는 순간 멈췄을 테니까요.

## 이 약속을 직접 확인하는 방법

- **영상이 갈 곳이 없습니다.** Content-Security-Policy에는 이 페이지가 접속할 수 있는 주소가 모두 적혀 있고, 그중 이 사이트의 것은 하나도 없습니다. 파일이 모일 만한 엔드포인트가 여기에는 없고, 설령 있다 해도 그것을 보낼 코드가 없습니다. 예전에는 `connect-src 'none'` 이라고 적혀 있었고 그것은 절대적이었습니다. 광고를 넣으면서 그것을 잃었고, 그 사실을 말하는 것까지가 약속입니다.
- **다른 페이지들보다 여기서 더 무겁게 걸리는 이야기입니다.** DICOM 파일은 메타데이터가 붙은 그림이 아닙니다. 그림이 들어 있는 진료 기록입니다. 환자 이름, 생년월일, 등록번호, 접수번호, 검사를 낸 의사, 기관, 장비 일련번호가 모두 헤더의 필드이고, 파일이 어디로 가든 함께 따라갑니다. 그것을 보려고 어느 사이트에 올린다는 것은 그 사이트를 운영하는 사람에게 그 전부를 넘긴다는 뜻입니다. 이 페이지는 바로 그 일을 하지 않기 위해 있습니다.
- **읽는 쪽은 이 저장소의 파일 열네 개입니다.** 여기에는 어디선가 받아 온 라이브러리를 쓰는 부분이 없습니다. `src/dicom.js`가 파일을 훑고, `src/dictionary.js`가 태그의 이름을 알고, `src/pixels.js`가 바이트를 다시 측정값으로 되돌리고, `src/rle.js`와 `src/jpeg-lossless.js`가 이 페이지가 풀 수 있는 두 가지 압축 형식을 펴고, `src/window.js`가 측정된 값을 화면의 회색에 대응시킵니다.
- **식별 정보는 당신에게만 나열됩니다.** 이 페이지는 영상 속 사람을 지목하거나 좁히는 필드를 모두 적어서 보여 줍니다. 한 장을 어딘가에 보내려는 사람에게 꼭 필요한 답인데도 어느 뷰어도 대답해 주지 않기 때문입니다. 그것은 눈앞의 화면에 나올 뿐 다른 어디로도 가지 않습니다. 이 저장소에는 그 내용을 실어 나르는 분석 이벤트가 없고, 있었다 해도 이 페이지는 그것을 보낼 수 없습니다.
- **읽습니다. 쓰지 않습니다.** 여기에는 파일을 바꾸는 버튼이 없고, 바꿀 수 있는 코드도 없습니다. 가져갈 수 있는 것은 화면에 보이는 영상의 PNG와 헤더의 텍스트 사본이고, 둘 다 이미 페이지에 있는 것으로 이 안에서 만듭니다. 원본은 디스크에 그대로 있습니다. 탭을 닫으면 어떻게 되느냐는 물음에 대한 정직한 답도 그것입니다.
- **구글이 무엇을 불러오고, 무엇을 받지 못하는가.** 광고와 측정 스크립트는 구글에서 옵니다. 둘 중 어느 쪽에도 파일에 대한 것은 전해지지 않습니다. 픽셀도, 축소판도, 이름도, 태그도, 환자도, 파일 이름도 아닙니다. 영상을 해석하고 디코딩하고 그리는 모든 줄은 이 출처에서 제공되고 저장소에 적혀 있습니다.
- **후원 버튼이 무엇을 불러오고, 무엇을 받지 못하는가.** 상단의 “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`입니다. 그 어느 것에도 네트워크에 닿을 수 있는 줄은 없습니다.
