중복된 이미지를 삭제해주는 프로그램

난 트위터를 하다가 재밌거나 한 짤(그림)이 보이면 쭉쭉 저장하곤 하는데 이게 쌓인 양이 늘어나다보니 찾기가 힘들어서 폴더별로 분리를 하기 시작했다.
폴더를 분리해도 각 폴더 안에 사진이 1000장 이상 들어가기 시작하면 그래도 찾기가 어려워지는데 그러다가 중복된 짤이 있는 것 같은 느낌이 들었다.

원래는 같은 파일명을 가진 사진이라면 덮어쓰기가 되어 중복해서 들어오지 않겠지만 누군가가 저장했던 사진을 다시 재업로드 하면 그 때는 파일명이 달라지니 어쩔 수가 없었다. 게다가 웬만한 서버에서는 그림파일을 올리면 exif 정보를 날리는 등의 변조를 하므로 파일의 해시값도 달라지게 된다. 그래서 sha1 해시 등을 이용해서 중복된 그림을 찾아 지우는 건 거의 불가능에 가까웠다.

언젠가 파이썬으로 비슷한 이미지를 찾는 글을 찾았는데 이걸 거의 그냥 그대로 이용해서 중복된 이미지를 찾아 지워주는 CLI 프로그램을 하나 작성했다. 비슷한 이미지가 있으면 동일한 것으로 간주하고 가장 해상도가 높은 한 장만 남긴채 나머지를 모두 지워버리게 했다.

원리는 아주 간단하다. 이미지를 흑백 이미지로 바꾼 후에(웬만한 영상처리는 흑백으로 바꾸는 것이 1단계다) 특정한 사이즈로 리사이즈를 한 후(보통 여기까지는 공통사항이다) 각 픽셀마다 오른쪽 픽셀보다 밝은지 아닌지를 Boolean 값으로 저장하면 배열이 나오게 되는데 2진법 수로 변환할 수 있으니 이걸 그냥 hash처럼 이용하면 된다. 좀 더 사이즈를 크게 할수록 미묘한 차이도 감지할 수 있겠지만 예제에 나온 8*8이 적당한 것 같아서 그냥 그대로 썼다.

별로 대단한 건 아니지만 github에 올려뒀고 pip를 통해 설치할 수 있다.

$ pip install imagecleaner;

Synergy를 리눅스에서 쓸 때 스크롤이 먹통이 되는 문제

Synergy를 이용해서 맥과 리눅스의 입력장치를 하나로 묶어서 사용하고 있는데 이게 몇 가지 문제가 있다. 첫 번째로는 윈도우즈에선 UAC 창이 떠서 어두워지면 Synergy도 먹통이 되는 것이고(…) 두 번째는 리눅스에서 스크롤이 이상하게 된다는 것이다.
난 윈도우즈를 거의 안 쓰니 첫 번째는 넘어가기로 하고 두 번째 문제는 스크롤을 그냥 하면 잘 안 되고 엄청 많이 스크롤을 하겠다는듯이 막 돌리면 되는 걸 봐서 임계점이 이상하게 설정된 것 같았다.

구글링을 해보니 대충 고치는 방법이 있기는 했다. 간단히 설명하면 그냥 synergyc에 –yscroll 30을 붙여 실행하는 것이다. 하지만 synergy가 synergyc를 내부적으로 실행하는데 저 방법을 쓰면 synergyc가 또 synergyc.orig를 실행시켜서 synergy 메인 창에서 로그도 제대로 안 뜨고 Start/Stop 버튼도 이상해진다.

하지만 이렇게 하면 아주 간단하게 해결 된다(사실 몇 글자 추가한 게 전부다).

#!/bin/bash
# /usr/bin/synergyc

exec /usr/bin/synergyc --yscroll 30 $*

원본 프로세스를 자식으로 실행하지 않고 그냥 exec를 이용해서 replace 시켜버리면 되는 거였다. 메데타시메데타시.