위에서 파일을 고르면 바로 열립니다.준비됨 — 인터넷을 끊어도 이대로 동작합니다.이 브라우저에서는 쓸 수 없습니다 (나머지는 그대로 동작합니다).오프라인 저장에는 https:// 또는 localhost가 필요합니다.여기서는 저장할 수 없지만, 어느 쪽이든 올라가는 것은 없습니다.파일은 어디로도 가지 않았습니다. 파일 {total}개를 불러왔고 모두 이 사이트의 것입니다. {platform}무언가가 {hosts}에 접속했는데, 이 도구는 절대 그러지 않습니다. 살펴볼 만합니다. {platform}광고와 측정과 후원 버튼을 위한 이 사이트 자신의 스크립트가 호스트 {hosts}곳에서 왔습니다. 그중 어느 쪽도 파일이나 그 1바이트도 받지 않았습니다.광고와 측정과 후원 버튼을 위한 이 사이트 자신의 스크립트가 호스트 {hosts}곳에서 왔습니다. 그중 어느 쪽도 파일이나 그 1바이트도 받지 않았습니다.문제가 생겼습니다: {detail}. 처음부터 다시 하려면 페이지를 새로 고치세요.파일 {count}개를 읽는 중…파일 {count}개를 읽는 중…예시로 해 보기예시를 만드는 중…이 브라우저에서는 예시를 만들지 못했습니다. 대신 파일을 골라 주세요.
영상을 열고 디코딩하는 일은 모두 이 브라우저가 합니다. 헤더도, 픽셀도, 창도, 계측도 그렇습니다. 이 페이지 건너편에는 진료 정보를 보낼 서버가 아예 없어서, 여기 있는 무언가가 보내고 싶어도 보낼 곳이 없습니다. 그리고 이 파일에 대한 어떤 것도 — 환자 이름도, 검사도, 파일 이름도 — 누구에게도 전해지지 않습니다.
✗ 업로드 없음
✗ 계정 없음
✓ 오프라인 작동
✓ 오픈 소스
✓ 파일은 기기에 남습니다
실시간 확인:확인 중…
오프라인:확인 중…
말만 믿지 마십시오. 개발자 도구를 열고 네트워크 탭을 보면서 영상을 열어 보십시오. 이미지도, 태그도, 파일 이름도 실어 나르는 요청은 하나도 없습니다. 아니면 인터넷을 끊고 그냥 열어 보십시오.
이 약속을 직접 확인하는 방법
영상이 갈 곳이 없습니다. 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 브랜치에 그대로 올라가 있고요. 그래서 실제로 제공되는 파일과 소스를 빌드한 결과를 나란히 놓고 비교해 보실 수 있습니다:
먼저 읽어 볼 파일을 꼽자면, Content-Security-Policy는 config/site.toml, 파일을 훑는 파서는 src/dicom.js, 픽셀 디코딩은 src/pixels.js, 병원에서 내보낼 때 대부분 쓰는 코덱은 src/jpeg-lossless.js, 창과 레벨은 src/window.js입니다. 그 어느 것에도 네트워크에 닿을 수 있는 줄은 없습니다.
회사 보안 소프트웨어가 업로드를 경고한다면. 그것은 브라우저에서 파일이 선택되는 순간을 지켜보며, 페이지가 그것을 보낼 생각인지는 알 수 없습니다 — 그래서 고르는 순간에 경고합니다. 여기서는 아무것도 보내지 않습니다. 브라우저 개발자 도구를 열고 네트워크 탭으로 옮긴 뒤 파일을 골라 보세요. 그것을 실어 나르는 요청은 없고, 이 페이지 자체의 로컬 미리보기 말고는 요청 자체가 없습니다. 같은 확인을 IT 팀도 삼십 초면 할 수 있습니다.
영상 고르기
폴더 전체를 한꺼번에 끌어다 놓으면 파일이 각자의 시리즈로 다시 묶이고 순서도 맞춰집니다. 아무것도 업로드되지 않고, 파일에 다시 쓰이는 것도 없습니다.
—
—
100%
이 파일이 무엇인가
객체
—
촬영 방식
—
영상
—
저장 형식
—
Transfer syntax
—
픽셀 간격
—
값의 범위
—
파일
—
이 파일에서 무엇이 환자를 가리키는가
이 파일에서 이 기기에서 읽어 낸 것이고, 다른 누구에게도 보여 주지 않습니다. 이 도구는 아무것도 쓰지 않습니다. 그중 어느 것도 빼 줄 수 없고, 그중 어느 것도 어디로 보낸 적이 없습니다. 이것이 여기 있는 이유는 영상이 이름보다 훨씬 많은 것을 지니고 있어서이고, 나머지가 바로 허술한 익명화에서 살아남는 것들이기 때문입니다.
파일의 모든 태그
이 파일의 모든 요소
태그
VR
이름
값
{name}: {why}{what} ({files}){a} · {b}{width} × {height}{width} × {height}, {frames}{n} {unit}압축 조각 {n}개, {bytes}바이트압축 조각 {n}개, {bytes}바이트{bytes}바이트, 보이지 않음(비어 있음){bytes}바이트: {head}{bytes}바이트: {head} …{n}일{n}일{n}주{n}주{n}개월{n}개월{n}세{n}세MONOCHROME1 (0이 흰색)MONOCHROME2 (0이 검은색)PALETTE COLOR (색 참조표를 가리킴)YBR_FULL (색, 밝기와 두 색차로)YBR_FULL_422 (색, 색차는 절반 너비로)HFS (머리부터, 누운 자세)HFP (머리부터, 엎드린 자세)FFS (발부터, 누운 자세)FFP (발부터, 엎드린 자세)M (남성)F (여성)O (기타){size} ({bytes}){row} × {column} mm(없음)(비공개)(알 수 없음)128번 바이트에 DICM 표식이 없고, 앞쪽 바이트도 DICOM 요소가 아닙니다이 조각은 JPEG SOI 표식으로 시작하지 않습니다JPEG 스캔이 프레임 헤더보다 먼저 왔습니다이 조각은 무손실이 아니라 DCT 기반 JPEG입니다이 조각에는 JPEG 프레임 헤더가 없습니다크기가 없는 JPEG 프레임입니다이 프레임은 성분을 서브샘플링하는데, 여기의 무손실 JPEG는 그것을 지원하지 않습니다{bits}비트짜리 JPEG 프레임으로, 형식이 허용하는 2~16 범위를 벗어납니다이 스캔은 파일이 한 번도 정의하지 않은 허프만 표를 가리킵니다형식이 허용하는 16비트보다 긴 허프만 코드입니다RLE 세그먼트 헤더는 64바이트인데 이 조각은 그보다 짧습니다RLE 프레임이 세그먼트 {count}개를 선언했는데, 형식은 1~15개만 허용합니다이 이미지에는 RLE 세그먼트가 {wanted}개 필요한데 프레임에는 {count}개뿐입니다RLE 세그먼트 {segment}이(가) 조각 바깥을 가리킵니다이 파일은 이미지 크기를 밝히지 않습니다이 파일에는 픽셀 데이터 조각이 없습니다{syntax}은(는) 이 페이지가 풀 수 없는 압축입니다{frame}번 프레임이 픽셀 데이터의 끝을 넘어갑니다{frame}번 프레임을 담은 픽셀 데이터 조각이 없습니다샘플당 {bits}비트인데, 1도 8도 16도 32도 아닙니다이 파일에는 프레임 {frames}개에 대한 픽셀 데이터 조각이 {fragments}개 있고, 어느 것이 어느 프레임에 속하는지 알려 줄 오프셋 표가 없습니다파일이 {available}바이트에서 끝납니다. {at}에서 {wanted}바이트가 더 필요했습니다이 파일에는 DICM 표식이 없어 {syntax}(으)로 된 맨 데이터 집합으로 읽었습니다. 파일이 밝힌 것이 아니라 첫 요소에서 추론한 것입니다.파일 메타 그룹이 전송 구문을 밝히지 않아, 데이터 집합을 Implicit VR Little Endian으로 읽었습니다. 표준이 그렇게 가정하라고 정하고 있습니다.전송 구문 {uid}은(는) 이 도구가 아는 것이 아닙니다. 아래 헤더는 1995년 이후 등록된 모든 구문이 쓰는 Explicit VR Little Endian으로 읽었고, 픽셀은 풀지 못했습니다.{at}번 바이트의 요소 중간에서 파일이 끝납니다. 그 앞은 모두 읽었습니다.{tag} 요소가 정의되지 않은 길이를 선언했는데, 그것은 시퀀스만 할 수 있습니다. 그 뒤로는 아무것도 읽지 못했습니다.{at}번 바이트의 요소는 값이 {length}바이트라고 하는데, 파일에는 {left}바이트만 남아 있습니다.DICOM 헤더 — {name}파일 크기{count}바이트전송 구문객체이미지{bits}비트회색조샘플 {count}개프레임 수픽셀 간격이 파일을 읽으며 남긴 메모파일 메타 정보데이터 집합{origin}에서 브라우저로 읽었습니다. 아무것도 업로드하지 않습니다.영상 위를 가로로 끌면 창이 넓어지거나 좁아지고, 위아래로 끌면 중심이 움직입니다. 두 숫자는 아래에 있고, 직접 입력해도 같습니다.끌어서 영상을 틀 안에서 움직입니다. 마우스 휠로 확대되고, ‘맞추기’가 모두 되돌립니다.영상 위에 선을 그어 잽니다. 파일이 픽셀 간격을 밝혀 두었다면 결과는 밀리미터로, 밝혀 두지 않았다면 픽셀로 나오고 그렇다고 말합니다.{column}열 {row}행에서 {value}{length} px — 이 파일은 픽셀 간격을 밝히지 않아서 밀리미터로 낼 수 없습니다각 장이 몸의 어디에 있는지로 쌓았고, 그것이 장비가 찍은 순서입니다.Instance Number로 쌓았습니다. 이 파일들에는 정렬할 몸에서의 위치가 없습니다.장 사이의 간격이 고르지 않아서, 이 시리즈에는 적어도 한 장이 빠져 있습니다.이 파일의 픽셀은 {codec}으로 압축되어 있습니다. 어느 브라우저도 그것을 디코딩하지 못하고, 이 페이지는 그 디코더를 들고 다니지 않습니다. 파일에 대한 나머지는 모두 아래에 있습니다.영상을 디코딩하지 못했습니다. {reason}. 아래의 헤더는 전부 읽었습니다.이 파일에는 픽셀 데이터가 아예 없습니다. 헤더이고, 그 안의 모든 것이 아래에 있습니다.이 픽셀은 baseline JPEG이라서 브라우저의 디코더가 풀었고, 돌아온 것은 8비트 깊이입니다. 창은 그대로 동작하지만, 장비가 기록한 정밀도가 다 있지는 않습니다.{total}개 중 {shown}개. {hidden}개 더 있습니다.이 파일의 요소 {total}개 전부입니다.‘{query}’에 맞는 요소가 {total}개 있습니다.‘{query}’에 맞는 요소가 하나 있습니다.‘{query}’에 맞는 것이 없습니다.나머지 {count}개 보기비공개 요소이 사전에 없음파일이 말해 주지 않았습니다. 이것은 데이터 사전이 이 태그에 대해 알려 주는 값입니다.{name} 읽는 중…{total}개 중 {at}개 읽는 중…이 중 어느 것도 DICOM으로 읽히지 않았습니다. {why} 이 도구는 DICOM 형식 자체를 읽으므로, 다른 파일에 대해서는 할 말이 없습니다.파일 하나를 건너뛰었습니다. {files}파일 {count}개를 건너뛰었습니다. {files}시리즈 {number}파일 1개파일 {count}개장 사이 간격은 {gap}입니다.{total} 중 {at}영상은 어디로도 가지 않았습니다. 파일 {total}개를 불러왔고 모두 이 사이트의 것입니다. {platform}무언가가 {hosts}에 접속했는데, 이 도구는 절대 그러지 않습니다. 살펴볼 만합니다. {platform}광고와 측정과 후원 버튼을 위한 이 사이트 자신의 스크립트가 호스트 {hosts}곳에서 왔습니다. 그중 어느 쪽도 영상이나 그 픽셀이나 헤더의 한 마디도 받지 않았습니다.광고와 측정과 후원 버튼을 위한 이 사이트 자신의 스크립트가 호스트 {hosts}곳에서 왔습니다. 그중 어느 쪽도 영상이나 그 픽셀이나 헤더의 한 마디도 받지 않았습니다.{total} 프레임 중 {at}인스턴스 {number}파일에서파일에서, {n}이 영상의 전체 범위직접 맞춤연부조직폐뼈뇌간종격혈관조영프레임 {count}개픽셀 데이터 없음이 파일에 적혀 있지 않음부호 있음부호 없음{bits}비트, {sign}, 픽셀당 1채널, {photometric}{bits}비트, {sign}, 픽셀당 {samples}채널, {photometric}{low}에서 {high}까지컬러 — 측정된 값으로 전할 것이 없음이 파일에는 사람의 이름을 적거나 번호를 매긴 것이 없습니다. 영상이 보통 지니는 식별 정보가 없거나 비어 있습니다.그 밖에 자체 식별자 {count}개, 곧 검사와 시리즈와 인스턴스의 UID를 지니고 있습니다. 그중 이름은 하나도 없지만, 하나하나가 이 파일이 나온 아카이브로 정확히 되돌아가는 열쇠입니다.여기에 뜻이 어디에도 공개되지 않은 비공개 요소 {count}개가 더 있습니다. 어떤 장비는 그중 하나에 환자 이름의 두 번째 사본을 넣어 둡니다.복사했습니다.브라우저가 이 페이지의 복사를 막았습니다. 옆의 버튼이 같은 내용을 파일로 씁니다.{name} 저장했습니다.
원하는 결과가 나왔나요?
무엇이 잘못됐나요?
고맙습니다 — 큰 도움이 됩니다.
보내지는 것은 답변뿐이고, 그것도 버튼을 눌렀을 때만입니다. 파일도, 파일 이름도, 파일에 관한 어떤 정보도 보내지 않습니다.
# 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`입니다. 그 어느 것에도 네트워크에 닿을 수 있는 줄은 없습니다.
DICOM 파일 여는 법
파일을 고르십시오..dcm 파일 하나, 아니면 디스크의 폴더 전체입니다. CT나 MRI는 한 장에 파일 하나라서, 전부 한꺼번에 끌어다 놓는 것이 시리즈를 다시 맞추는 방법입니다. 파일은 브라우저가 디스크에서 바로 읽고, 그러는 동안 어디로도 아무것도 보내지 않습니다.
시리즈를 고르십시오. 한 검사에는 보통 여러 개가 들어 있습니다. 스카우트 영상이 있고, 그다음에 촬영마다 하나씩입니다. 각 시리즈는 장비가 찍은 순서대로 쌓이는데, 그 순서는 번호가 아니라 각 장이 몸의 어디에 있는지에서 나옵니다. 번호는 늘 같은 방향으로 매겨지지 않습니다.
창을 맞추십시오. 영상을 읽을 수 있게 만드는 조작이고, 이미지 편집기에는 없는 것입니다. 영상 위를 가로로 끌면 창이 넓어지고 위아래로 끌면 중심이 움직입니다. CT라면 이름이 붙은 창 — 폐, 뼈, 뇌, 연부조직 — 을 골라도 됩니다. CT의 단위는 세상 어느 장비에서나 같습니다.
쌓인 장을 넘기십시오. 영상 아래의 슬라이더가 장을 넘기고, 영상을 한 번 클릭한 뒤에는 화살표 키도 같은 일을 합니다. 여러 프레임이 든 파일 — 초음파 루프나 혈관조영 — 은 옆의 버튼으로 재생됩니다.
무언가를 재 보십시오. 계측으로 바꾸고 선을 그으십시오. 파일이 픽셀 간격을 밝혀 두었다면 답은 밀리미터로 나오고, 정사각형이 아닌 픽셀도 감안합니다. 밝혀 두지 않았다면 답은 픽셀로 나오고 그렇다고 말합니다. 없는 배율을 지어내지 않습니다.
헤더를 읽으십시오. 파일의 모든 요소를 번호와 표준이 부르는 이름과 담긴 값까지, 검색할 수 있게 보여 줍니다. 그 위에는 바로 이 파일에서 무엇이 환자를 가리키는지가 나열됩니다. 이름보다 훨씬 많습니다.
필요한 것을 가져가십시오. 화면에 보이는 영상을 PNG로, 맞춘 창 그대로, 아무것도 태워 넣지 않고 가져가거나, 헤더 전체를 일반 텍스트로 가져갑니다. 둘 다 이미 페이지에 있는 것으로 이 안에서 만듭니다.
자세한 설명
DICOM 파일 여는 법, 그리고 그 안에 무엇이 있는지병원 CD에 무엇이 들어 있는지, 파일에 왜 확장자가 없는지, .dcm 영상을 브라우저에서 어떻게 여는지, 창과 레벨이 실제로 무슨 일을 하는지, 그리고 영상이 그림 말고 환자에 대해 무엇을 지니고 있는지.
아닙니다. 파일을 읽고 디코딩하고 그리는 일은 모두 이 브라우저가 이 기기의 하드웨어에서 합니다. 이 도구에는 서버 쪽이 없고, 페이지의 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와 헤더의 일반 텍스트 사본입니다. 원본은 디스크에 그대로 있습니다.
무료인가요? 계정이 필요한가요?
무료이고, 계정도 로그인도 체험판도 없습니다. 파일 크기에도, 여는 파일 개수에도 제한이 없습니다. 이 기기의 메모리 말고는요. 이 사이트는 광고로 운영되고, 광고 쪽에는 파일에 대한 것이 전해지지 않습니다.
오프라인에서 작동하나요?
예. 페이지를 한 번 불러온 다음 인터넷을 끊어도 계속 동작합니다. 아무것도 업로드되지 않는다는 것을 보이는 가장 간단한 방법이기도 합니다. 영상을 어딘가로 보내 그려 오는 도구였다면 선을 뽑는 순간 멈췄을 테니까요.