2012-12-25 9 views
8

Chcę przekonwertować 32-bitowe png na 8-bitowe png z ImageMagick, ale półprzezroczyste piksele zostaną utracone. Jak rozwiązać ten problem? Komenda że używam jest następującyKonwertuj 32-bitowe png na 8-bitowe png z ImageMagick, zachowując półprzezroczyste piksele.

convert original.png PNG8:output.png 
+0

Powiązane: http://stackoverflow.com/questions/1468221/can-you-force-imagemagick-to-use-png-8-alpha-transparency –

+2

To pytanie nie jest duplikatem. Ten plakat narzeka na utratę półprzezroczystych pikseli po konwersji z 24-bitowego na 8-bitowy.Ma już (poprawną) składnię do konwersji z 24-bitowego na 8-bitowy, zastanawia się, dlaczego zachowuje się tak jak on (i jest na to dobra odpowiedź). –

Odpowiedz

10

Widocznie, chociaż format PNG faktycznie pozwala na dowolne i wszystkie kolory w 8-bitowym indeksowanym kolorze PNG być całkowicie lub częściowo przezroczysty, ImageMagick za „PNG8” format specifier obsługuje tylko 1-bitową przezroczystość w stylu GIF.

Jest możliwe, aby produkować indeksowanych 8-bitowych PNG za pomocą ImageMagick przez nie pomocą PNG8: specyfikator, ale po prostu za pomocą -colors 256 lub -colors 255 *, aby zmniejszyć liczbę kolorów w obrazie. Niestety, przynajmniej na podstawie moich testów przy użyciu ImageMagick 6.8.9, powstałe obrazy mają dość dziwne i dość niepotrzebnie brzydkie artefakty kwantyzacji kolorów. Na szczęście istnieje znacznie lepsze narzędzie do tej konkretnej pracy: pngquant. Używając go, przekształcając 32-bitowego RGBA PNG do 8-bitowych kolormapowany PNG z minimalną utratą jakości jest tak proste, jak:

pngquant 256 <original.png> output.png 

Jako szybki demonstracji, oto prosty obraz testowy (gwiazda z półprzezroczysta cień) w przeliczeniu na 8-bitowym PNG stosując różne metody:

Original pngquant 256 ImageMagick convert (-colors 255) ImageMagick convert (PNG8) ImageMagick convert (-colors 255, PNG8)

Od lewej do prawej:

  1. Oryginalne 32-bitowe RGBA PNG
  2. kwantowane z pngquant 256 <input.png> output.png
  3. kwantowane z convert input.png -colors 255 output.png *
  4. kwantowane z convert input.png PNG8:output.png
  5. kwantowane z convert input.png -colors 255 PNG8:output.png *

*) W komentarzach poniżej, sugeruje się, że -colors 255 jest konieczne „aby zarezerwować jeden wpis dla«background»koloru.” Na podstawie moich testów nie zauważyłem, że tak rzeczywiście jest; używanie -colors 256 będzie nadal produce an 8-bit colormapped PNG, z artefaktami kwantyzacji jakościowo podobne, ale różniące się szczegółowo, z wyjściem z -colors 255. Niemniej jednak, aby grać bezpiecznie, użyłem -colors 255 dla powyższych przykładów. Zmniejszenie rozmiaru mapy barw o jeden kolor nie powinno samo w sobie istotnie wpłynąć na jakość wyników, ponieważ test z pngquant 255 będzie .

+0

Dziękuję za odpowiedź. Próbowałem tego polecenia, ale nie zachowało ono półprzezroczystych pikseli. – Karmar

+0

No cóż, warto było spróbować. :((Ps. Próbowałeś ich z nich, prawda? Ktoś z wątku, który łączyłem, zasugerował, że jest to prefiks 'PNG8:', który przełamuje przezroczystość alfa.) –

+2

Tak, próbowałem obu. piksele czarny Zacząłem używać narzędzia pngquant zamiast wiersza ImageMagick.Zapewnia on prawidłowy kanał alfa – Karmar