해결책
color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
\( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
-alpha extract -geometry 200% -blur 0x0.5 \
-morphology erode square:1 -geometry 50% \) \
-compose CopyOpacity -composite -shave 1 outputfilename.png
설명
이것은 이전에 제공된 간단한 답변보다 약간 길지만 훨씬 더 나은 결과를 제공 합니다. (1) 안티 앨리어싱 알파로 인해 품질이 우수하고 (2) 단일 색상이 아닌 배경 만 제거됩니다. ( "배경"은 그림 가장자리의 플러드 필을 사용하여 왼쪽 상단 픽셀과 거의 동일한 색상으로 정의됩니다.)
또한 알파 채널은 후광을 피하기 위해 절반 픽셀만큼 침식됩니다. 물론 ImageMagick의 모폴로지 연산은 (아직?) 서브 픽셀 수준에서 작동하지 않으므로 침식하기 전에 알파 채널을 200 %로 날리고 있음을 알 수 있습니다.
결과 비교
다음은 ImageMagick 로고 에서 실행할 때 간단한 접근 방식 ( "-fuzz 2 % -transparent white")과 내 솔루션을 비교 한 것
입니다. 두 투명 이미지를 새들 브라운 배경에 병합하여 차이점을 명확히했습니다 (원본을 보려면 클릭).
간단한 접근 방식에서 마법사의 수염이 어떻게 사라 졌는지 확인하십시오. 마법사의 가장자리를 비교하여 앤티 앨리어싱 된 알파가 그림이 배경에 부드럽게 혼합되는 데 어떻게 도움이되는지 확인합니다.
물론 더 간단한 솔루션을 사용하고 싶을 때가 있음을 완전히 인정합니다. (예 : 기억하기가 훨씬 쉬우 며 GIF로 변환하는 경우 어쨌든 1 비트 알파로 제한됩니다.)
mktrans 쉘 스크립트
이 명령을 반복해서 입력하고 싶지 않을 것이므로 스크립트로 래핑하는 것이 좋습니다. 내가 제안한 솔루션을 수행하는 github에서 BASH 쉘 스크립트를 다운로드 할 수 있습니다 . 디렉토리의 여러 파일에서 실행할 수 있으며 조정하려는 경우 유용한 주석이 포함되어 있습니다.
bg_removal 스크립트
그런데 ImageMagick은 실제로
내 솔루션과 유사한 방식으로 floodfill을 사용하는 "bg_removal" 이라는 스크립트와 함께
제공됩니다. 그러나 여전히 1 비트 알파를 사용하기 때문에 결과는 좋지 않습니다. 또한 bg_removal 스크립트는 더 느리게 실행되고 사용하기가 조금 더 까다 롭습니다 (두 개의 다른 퍼즈 값을 지정해야 함). 다음은 bg_removal의 출력 예입니다.
convert original.png -transparent white new.png
했지만 시도했을 때 작동하지 않습니다. 제쳐두고, 배경이 실제로 흰색 (#FFFFFF)입니까, 아니면 거의 흰색 (예 : #FEFEFE)입니까?