Konwertuj obraz w skali szarości na obraz kanału alfa w powłoce unix

14

Mam obraz w skali szarości. Chcę przekonwertować go na przezroczysty PNG, tak aby czarne piksele (na oryginalnym obrazie) stały się całkowicie nieprzezroczyste, białe piksele stały się całkowicie przezroczyste, 50% szary piksel stałby się 50% przezroczysty i tak dalej dla wszystkich odcieni pomiędzy.

Jak mogę to osiągnąć?

(Tak, wiem, że jest to prawie to samo pytanie, co Konwertowanie odcieni szarości na kanał alfa , ale chcę wiedzieć, jak to zrobić, używając tylko narzędzi wiersza poleceń - np. ImageMagick lub NetPBM.)

Oto przykładowy wynik powyższego pytania. Ta próbka jest wynikiem, który chciałbym osiągnąć przy użyciu tylko narzędzi wiersza polecenia.

Próba

Jeśli otworzysz ten PNG w przeglądarce obsługującej przezroczystość, zobaczysz, co mam na myśli.

zrajm
źródło

Odpowiedzi:

18

Oooookay. Po mnóstwie googlingu i przeczytaniu większej ilości instrukcji ImageMagick, niż mi zależy, oto odpowiedź. Biorąc pod uwagę, że masz obraz w skali szarości source.png, oto moje polecenia.

Aby uczynić czarne piksele przezroczystymi i zachować białe piksele takimi, jakie są, uruchom następujące polecenie:

 convert source.png -alpha copy -fx '#fff' result.png

Aby zamiast tego uczynić białe piksele przezroczystymi przy jednoczesnym zachowaniu czerni w niezmienionej postaci, użyj:

 convert source.png -alpha copy -channel alpha -negate +channel -fx '#000' result.png

Wyjaśnijmy nieco to ostatnie polecenie:

  • convert - Jest poleceniem ImageMagic (jednym z kilku)
  • source.png - Obraz źródłowy w skali szarości.
  • -alpha copy - Skopiuj zawartość poprzedniego pliku do kanału alfa.
  • -channel alpha - Określ, że tylko operatorzy powinni wpływać na kanał alfa.
  • -negate- Odwróć kanał alfa (spowoduje, że z powodu poprzedniego -chanel alphanie wpłynie na żadną inną część obrazu).
  • +channel- Określ, że tylko operatorzy powinni wpływać na kanały kolorów i nie modyfikować już kanału alfa. (Jest to ustawienie domyślne, dlatego nie musimy go podawać w pierwszym, prostszym przykładzie).
  • -fx '#000'- Zamień zawartość kanału kolorów na czarne piksele. (Ze względu +channelna kanał alfa nie będzie to miało wpływu).

Jest bardzo ważne, aby dołączyć tę ostatnią -fxopcję, w przeciwnym razie wszystkie półprzezroczyste piksele w generowanym obrazie zachowają kolory. (Ponieważ te piksele są półprzezroczyste, może to nie być oczywiste, ale wynik końcowy nie jest tym, czego można się spodziewać).

Uważam, że lista opcji ImageMagick jest bardzo przydatna.

zrajm
źródło
całkiem dobre wyjaśnienie, aby osiągnąć cel, gdy używam drugiego polecenia, które powoduje, że mój obraz jest ciemniejszy niż rzeczywisty obraz w skali szarości. W rzeczywistości moim celem jest uzyskanie tego samego odcienia koloru, który występuje w skali szarości innej niż ta przezroczystość, zgodnie z oczekiwaniami. jakiś pomysł, aby to osiągnąć?
Hardik Patel,
to bardzo przydatne, dzięki! :) cieszę się, że nie musiałem sam tego rozgryzać
Sam Watkins
Kocham Cię!!!!!!
mescarra
Tego rodzaju komentarze lepiej przesłać mi za pośrednictwem tego kanału: okcupid.com/profile/zrajm :)
zrajm
1
nie jestem pewien, dlaczego, ale w obecnej wersji (ImageMagick 7.0.7-21) otrzymuję tylko jednolity biały / czarny obraz, bez żadnego kanału alfa. Skopiowałem wiersz polecenia dosłownie, zmieniając tylko ścieżki plików wejściowych / wyjściowych. Może wprowadzili pewne niezgodne wstecz wersje.
Nazwa wyświetlana
0

W ImageMagick 7.0 powyższa odpowiedź już nie jest. Ale możesz użyć:

convert source.png -channel rgb -fx '#fff' result.png

Aka, wypełnij kanały RGB spacją i niech alfa jak poprzednio.

tito
źródło
Podejrzewam, że przegapiłeś „kopię alfa” :)
Chris,
0

W przypadku imagemagick 7 uważam, że konieczne jest określenie -channel RGBprzed -fx, w przeciwnym razie otrzymujesz jednolity czarny obraz, na przykład:

convert input.png -alpha copy -channel RGB -fx '#000' out.png

Negacja jest przydatna, jeśli chcesz, aby czarny był nieprzezroczysty, a biały przezroczysty:

convert input.png -negate -alpha copy -channel RGB -fx '#000' out.png
Chris
źródło