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


120

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

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

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

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

어떻게 만들 수 있습니까?

중요 : convert명령 줄 사용.


이상한-관련 명령이 있다고 생각 convert original.png -transparent white new.png했지만 시도했을 때 작동하지 않습니다. 제쳐두고, 배경이 실제로 흰색 (#FFFFFF)입니까, 아니면 거의 흰색 (예 : #FEFEFE)입니까?
mathematical.coffee

@ mathematical.coffee 알겠습니다. 이것이 사실이 아닌지 확인하고이 스레드를 계속하겠습니다. 감사합니다.
이스라엘

@ mathematical.coffee 안녕하세요, 저는 색상을 확인했고이 이미지에는 #FFFFFF, 즉 "흰색"과 같은 배경이 있습니다. :( 그렇지 않습니다!
Israel

답변:


140

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

convert test.png -transparent white transparent.png

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


6
이것은 JPG가 투명하지 않다는 것을 깨달을 때까지 저에게 효과가 없었습니다. PNG로 전환 한 후에는 내가 원하는대로 정확히 수행했습니다. "white"를 "rgb ($ r, $ g, $ b)"로 변경하면됩니다.
Roger Dueck

2
젠장! 이것은 훌륭합니다!
agilob

2
이것은 배경을 투명하게 변환 할뿐만 아니라 모든 흰색 픽셀로 변환합니다. 배경을 투명하게 만 변환하는 방법이 있습니까?
Alejandro Lozdziejski

2
@AlejandroLozdziejski- "배경"을 어떻게 정의하고 있습니까?
Jules

1
@AlejandroLozdziejski : 좋은 질문입니다. 가장자리에서 플러드 필을 사용하는 내 솔루션을 참조하여 왼쪽 상단 픽셀과 거의 동일한 색상을 찾으십시오.
hackerb9

79

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

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

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

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


6
투명한 배경과 불투명 한 전경 사이의 가장자리를 더 매끄럽게하는 것이 좋습니다. JPG의 시끄러운 아이콘을 PNG로 변환하고 투명도를 추가하려면 몇 가지 중앙값 필터링을 추가 할 수도 있습니다.mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
Tomasz Gandor 2014 년

44

해결책

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 스크립트 : 수염이 있지만 앤티 앨리어싱이 없습니다.


2
이미지에 흰색 배경이있는 흰색 기계가 포함되어 있기 때문에 퍼즈를 2 %로 수정해야했습니다. 그리고 이것이 100 % 완벽하지는 않지만 수동으로하고 싶지 않기 때문에 내가 찾은 최고의 솔루션 gimp입니다. :)
tukusejssirs

1
멋진 솔루션!
0x01h

29

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

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

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


1
와! 이것이 바로 내가 필요한 것입니다! 이전 : i.imgur.com/2Rd7w1N.png , 이후 : i.imgur.com/4RTYygo.png
Dorian

흰색과 흰색 배경의 이미지를 처리 ​​할 수 ​​없기 때문에 완벽하게 작동하지 않습니다. 트럼프 사진처럼.
Sr. PHP Programmer Team Lead

흰색 바탕에 흰색의 경우 위에 게시 한 홍수 채우기 솔루션을 사용해보십시오 . 또는 내 사용 mktrans쉘 스크립트를 : github.com/hackerb9/mktrans
hackerb9

12

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

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

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


4
쉘은 다음을 인용해야 할 수도 있습니다 (). convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
Jim K.

7

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

여기에 이미지 설명 입력


좋은. 나는 당신이 그것의 요점을 간결한 라인으로 얻은 것을 좋아합니다. 이것은 스크립트를 작성하면서 중간 단계 중 하나와 비슷합니다. 나는 (a) 너무 많은 선명한 디테일을 잃어 버리고, (b) 쉽게 변경할 수 있도록 색상 선택을 분명하게 만들고 싶었고, (c) 상단뿐만 아니라 모든 가장자리에서 넘치길 원했기 때문에 반대하기로 결정했습니다. -왼쪽 코너. (지금 내가 잊고있는 다른 것이있을 수 있습니다).
hackerb9

2
추신 : "fmw"가 Fred M. Weinhaus를 의미한다고 추측 해 보겠습니다. 그렇다면 인사드립니다, Dr. Weinhaus! 자신이 누구인지 모르는 사람에게 그는 1970 년대부터 컴퓨터 그래픽에 관한 몇 가지 중요한 연구를 썼습니다. 모두에서 ImageMagick를 쉘 스크립트의 그의 놀라운 conucopia을 확인해야 fmwconcepts.com/imagemagick .
hackerb9 jul.

1
@ hackerb9 : 네, 저입니다. 우리는 서로를 알고 있습니까? 원하시면 이메일을 보내주세요. 내 이메일 주소는 링크 한 내 웹 페이지에 있습니다.
fmw42

4

투명도 수준을 제어하려면 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

1

네. 이 같은 문제도있었습니다. 내가 실행 한 명령은 다음과 같습니다. 완벽하게 작동했습니다. convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.