결제 웹훅이 계속 실패했고, 결제 대행사의 지원 양식은 대시보드 스크린샷을 요구했다. 스크린샷에는 오류 화면뿐 아니라 이벤트 로그에 찍힌 실제 시크릿 키, 계정 소유자의 이메일, 고객 이름까지 그대로 담겨 있었다. 그래서 키에는 이미지 편집기로 급하게 모자이크를 씌우고, 이메일에는 블러를 넣은 뒤 티켓을 접수했다.

3주 뒤 그 티켓이 공개 상태 페이지 게시글에 그대로 인용됐다. 키를 가린 모자이크는 알려진 글꼴, 알려진 크기, 알려진 브라우저로 렌더링된 고정폭 텍스트 위에 16픽셀 셀 단위로 박스 평균을 낸 결과였다. 즉 디픽셀화(depixelation) 도구가 정확히 노리는 입력값이었다.

모자이크와 블러는 대충 훑어보는 시선은 가리지만, 원본 정보의 상당 부분을 그대로 남긴다. 이미지에 모자이크를 넣거나 특정 영역을 블러 처리하거나 스크린샷을 가리기 전에, 각 효과가 픽셀에 실제로 어떤 일을 하는지, 어느 쪽이 복원될 수 있는지, 제대로 가려도 무엇이 새는지 알아 둘 필요가 있다.

이미지 모자이크 처리하기 →

이미지 어느 부분을 가려야 할 때

가릴 대상이 텍스트인지 아닌지에 따라 써야 할 효과가 달라진다.

상황가려야 할 대상사용할 효과
AI 챗봇, 지원 티켓, 포럼 게시글용 스크린샷API 키, 토큰, 비밀번호, 계정 ID단색 채우기
운영 데이터가 노출된 버그 리포트고객 이름, 이메일, 주문번호, 내부 호스트명단색 채우기
튜토리얼·문서용 스크린샷본인 이메일, 워크스페이스 이름, 결제 정보단색 채우기
카카오톡 대화 캡처를 공유하기 전상대방 이름, 전화번호, 계좌번호 등 개인정보단색 채우기
블로그용 거리·행사·사무실 사진행인의 얼굴사진 모자이크나 블러를 크게, 신원 보호가 중요하면 단색 채우기
자동차·주차장 사진번호판단색 채우기(번호판은 표준 서체로 된 짧은 텍스트다)
플레이스홀더, 썸네일, 레트로 이미지스타일을 위한 이미지 전체”전체 이미지에 적용”으로 모자이크
스포일러 또는 민감한 미리보기 이미지부드럽게 처리한 이미지 전체”전체 이미지에 적용”으로 블러

사람이 읽을 수 있는 내용이라면 단색 채우기를 써야 한다. 모자이크와 블러는 텍스트가 아닌 대상, 그리고 비주얼 스타일을 위한 효과다.

세 가지 효과의 작동 원리

이미지 모자이크 도구는 이미지를 Canvas 2D 컨텍스트에 불러온 뒤, 사각형을 하나 이상 드래그해서 지정하면 모든 사각형에 같은 효과를 적용한다. 설정을 바꿀 때마다 원본으로 디코딩된 이미지를 다시 그리고 효과를 처음부터 새로 적용하므로, 결과가 이전 버전 위에 겹쳐 쌓이는 일은 없다.

모자이크: 블록 평균화

모자이크는 선택한 영역을 지정한 블록 크기(4~64픽셀, 기본값 16)의 정사각형 셀로 나눈다. 각 셀마다 안에 있는 모든 픽셀의 R, G, B, 알파 값을 더하고 픽셀 수로 나눈 뒤, 그 평균 색으로 셀 전체를 칠한다. 반투명 픽셀은 색 채널을 알파로 가중하므로, 완전히 투명한 픽셀이 셀을 어둡게 만들지 않는다.

알아 둘 만한 세부 사항이 두 가지 있다.

  • 격자는 각 영역의 왼쪽 위 모서리에서 시작한다. 위치가 다른 두 사각형을 그리면, 두 격자는 서로도 이미지 원점과도 정렬되지 않는다.
  • 가장자리 셀은 남는 만큼만 채운다. 영역 너비가 100픽셀이고 블록 크기가 16이면 마지막 열의 셀은 4픽셀 너비가 된다. 이런 가장자리 셀은 자기 안의 픽셀만 평균 내며, 사각형 바깥의 픽셀은 절대 읽지 않는다.

이것은 선형 박스 필터(linear box filter)다. 출력되는 모든 셀은 입력 픽셀들의 고정된 균등 가중 평균이다. 같은 입력과 같은 격자는 항상 같은 결과를 내는 결정적(deterministic) 연산이며, 복원 공격이 성립하는 근거가 바로 여기에 있다.

320 × 32픽셀 영역을 16픽셀로 모자이크 처리하면 20 × 2, 즉 40개의 평균 색상 셀이 남는다. 고정폭 텍스트 한 줄 기준으로는 원래 어떤 글자가 있었는지 짐작할 정보가 상당히 많이 남는 셈이다.

블러: 축소 후 확대

블러 효과는 반지름 2~40픽셀(기본값 12)을 사용한다. 가우시안 컨볼루션(Gaussian convolution)을 쓰지 않는다. 대신 선택 영역을 ceil(width / radius) × ceil(height / radius) 픽셀 크기의 작은 임시 캔버스에 고품질 스무딩을 켠 채로 그린 다음, 그 축소 이미지를 다시 원래 크기로 확대해 영역 위에 그린다. 이때도 스무딩은 켜져 있다.

결과물은 부드러워 보인다. 셀 사이의 경계가 보간(interpolation)으로 매끄럽게 처리되기 때문이다. 하지만 실제로 저장되는 정보를 보면, 원본에서 대략 radius × radius 크기 정사각형마다 샘플 하나꼴이다. 이는 같은 반지름 값을 블록 크기로 쓴 모자이크와 정보량 자릿수가 같다. 블러는 가장자리를 매끄럽게 다듬은 모자이크일 뿐, 남는 정보량은 거의 그대로다.

모자이크와 마찬가지로 블러도 선택한 사각형 안의 픽셀만 읽으므로, 바깥의 색이 섞여 들어오는 일은 없다.

단색 채우기: 완전 대체

단색 채우기는 색상 선택기에서 고른 불투명한 단색(기본값 검정)으로 사각형을 통째로 칠한다. 원본 픽셀의 평균값도, 샘플도, 흔적도 전혀 남지 않는다.

미리보기에 표시되는 점선 테두리는 화면에만 그려진다. 다운로드와 복사는 이 테두리 없이 별도의 캔버스에서 이미지와 효과를 다시 렌더링한 결과물을 사용한다.

각 효과가 끝난 뒤 남는 것

효과영역에 남는 것복원 가능 여부
모자이크(블록 크기 b)b × b 셀마다 평균 색상 하나텍스트: 가능. 연구와 공개 도구에서 반복적으로 입증됨. 얼굴: 학습된 모델이 알아보는 경우가 많음
블러(반지름 r)r × r 정사각형마다 매끄럽게 처리된 샘플 하나모자이크와 동일. 스무딩이 정보를 없애지는 않는다
단색 채우기없음불가능

모자이크와 블러가 복원될 수 있는 이유

두 효과 모두 손실 압축이다. 여러 원본이 같은 블록 결과를 만들어 낼 수 있으므로, 수식을 거꾸로 돌려서 원본을 구할 수는 없다. 그런데 복원 공격은 애초에 역산을 시도하지 않는다. 후보를 추측하고, 그 추측에 같은 필터를 적용한 뒤, 결과를 비교할 뿐이다. 알려진 글꼴로 된 텍스트처럼 가능한 원본의 경우의 수가 적을 때는 이 추측 방식이 상당히 잘 통한다.

Depix: 렌더링한 알파벳과 블록 대조하기

Depix는 2020년 12월 spipm이라는 개발자가 GitHub에 공개했다. 프로젝트 설명에 따르면 “모자이크 처리된 스크린샷에서 평문을 복원하는 기법의 PoC”다. 대상은 선형 박스 필터로 모자이크 처리된 이미지인데, 이는 이 글의 모자이크 효과가 쓰는 필터와 같은 종류다.

사용법은 이렇다. 예상되는 문자들의 드 브루인 수열(De Bruijn sequence)을 대상과 같은 글꼴 설정(같은 텍스트 크기, 비슷한 글꼴, 같은 색상)으로 렌더링한 검색용 이미지를 만든다. Depix는 이 검색 이미지를 모자이크 처리한 뒤, 스크린샷의 블록과 일치하는 블록을 찾고, 인접한 블록들을 참고해서 후보 사이에서 판단을 내린다.

README에는 한계도 명시돼 있다. 텍스트가 블록 경계에 정확히 맞아떨어져야 하고, 글꼴과 때로는 화면 설정까지 알고 있어야 하며, 추가로 압축이 걸리면 무력화된다. 현재 GitHub 저장소는 아카이브 상태이고, 개발은 Codeberg로 옮겨 갔다.

Unredacter: 오프셋 전수 대입

2022년 2월, Bishop Fox의 Dan Petro가 Never Use Text Pixelation To Redact Sensitive Information이라는 글과 함께 Unredacter라는 도구를 공개했다. 대상은 Jumpsec 연구원이 낸 챌린지 이미지로, 텍스트가 5픽셀 블록으로 모자이크 처리돼 있었다. Unredacter는 한 글자씩 추측한다. 문자를 렌더링하고 모자이크를 적용한 뒤, 가려진 이미지와 얼마나 일치하는지 측정하는 식이다. 텍스트가 블록 격자와 정렬돼 있지 않았기 때문에 가능한 모든 격자 오프셋도 함께 시험했는데, 블록 크기가 5일 때는 오프셋 후보가 25가지뿐이라 충분히 전수 대입할 수 있었다.

이 도구(이미지 모자이크)에서는 격자가 사용자가 그린 사각형의 모서리에서 시작하므로, 텍스트와의 정렬은 사실상 무작위다. 어차피 Unredacter는 모든 오프셋을 다 시험해 본다.

해당 글의 권고는 명확하다. “텍스트를 가려야 한다면 전체 텍스트를 덮는 검은 막대를 써라. 그 외의 방법은 절대 쓰지 마라.”

은닉 마르코프 모델: 더 큰 블록, 노이즈, 블러도 예외 없다

학계 결과는 더 이전에 나왔다. Steven Hill, Zhimin Zhou, Lawrence Saul, Hovav Shacham이 쓴 On the (In)effectiveness of Mosaicing and Blurring as Tools for Document Redaction은 Proceedings on Privacy Enhancing Technologies 2016년 4호에 실렸다. 이 논문은 음성 인식에서 가져온 은닉 마르코프 모델(hidden Markov model)로 가려진 텍스트를 모델링한다.

  • 이 방법은 18포인트 글꼴로 렌더링된 영어 문장을, 그보다 큰 24포인트 크기의 모자이크로 가린 상태에서도 읽을 수 있는 텍스트로 복원해 냈다. 격자가 글꼴 크기보다 성겨도 텍스트가 안전해지지는 않는다.
  • 이미지를 품질 0%짜리 JPEG로 압축해 열화시킨 뒤에도 읽을 수 있는 텍스트를 복원해 냈다. 가린 이미지를 저품질 JPEG로 저장해도 보호되지 않는다는 뜻이다.
  • 블러 처리된 텍스트를 공격할 때는 먼저 블러 영역에 모자이크를 한 번 더 적용한 뒤 같은 방법을 쓴다. 블러 역시 텍스트를 보호해 주지 못했다.

논문의 결론은 이렇다. “모자이크와 블러는 널리 쓰이고 있음에도 불구하고 텍스트 가리기 수단으로는 실효성이 없다.”

얼굴도 안전하지 않다

얼굴 이미지에 관해서는 Richard McPherson, Reza Shokri, Vitaly Shmatikov가 2016년 9월 arXiv에 발표한 Defeating Image Obfuscation with Deep Learning이 관련 연구다. 이들은 모자이크, 유튜브 방식 블러, P3 암호화 방식으로 보호된 이미지에서 얼굴을 식별하고 사물·손글씨 숫자를 인식하도록 신경망을 학습시켰다.

이 공격은 선명한 얼굴을 재구성하지 않는다. 대신 가려진 얼굴이 이미 알려진 어떤 인물인지 식별해 낸다. 블록 크기를 크게 하면 지나가는 사람이 낯선 얼굴을 알아보지 못하게 막을 수는 있다. 하지만 등장인물들의 사진으로 학습된 모델이 그 얼굴을 매칭해 내지 못한다는 보장은 되지 않는다. 신원 보호가 정말로 중요하다면 얼굴에도 단색 채우기를 써야 한다.

함정과 예외 상황

  1. 모자이크 처리된 텍스트는 블록 크기와 무관하게 복원될 수 있다. 블록이 클수록 추측이 어려워지긴 하지만, 앞서 본 HMM 연구는 글꼴보다 큰 모자이크에서도 텍스트를 복원해 냈다. 어떤 설정이든 모자이크는 텍스트에 안전하지 않다고 봐야 한다.

  2. 블러가 모자이크보다 강력한 것은 아니다. 부드러운 겉모습만 보면 더 많은 정보가 파괴된 것처럼 느껴진다. 하지만 여기서 블러는 축소 후 확대일 뿐이라 같은 크기의 모자이크와 비슷한 양의 정보를 남기며, 앞의 HMM 논문도 가우시안 블러 텍스트를 먼저 모자이크로 변환해서 처리했다.

  3. 작은 블록과 여유 없는 사각형. 일반적인 UI 텍스트에 4~8픽셀 블록을 쓰면 단어 형태를 눈으로 읽어 낼 수 있는 경우가 많다. 사각형은 여유를 두고 그려야 한다. 텍스트보다 1픽셀이라도 짧게 그리면 키가 큰 글자의 윗부분이나 디센더(descender)의 아랫부분이 그대로 남는다. 이 도구는 어느 한 방향이라도 2픽셀보다 작은 사각형은 버리므로, 잘못 클릭해도 빈 영역이 추가되지는 않는다.

  4. 검은 막대는 길이를 드러낸다. 텍스트에 딱 맞춘 단색 막대는 원래 글자가 몇 자였는지 보여 준다. 고정폭 글꼴이라면 정확한 길이 그대로다. PIN처럼 짧은 정보를 가릴 때는 막대를 텍스트보다 넓게 그려야 한다.

  5. 원본 파일에 남은 메타데이터. 사진에는 카메라 기종, 촬영 시각, 그리고 흔히 GPS 좌표까지 담긴 EXIF 데이터가 붙어 있다. 이 도구가 내보내는 파일은 픽셀만으로 Canvas API가 새로 인코딩한 결과물이라, 원본의 EXIF, GPS, 카메라 정보는 전혀 함께 기록되지 않는다. 이미지는 EXIF 방향 정보가 적용된 상태로 디코딩되므로, 방향 태그가 사라진 뒤에도 회전된 휴대폰 사진은 올바른 방향으로 내보내진다. 다만 픽셀 밖에서 여전히 정보를 남기는 두 가지가 있다.

    • 파일명. 다운로드 파일은 원본 파일명을 그대로 유지한 채 -pixelated를 붙인다. 즉 passport-jane-doe.jpg는 passport-jane-doe-pixelated.png가 된다. 붙여넣은 이미지는 pasted-image-pixelated라는 이름이 붙는다. 파일명 자체가 누군가를 특정한다면 공유 전에 이름을 바꿔야 한다.
    • 원본 파일. 가리기 처리는 새 파일을 만들 뿐이다. 가리지 않은 원본은 디스크와 스크린샷 폴더, 어쩌면 클라우드 사진 백업에도 그대로 남아 있다.
  6. 파일 컨테이너 안에 숨은 데이터. 눈에 보이는 픽셀이 파일에 담긴 데이터의 전부가 아닐 수도 있다. 2023년 aCropalypse 취약점은 구글 픽셀의 마크업 편집기(CVE-2023-21036)와 윈도우 캡처 도구(CVE-2023-28303)가 자른 이미지를 원본 파일 위에 덮어쓰면서 파일을 자르지(truncate) 않아, 잘려 나간 원본 이미지의 일부가 파일 끝부분에 그대로 남아 복원 가능했던 사례를 보여 줬다. Canvas로 내보낸 파일은 이 문제가 없다. 렌더링된 픽셀로부터 새로 만들어진 파일이기 때문이다. 다만 제자리에 덮어쓰는 방식으로 저장하는 다른 편집기에서 이미지를 가렸다면, 깨끗한 사본을 다시 내보낼 가치가 있다.

  7. 스크린샷 나머지 부분에 남는 2차 유출. 검게 지운 비밀 정보가 같은 이미지의 다른 위치에 그대로 보이는 경우가 흔하다.

    • 문서 이름, 티켓 제목, 사용자 이름이 그대로 뜨는 브라우저 탭 제목과 창 제목.
    • 쿼리 문자열에 토큰이나 이메일 주소가 담긴 주소창.
    • 단축키를 누른 순간 화면에 떠 있던 자동완성 드롭다운, 알림 토스트, 채팅 미리보기.
    • 최근 파일 목록, 이미지 미리보기 패널, 사이드바의 메시지 미리보기 같은 썸네일.
    • 터미널, 로그 한 줄, 네트워크 패널 아래쪽에 다시 등장하는 같은 키.
    • 반사. Private Eye(Yan Long 외, 2022)는 안경에 비친 텍스트를 720p 웹캠으로 촬영해서, 화면상 10mm 크기밖에 안 되는 텍스트도 75% 이상의 정확도로 복원해 냈다는 사실을 보여 줬다. 책상 앞에 앉은 사람을 찍은 사진도 안경, 창문, 광택 있는 표면에 비친 모니터를 담아낼 수 있다.

    공유하기 전에는 이미 가린 영역만이 아니라 이미지 전체를 훑어봐야 한다.

  8. 한 번에 한 가지 효과만, 그리고 전체 이미지 스위치. 선택한 효과는 모든 영역에 한꺼번에 적용된다. 같은 이미지에서 얼굴은 모자이크로, 비밀번호는 검게 칠하고 싶다면, 한 효과를 먼저 끝내고 결과를 다운로드한 뒤 그 파일을 다시 불러와 두 번째 효과를 적용해야 한다. 한 번 그린 영역은 이동하거나 크기를 바꿀 수 없다. 마지막 영역을 지우고 다시 그리려면 실행 취소를 쓰면 된다. “전체 이미지에 적용”이 켜진 동안에는 효과가 이미지 전체를 덮고 영역 그리기는 비활성화된다. 체크박스를 해제하면 그려 뒀던 영역이 다시 나타난다.

  9. 움직이는 GIF는 한 프레임만 내보낸다. 브라우저는 움직이는 GIF를 첫 프레임으로만 디코딩하며, 내보내는 결과도 정지 이미지다. 이는 의도된 동작이다. 민감한 내용이 뒤쪽 프레임에 있다면, 영상이나 GIF 도구로 그 프레임을 먼저 추출해야 한다.

  10. HEIC는 Safari에서만 열린다. 이 도구는 브라우저가 디코딩할 수 있는 형식이면 무엇이든 받아들인다. 보통 PNG, JPEG, WebP, GIF, BMP, AVIF가 해당한다. Can I use에 따르면 HEIF/HEIC는 macOS와 iOS의 Safari 17 이상에서만 지원된다. Chrome, Edge, Firefox에서는 HEIC 사진을 불러오면 오류와 함께 실패한다. 먼저 JPEG로 변환하거나 Safari를 사용해야 한다.

  11. 내보내기 형식별 차이. PNG가 기본값이자 스크린샷에 가장 적합한 선택이다. 무손실이라 텍스트 경계가 또렷하게 유지되기 때문이다. JPEG는 투명도를 지원하지 않아 투명 영역이 흰색으로 깔린다. WebP 내보내기는 브라우저의 캔버스 인코더에 따라 달라지는데, MDN 호환성 데이터에는 Safari의 캔버스 WebP 인코딩 지원이 나와 있지 않다. Safari에서 WebP를 선택하면 실제로는 PNG 파일로 저장되므로, Safari에서는 PNG나 JPEG를 골라야 한다. 이미지 복사는 항상 클립보드에 PNG를 넣는다. 브라우저가 클립보드 접근을 차단하면 도구가 이를 알려 주며, 그럴 때는 다운로드를 대신 쓰면 된다.

  12. 너무 큰 이미지. 브라우저는 캔버스 크기에 제한을 둔다. 내보내기가 실패하면 도구가 “내보낼 수 없습니다 — 더 작은 이미지로 시도해 주세요”라고 안내한다. 크기를 줄이고 다시 시도하면 된다.

코드로 직접 구현하기

같은 세 가지 연산은 어떤 이미지 라이브러리에서든 몇 줄이면 구현할 수 있다.

JavaScript: 캔버스에서 블록 평균화

이 도구의 모자이크 효과와 같은 알고리즘이다. 사각형 모서리에 고정된 격자, 남는 만큼만 채우는 가장자리 셀, RGBA에 대한 평균으로 이루어진다. 도구는 색을 알파로 가중하며, 결과가 달라지는 것은 반투명 픽셀이 있는 이미지뿐이다. getImageData와 putImageData를 사용한다.

// 2D 캔버스 컨텍스트의 사각형 (x, y, w, h) 영역을 그 자리에서 모자이크 처리한다.
function pixelateRegion(ctx, x, y, w, h, block) {
  const img = ctx.getImageData(x, y, w, h);
  const d = img.data; // 평탄화된 RGBA, 픽셀당 4바이트
  for (let by = 0; by < h; by += block) {
    for (let bx = 0; bx < w; bx += block) {
      const bw = Math.min(block, w - bx); // 가장자리 셀은 남는 만큼만 채운다
      const bh = Math.min(block, h - by);
      const sum = [0, 0, 0, 0];
      for (let yy = by; yy < by + bh; yy++) {
        for (let xx = bx; xx < bx + bw; xx++) {
          const i = (yy * w + xx) * 4;
          for (let c = 0; c < 4; c++) sum[c] += d[i + c];
        }
      }
      const avg = sum.map((s) => Math.round(s / (bw * bh)));
      for (let yy = by; yy < by + bh; yy++) {
        for (let xx = bx; xx < bx + bw; xx++) {
          const i = (yy * w + xx) * 4;
          for (let c = 0; c < 4; c++) d[i + c] = avg[c];
        }
      }
    }
  }
  ctx.putImageData(img, x, y);
}

// 단색 채우기는 한 줄이면 된다:
// ctx.fillStyle = "#000"; ctx.fillRect(x, y, w, h);

// 캔버스 픽셀로부터 EXIF 없는 깨끗한 파일 내보내기:
// canvas.toBlob((blob) => { /* blob을 다운로드하거나 업로드 */ }, "image/png");

캔버스가 CORS 승인 없이 크로스 오리진 이미지를 그린 상태라면 getImageData는 보안 오류를 던진다. 로컬 파일이나 클립보드에서 불러온 이미지는 이 문제가 없다.

Python: Pillow

Pillow에는 박스 필터가 내장돼 있다. Image.Resampling.BOX로 축소하면 각 셀이 평균 처리되고, NEAREST로 확대하면 평균 낸 픽셀 하나하나가 다시 평평한 사각형으로 펼쳐진다. Image.Resampling은 Pillow 9.1 이상이 필요하다.

from PIL import Image, ImageDraw

def pixelate(img, box, block=16):
    """박스 = (left, top, right, bottom) 영역을 그 자리에서 모자이크 처리한다."""
    region = img.crop(box)
    w, h = region.size
    small = region.resize(
        (max(1, round(w / block)), max(1, round(h / block))),
        Image.Resampling.BOX,  # 각 셀의 단순 평균
    )
    img.paste(small.resize((w, h), Image.Resampling.NEAREST), box[:2])

def black_out(img, box, color="black"):
    # rectangle()은 오른쪽과 아래쪽 경계를 포함한다
    ImageDraw.Draw(img).rectangle(box, fill=color)

img = Image.open("screenshot.png").convert("RGB")
pixelate(img, (40, 60, 360, 140), block=16)  # 사진 속 얼굴
black_out(img, (40, 200, 520, 232))          # API 키
img.save("redacted.png")  # exif= 인자가 없으므로 EXIF가 기록되지 않는다

목표 크기를 반올림하기 때문에 셀 크기는 block 값에 가깝긴 해도 정확히 일치하지는 않는다. 텍스트라면 어차피 black_out을 써야 한다.

Bash: ImageMagick

ImageMagick의 -scale 옵션은 축소할 때 “픽셀 블록 평균화”를 쓰고 확대할 때는 픽셀 복제를 쓰는데, 이 둘을 합치면 두 단계짜리 모자이크가 된다. 특정 영역에만 적용하려면 이미지를 복제하고, 그 영역을 잘라내고, 축소한 뒤 다시 확대해서 원본에 합성하면 된다.

# (40,60) 위치의 320x128 영역을 16px 블록으로 모자이크 처리: 320/16 = 20, 128/16 = 8
magick screenshot.png \
  \( +clone -crop 320x128+40+60 +repage -scale 20x8! -scale 320x128! \) \
  -geometry +40+60 -composite \
  -fill black -draw "rectangle 40,200 520,232" \
  -strip redacted.png

!는 정확한 크기를 강제하므로, 영역 크기가 블록 크기의 배수일 때는 각 블록이 정확히 16 × 16픽셀이 된다. -draw "rectangle ..." 줄이 단색 채우기에 해당한다. -strip은 반드시 남겨 둬야 한다. 출력물에서 EXIF를 포함한 프로필과 코멘트를 모두 제거해 준다.

다른 도구와 비교하면

흔히 대안으로 꼽히는 두 가지는 온라인 모자이크 서비스와 데스크톱 편집기다. 아래 표는 각 제품이 자사 페이지나 문서에서 직접 밝힌 내용만 정리한 것이다.

ZeroTool 이미지 모자이크ResizePixel PixelateGIMP Pixelize 필터
이미지 처리 위치브라우저 탭 안에서 처리. 이미지에 대한 네트워크 요청 없음페이지에 “웹사이트에 업로드”라고 명시. 업로드 폼이 파일을 서버로 전송사용자 컴퓨터(데스크톱 앱)
지원 효과모자이크, 블러, 단색 채우기페이지에는 “이미지 또는 그 일부”에 모자이크 적용이라고 설명Pixelize와 GIMP의 다른 필터들
영역 선택사각형을 원하는 만큼 드래그하거나 전체 이미지 선택”이미지의 선택한 부분”에 블록 크기 적용GIMP 자체 도구 사용
모자이크 옵션블록 크기 4–64px블록 크기블록 너비·높이, X·Y 오프셋, 모양(사각형, 원형, 다이아몬드)
입력 형식브라우저가 디코딩할 수 있는 모든 형식JPG, PNG, WEBP, GIF, TIFF, BMPGIMP가 지원하는 형식
설치 필요 여부없음없음애플리케이션 설치 필요

출처: ResizePixel 모자이크 페이지, GIMP 3.0 Pixelize 문서.

인증 정보가 담긴 스크린샷이라면, 브라우저 탭 안에서 처리한다는 것은 곧 가리기 전 원본이 내 컴퓨터를 벗어나지 않는다는 뜻이고, ZeroTool 페이지는 분석·광고 스크립트도 전혀 불러오지 않는다. 원형 모자이크나 정밀한 격자 오프셋, 그 이상의 편집이 필요하다면 GIMP 쪽이 더 다양한 옵션을 제공한다.

관련 도구

  • 시크릿 마스킹 도구 — 텍스트와 로그의 API 키·토큰을 붙여넣기 전에 가리고, 답변에서 다시 복원
  • EXIF 메타데이터 뷰어 — 원본을 공유하기 전에 이미지에 어떤 카메라·시간·GPS 정보가 담겨 있는지 정확히 확인
  • 이미지 압축기 — 가리기 처리한 스크린샷을 첨부하기 전에 파일 크기 줄이기

더 읽어 보기