[png] ImageMagick 및 명령 줄 프롬프트를 사용하여 투명한 배경 설정

이미지 (PNG 또는 JPG)가 있다고 가정합니다. 이 이미지에는 흰색 배경이 있으며이 배경을 투명하게 만들어야합니다.

다음 예제를 시도했습니다.

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

그러나 바람직한 결과는 없습니다.

어떻게 만들 수 있습니까?

중요 : convert명령 줄 사용.



답변

Ubuntu 12.04에서 ImageMagick 6.6.9-7을 사용하고 있습니다.
나를 위해 일한 것은 다음과 같습니다.

convert test.png -transparent white transparent.png

test.png의 모든 흰색이 투명하게 변경되었습니다.


답변

나는 같은 문제가 있었다. ImageMagick을 사용하여 jpg / png 이미지 형식에서 흰색 배경을 제거해야합니다.

나를 위해 일한 것은 다음과 같습니다.

1) 이미지 형식을 png로 변환 : convert input.jpg input.png

2) convert input.png -fuzz 2% -transparent white output.png


답변

해결책

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의 출력 예입니다.

bg_removal 스크립트 : 수염이 있지만 앤티 앨리어싱이 없습니다.


답변

이것은 나를 위해 작동합니다.

convert original.png -fuzz 10% -transparent white transparent.png

보풀 %가 작을수록 진 백색에 가까워 지거나 반대로 %가 클수록 흰색의 변화가 더 투명 해집니다.


답변

이것을 사용하여 배경을 투명하게 만들 수 있습니다.

convert test.png -background rgba(0,0,0,0) test1.png

위는 지사에게 투명한 배경을 제공합니다.


답변

ImageMagick을 사용하면 이것은 hackerb9 코드 및 결과와 매우 유사하지만 약간 더 간단한 명령 줄입니다. 왼쪽 상단 픽셀이 배경색이라고 가정합니다. 배경을 투명도로 채운 다음 알파 채널을 선택하고 흐리게 처리하고 -level 50×100 %를 사용하여 흐리게 처리 된 영역의 절반을 제거합니다. 그런 다음 모든 채널을 다시 켜고 갈색에 대해 평평하게 만듭니다. -blur 0x1 -level 50×100 %는 알파 채널 투명도의 경계를 앤티 앨리어싱하는 역할을합니다. 퍼즈 값, 블러 양 및 -level 50 % 값을 조정하여 앤티 앨리어싱 정도를 변경할 수 있습니다.

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg

여기에 이미지 설명 입력


답변

투명도 수준을 제어하려면 rgba를 사용할 수 있습니다. 여기서 a는 알파입니다. 투명은 0이고 불투명은 1입니다. 투명성을 위해 최종 출력 파일에 .png 확장자가 있어야합니다.

convert
  test.png
    -channel rgba
    -matte
    -fuzz 40%
    -fill "rgba(255,255,255,0.5)"
    -opaque "rgb(255,255,255)"
       semi_transparent.png