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!


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:


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.


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

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

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


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


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ść.


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

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

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.


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ą.


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.


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


0

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

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

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 {} \;

-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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.