Zamień przezroczystość w obrazach PNG na białe tło

Mam kilka obrazów PNG z przezroczystością i muszę utworzyć wersje z warstwą obrazu złożoną na białym tle. Próbowałem różnych rzeczy z operacjami "Konwertuj" Image Magick, ale albo nic się nie dzieje, albo dostaję błąd. Nie chcę iść do pośredniego formularza JPG, bo nie chcę artefaktów. Oczywiście łatwo jest to zrobić w Gimpie lub Photoshopie, ale naprawdę wolałbym skrypt z linii poleceń, ponieważ jest ich wiele rzeczy.

Przykład niedziałającego polecenia Image Magick to:
convert img1.png -background white -flatten img1-white.png

To powoduje błąd.

Dzięki!
Author: Pointy, 2010-02-24

13 answers

To działa dla mnie:

convert -flatten img1.png img1-white.png

Odniesienia do dokumentacji:

 189
Author: remosu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-21 16:34:46
-background white -alpha remove

Przykład:

convert image.png -background white -alpha remove white.png

Możesz zastąpić white dowolnym innym kolorem. Dokumentacja Imagemagick mówi tak o operacji -alpha remove:

Ta operacja jest prosta i szybka, i wykonuje zadanie bez potrzeby każde dodatkowe użycie pamięci lub inne działania niepożądane, które mogą być związane z alternatywnymi technikami usuwania przezroczystości. jest więc preferowany sposób usuwania przezroczystości obrazu.

 280
Author: Rok Kralj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-23 08:29:02

Spłaszczanie obrazu i nakładanie obrazu tła jest proste w ImageMagick

Jednak kolejność poleceń jest bardzo ważna

Aby zastosować dowolne tło na przezroczystym obrazie i spłaszczyć je, najpierw zastosuj tło, a następnie spłaszcz je. Odwrotność nie działa.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png
 42
Author: acpmasquerade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 15:13:09

Jedyna, która mi pomogła, to mieszanka wszystkich odpowiedzi:

convert in.png -background white -alpha remove -flatten -alpha off out.png
 14
Author: db0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-16 03:51:33

Użycie -flatten całkowicie mnie wkurzyło, ponieważ-flatten w połączeniu z mogrify crop i zmiana rozmiaru po prostu nie działa. Oficjalnym i dla mnie jedynym poprawnym sposobem jest "usunięcie" kanału alfa.

- alpha remove-alpha off (nie potrzebne z JPG)

Zobacz dokument: http://www.imagemagick.org/Usage/masking/#remove

 10
Author: Tjarko Rikkerink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-21 10:07:42

Sekcja Alpha Remove w ImageMagick Usage Guide sugeruje użycie opcji -alpha remove, np.:

convert in.png  -background white  -alpha remove  out.png

...używając wybranego przez Ciebie koloru -background.

Przewodnik stwierdza:

Ta operacja jest prosta i szybka, i wykonuje swoją pracę bez potrzeby dodatkowego wykorzystania pamięci lub innych skutków ubocznych, które mogą być związane z alternatywnymi technikami usuwania przezroczystości. Jest to więc preferowany sposób usuwania obrazu przejrzystość.

Dodaje dodatkowo notkę:

Zauważ, że gdy przezroczystość jest 'usunięta', kanał alfa pozostanie włączony, ale będzie w pełni nieprzezroczysty. Jeśli nie potrzebujesz już kanału alfa, możesz go wyłączyć za pomocą wyłączonego kanału alfa.

Tak więc, jeśli nie potrzebujesz kanału alfa, możesz zmniejszyć rozmiar wyjściowego obrazu, dodając opcję -alpha off, np:

convert in.png  -background white  -alpha remove  -alpha off  out.png

Jest więcej szczegółów na temat innych, często używanych techniki usuwania przezroczystości opisane w sekcji usuwanie przezroczystości z obrazów .

W tej sekcji jest wzmianka o ważnym zastrzeżeniu do stosowania -flatten jako techniki usuwania przezroczystości:

Nie będzie to jednak działać z" mogrify "lub sekwencją wielu obrazów, ponieważ operator "- flatten " jest tak naprawdę zaprojektowany, aby łączyć wiele obrazów w jeden obraz.

Więc, jeśli konwertujesz kilka obrazów naraz, np. generowanie miniatur z pliku PDF, -flatten nie zrobi tego, co chcesz (spłaszczy wszystkie obrazy dla wszystkich stron w jeden obraz). Z drugiej strony, użycie techniki -alpha remove będzie nadal produkować wiele obrazów, z których każdy ma usuniętą przezroczystość.

 6
Author: Gary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 16:37:48

Oto jak zastąpić ten sam obraz we wszystkich folderach w katalogu białym zamiast przezroczystym:

mogrify -background white -flatten */*.png

 6
Author: Julian Norton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-28 04:04:31

Wygląda na to, że Twoje polecenie jest poprawne, więc problem może być spowodowany brakiem wsparcia dla PNG (). Możesz sprawdzić za pomocą convert -list configure lub po prostu spróbować:

sudo yum install libpng libpng-devel
 5
Author: Alastair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-01 11:10:04

To nie jest dokładnie odpowiedź na twoje pytanie, ale znalazłem twoje pytanie, próbując dowiedzieć się, jak usunąć kanał alfa, więc postanowiłem dodać tę odpowiedź tutaj:

Jeśli chcesz usunąć kanał alfa za pomocą imagemagick, możesz użyć tego polecenia:

mogrify -alpha off ./*.png
 5
Author: FreeNickname,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-17 08:22:10

Welp wygląda na to, że moja decyzja o zainstalowaniu "graphics magick" nad "image magick" ma szorstkie krawędzie - po ponownym zainstalowaniu oryginalnego starego "image magick", powyższe polecenie działa doskonale.

edit , długo później-któregoś dnia sprawdzę ,czy "graphics magick" naprawił ten problem.

 3
Author: Pointy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-17 20:42:57

Tworzy to obraz po prostu umieszczając 1st z przezroczystością na górze 2nd

composite -gravity center ImgWithTransp.png BackgroundSameSizeOfImg.png ResultImg.png

Originally found the tip on this post

 0
Author: Aquarius Power,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-09 08:52:13

Aby usunąć kanał alfa z pliku, użyj opcji alpha off :

convert in.png -background white -alpha off out.png
 0
Author: Nick Dowell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-09 15:41:49

Widziałem to pytanie i odpowiedzi, które naprawdę mi pomagają, ale potem musiałem to zrobić dla wielu plików, więc w przypadku, gdy masz wiele obrazów (obrazów PNG) w jednym folderze i chcesz to zrobić dla wszystkich:

find ./ -name "*.png" -exec convert {} -flatten {} \;
 0
Author: talsibony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-12 15:52:19