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

293

Mam kilka obrazów PNG z przezroczystością i muszę tworzyć wersje z warstwą obrazu skomponowaną na białym tle. Próbowałem różnych rzeczy z operacjami „konwersji” Image Magick, ale albo nic się nie dzieje, albo pojawia się błąd. Nie chcę przejść do pośredniego formularza JPG, ponieważ nie chcę artefaktów. Oczywiście łatwo to zrobić w Gimp, Photoshopie itp., Ale wolałbym napisać skrypt z wiersza poleceń, ponieważ jest wiele takich rzeczy.

Przykładem niedziałającego polecenia Magii obrazu jest:

convert img1.png -background white -flatten img1-white.png

To powoduje błąd.

Dzięki!

Pointy
źródło
W moim konkretnym przypadku warstwa przezroczystości w PNG powodowała konflikt podczas przechodzenia przez procesor FO (Apache) w celu utworzenia pliku PDF / A. PDF / A nie pozwala na przezroczystość. Hack, którego użyłem, polega na zamianie na JPG.
Wivani
3
„To powoduje błąd”. Jaki jest komunikat o błędzie?
Aaron McDaid
To polecenie powinno działać dobrze. Jeśli tak się nie stanie, być może masz wadliwą instalację Imagemagick lub libpng albo twoje wersje są za stare. Jaka jest twoja wersja Imagemagick i libpng?
fmw42

Odpowiedzi:

254

To działa dla mnie:

convert -flatten img1.png img1-white.png

Referencje dokumentacji:

remosu
źródło
3
Jakoś to nie działa dla mnie ... Próbowałem „-transparent-kolor biały”, ale dostałem wyjątek / ostrzeżenie.
William Niu
1
Okazuje się, że muszę również ustawić tło na białe. Musiałem również pobrać plik colors.xml, którego brakowało.
William Niu
9
Sprawdź moją odpowiedź poniżej. Został dodany 2 lata po tym.
Rok Kralj,
42
NIE próbuj konwertować wielostronicowych dokumentów -flatten. Spłaszczy strony do jednej strony.
Tim S.
8
Jeśli chcesz to zrobić na wszystkich plikach ze swojego folderu, możesz to zrobić w ten sposób: na mogrify -flatten *.pngwszelki wypadek nie zapomnij wykonać kopii zapasowej. Więcej informacji tutaj: imagemagick.org/script/mogrify.php
troyane
372
-background white -alpha remove -alpha off

Przykład:

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

Zastąp whitego dowolnym innym kolorem, jaki chcesz. Dokumentacja Imagemagick mówi o -alpha removeoperacji:

Ta operacja jest prosta i szybka i wykonuje zadanie bez potrzeby dodatkowego użycia pamięci lub innych efektów ubocznych, które mogą być związane z alternatywnymi technikami usuwania przezroczystości. Jest to zatem preferowany sposób usuwania przezroczystości obrazu.

Rok Kralj
źródło
3
Wydaje się, że -background whitenie jest to konieczne (prawdopodobnie dotyczy to innych kolorów).
Skippy le Grand Gourou,
5
@SkippyleGrandGourou: Jest to konieczne, ponieważ zastępczy kolor przezroczystości dla PNG nie zawsze jest biały.
Rok Kralj
3
lepsza niż zaakceptowana odpowiedź (która w przypadku więcej niż jednej warstwy nie robi właściwej rzeczy)
axkibe
5
Powstały obraz nadal będzie miał kanał alfa. Będzie pusty, ale nadal tam będzie. Aby całkowicie usunąć kanał dodaj -alpha off.
josch
2
Nie działa Zrobiłem nowy PNG z przezroczystym tłem i czerwoną kropką na środku. Zawsze tworzyło czarne tło, bez względu na wybrany kolor. convert image.png -background white -alpha off white.pngstworzył obraz z czarnym tłem. convert image.png -background "#00ff33" -alpha off 00ff33.pngstworzył czarne tło
McNulty
46

Spłaszczanie obrazu i stosowanie 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 niż spłaszcz je. Rewers nie działa.

$ convert sourceimage.png -background BackgroundColor -flatten destinationimage.png
acpmasquerade
źródło
Z jakiegokolwiek powodu to działało dobrze dla mnie. Nie jestem pewien, dlaczego oryginalna próba nie zadziałała.
Anthony
23

Jedyną, która działała dla mnie, była kombinacja wszystkich odpowiedzi:

convert in.png -background white -alpha remove -flatten -alpha off out.png
db0
źródło
4
Fajnie, działało. Właściwie potrzebowałem innego koloru niż biały i możesz użyć ... -background "#010203" ...zamiast białego.
Alexis Wilke
oto jak zamienić ten sam obraz we wszystkich folderach w katalogumogrify -background white -flatten */*.png
Julian
-alpha removeco mi to zrobiło
Stefan Dragnev
13

oto jak zamienić ten sam obraz we wszystkich folderach w katalogu na biały zamiast przezroczystego:

mogrify -background white -flatten */*.png

juliański
źródło
10

Używanie -flatten doprowadziło mnie do szaleństwa, ponieważ -flatten w połączeniu z potężnym kadrowaniem i zmiana rozmiaru po prostu nie działa. Oficjalnym i dla mnie jedynym poprawnym sposobem jest „usunięcie” kanału alfa.

-alfa remove -alfa off (niepotrzebne w JPG)

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

Tjarko Rikkerink
źródło
więc jak stać się rozkazem? to nie działało tutaj:convert imgWithTranspBkg.png -alpha remove -alpha off bkg.jpg resultImg.png
Aquarius Power
Chciałem tylko usunąć alfa. Konwersja na JPG to zrobiła, przyjemnie i łatwo. Dzięki za wskazówkę.
Roger CS Wernersson
Jest to jedyne z powyższych rozwiązań, które działało dla mnie. Teraz sklep iTunes jest zadowolony z mojego obrazu.
Bill Cheswick
7

Sekcja Alpha Remove w Przewodniku użytkowania ImageMagick sugeruje użycie -alpha removeopcji, np .:

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

... używając wybranego -backgroundkoloru.

Przewodnik stwierdza:

Ta operacja jest prosta i szybka i wykonuje zadanie bez potrzeby dodatkowego użycia pamięci lub innych efektów ubocznych, które mogą być związane z alternatywnymi technikami usuwania przezroczystości. Jest to zatem preferowany sposób usuwania przezroczystości obrazu.

Dodaje dodatkowo notatkę:

Zauważ, że chociaż przezroczystość jest „usunięta”, kanał alfa pozostanie włączony, ale teraz będzie całkowicie nieprzejrzysty. Jeśli nie potrzebujesz już kanału alfa, możesz użyć funkcji Wyłącz alfa, aby go wyłączyć.

Dlatego jeśli nie potrzebujesz kanału alfa, możesz zmniejszyć rozmiar obrazu wyjściowego, dodając -alpha offopcję, np .:

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

Więcej szczegółowych informacji na temat innych często używanych technik usuwania przezroczystości opisano w sekcji Usuwanie przezroczystości z obrazów .

W tej sekcji znajduje się wzmianka o ważnym zastrzeżeniu dotyczącym zastosowania -flattenjako techniki usuwania przezroczystości:

Jednak nie będzie to działać z „mogrify” lub sekwencją wielu obrazów, zasadniczo dlatego, że operator „-flatten” jest naprawdę zaprojektowany do łączenia wielu obrazów w jeden obraz.

Tak więc, jeśli konwertujesz kilka obrazów jednocześnie, np. Generowanie miniaturek z pliku PDF, -flattennie zrobisz tego, co chcesz (spłaszczy wszystkie obrazy dla wszystkich stron w jeden obraz). Z drugiej strony, używając-alpha remove techniki będzie nadal generować wiele obrazów, z których każdy ma usuniętą przezroczystość.

Gary
źródło
5

Wygląda na to, że twoje polecenie jest prawidłowe, więc problem może wynikać z braku obsługi PNG (). Możesz to sprawdzić convert -list configurelub po prostu wypróbować:

sudo yum install libpng libpng-devel
Alastair
źródło
1
Tak, dziękuję; ten (stary) problem był błędem w „magii graficznej”, która jest rozwidleniem / przepisaniem / czymkolwiek z „magii obrazu”.
Pointy
@Pointy Rozumiem! Z ciekawości, jaka była rzeczywista przyczyna problemu (tylko w jednej wersji)?
Alastair
Naprawdę nie wiem dokładnie; to był tylko błąd. Nie jestem opiekunem Graphicks Magick, więc nie mam wglądu w ich kod. Chyba muszę spróbować jeszcze raz.
Pointy
ubuntu nie ma go? tutaj jest libpng12-0, ale nadal nie działa :(
Aquarius Power
Używam Ubuntu 13.04 z libpng12-0zainstalowanym i działającym. Czy widzisz png, jeśli to uruchomisz? convert -list configure | grep \png
Alastair,
5

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
FreeNickname
źródło
3

Welp wygląda na to, że moja decyzja o zainstalowaniu „magii graficznej” nad „magią graficzną” ma pewne szorstkie krawędzie - kiedy ponownie instaluję oryginalną, chrupiącą „magię graficzną”, powyższe polecenie działa doskonale.

edytuj , długi czas później - kiedyś sprawdzę, czy „magia graficzna” rozwiązała ten problem.

Pointy
źródło
2

Potrzebowałem albo: -alpha backgroundi -flatten, albo -fill.

Zrobiłem nowy PNG z przezroczystym tłem i czerwoną kropką na środku.

convert image.png -background green -alpha off green.png nie powiodło się: wytworzył obraz z czarnym tłem

convert image.png -background green -alpha background -flatten green.png utworzył obraz z prawidłowym zielonym tłem.

Oczywiście przy innym pliku, którego nazwę zmieniłem image.png, nic nie udało się zrobić. W przypadku tego pliku stwierdziłem, że kolor przezroczystych pikseli to „# d5d5d5”, więc wypełniłem ten kolor zielonym:

convert image.png -fill green -opaque "#d5d5d5" green.png zastąpiono przezroczyste piksele prawidłową zielenią.

McNulty
źródło
Prawidłowe polecenie z bieżącym ImageMagick to convert image.png -background green -alpha background -alpha off green.pnglub convert image.png -background green -alpha background -alpha remove green.pnglub convert image.png -background green -flatten green.png
fmw42
1

Opcja bez wiersza poleceń: otwórz plik PNG w Windows Paint i kliknij Zapisz.

hbere
źródło
0

tworzy to obraz, który umieszcza pierwszy z przezroczystością na drugim

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

pierwotnie znalazłem wskazówkę dotyczącą tego postu

Wodnik Moc
źródło
0

Aby faktycznie usunąć kanał alfa z pliku, użyj opcji wyłączenia alfa :

convert in.png -background white -alpha off out.png
Nick Dowell
źródło
1
W rzeczywistości podany link mówi: „W rzeczywistości nie usuwa ani nie zniechęca kanału alfa dołączonego do obrazu, po prostu wyłącza jakikolwiek wpływ, jaki kanał ma na obraz”. Aby naprawdę usunąć kanał alfa, zobacz moją odpowiedź.
Rok Kralj
0

Widziałem to pytanie i odpowiedzi, które naprawdę mi pomagają, ale wtedy musiałem to zrobić dla wielu plików, więc na wypadek, gdybyś miał wiele obrazów (obrazów PNG) w jednym folderze i chcesz to zrobić dla wszystkich:

find ./ -name "*.png" -exec convert {} -flatten {} \;
talsibony
źródło
-1

To -alfa wyłączone, NIE -alfa usuń! Przesyłanie do sklepu z aplikacjami na iOS kończy się niepowodzeniem, gdy w dowolnej ikonie jest kanał alfa !!

Oto jak to zrobić: mogrify -alpha off * .png

railsfanatic
źródło