Konvertieren PNG32 zu PNG8 mit PIL unter Beibehaltung der Transparenz
Möchte ich zu konvertieren ein PNG32-image (mit Transparenz) PNG8 mit Python Image Library.
Bisher ist es gelungen, die Umwandlung zu PNG8 mit einem einfarbigen hintergrund.
Unten ist das, was ich Tue:
from PIL import Image
im = Image.open("logo_256.png")
im = im.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)
im.save("logo_py.png", colors=255)
- PNG32 hat 8 bit Transparenz, PNG8 hat nur 1, so dass es unmöglich ist, zu konvertieren treu. Können Sie damit Leben?
- Ja, da es nur einen hintergrund, der transparent ist.
- Bitte posten Sie Ihre Lösung als Antwort, Das passt das format der Website zu verbessern. Ich werde glücklich sein, um es ein upvote, wenn Sie tun.
- PNG8 hat 256 Transparenzstufen pro Paletteneintrag, selbst ausprobieren: pngquant oder tinypng.
- du hast natürlich Recht, aber in der Praxis finden Sie die Anzahl der Transparenz Ebenen begrenzt, da jede Kombination von Farbe und Transparenz nimmt einen Eintrag in der palette. GIF hat die Einschränkung, die ich Sprach, und die software, mit der ich gearbeitet habe vor vielen Jahren behandelt Sie beide gleich so manchmal auch heute noch bin ich verwirrt. Ich glaube, PIL auch funktioniert auf diese Weise. Es gab auch ein problem mit dem Internet Explorer falsch angezeigt PNG8 mit Transparenz-Abstufungen, aber ich denke, es ist schon fest für eine Weile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach viel suchen im Netz, hier ist der code, um zu erreichen, was ich wollte:
Quelle: http://nadiana.com/pil-tips-converting-png-gif
Obwohl der code dort nicht zu nennen, im.load(), und somit die Abstürze auf meiner version von os/python/pil. (Es sieht so aus, ist der Fehler in PIL).
Nicht verwenden PIL erzeugen der palette, da es nicht umgehen kann, RGBA korrekt und hat sehr eingeschränkte Quantisierung Algorithmus.
Verwenden pngquant statt.
Wie erwähnt von Mark Lösegeld, Ihre paletized Bild nur eine Transparenz-Ebene.
Beim speichern Ihrer paletized Bild haben, müssen Sie angeben, welche Farbe index, den Sie möchten, werden die transparenten Farben wie dieses :
speichern Sie das Bild als ein paletized Farben und mit der ersten Farbe als transparente Farbe.