2009-12-02 4 views
1

J'ai une grande image PNG de 8 bits. J'utilise Java pour découper l'image en plus petites images 32x32. J'utilise Java ImageIO pour charger le fichier PNG dans un BufferedImage, puis l'appeler getSubimage(x, y, 32, 32). J'utilise ensuite ImageIO pour écrire chaque carreau comme un PNG.Existe-t-il un moyen facile de réduire le nombre de couleurs dans un IndexedColorModel?

Le problème est que l'image résultante a le même IndexColorModel que l'image originale. Par exemple, une mosaïque 32x32 ne possède que 8 couleurs au total, mais inclut un modèle de couleur avec toutes les couleurs de l'image originale.

Je souhaite supprimer les couleurs inutilisées du IndexColorModel de la mosaïque 32x32 avant d'écrire le format PNG. Il n'y a aucun sens d'inclure des données de couleur pour les couleurs non utilisées dans l'image et je voudrais que les images soient aussi petites que possible.

Y at-il un mécanisme intégré pour ce faire ou quelqu'un peut-il me diriger vers un moyen (facile) de modifier/réduire le ColorModel?

Merci!

Répondre

2

Jetez un oeil à ColorConvertOp dans java.awt.image.

Fondamentalement, vous créez un nouveau IndexColorModel de la profondeur désirée. Si vous voulez vraiment le plus petit, vous pouvez parcourir le Raster et compter les couleurs. Sinon, choisissez simplement 4 ou 5 bits par pixel. Puis créez un BufferedImage avec TYPE_BYTE_BINARY et le IndexColorMap. Enfin, utilisez la méthode filter() depour copier les données d'origine dans le nouveau BufferedImage.

+0

Devon, merci - cela m'a fait bouger dans la bonne direction, sauf qu'après avoir créé un 'IndexColorModel' avec le nombre exact de couleurs, le PNG enregistré semble toujours avoir 256 couleurs dans sa table de couleurs. Soit Photoshop affiche une table de couleurs incorrecte, soit la palette possède les 8 couleurs correctes, puis remplit les espaces restants jusqu'à 256 avec des nuances de gris. Des idées? –

+0

Hmm, ça marche pour moi, donc ça pourrait être un rapport incorrect de PS. Si vous êtes sur Windows, vérifiez les propriétés du fichier, onglet "Résumé", "Avancé". Il devrait afficher une "Profondeur de bit" de 4. –

+0

Je pourrais avoir la profondeur de bits erronée lorsque je crée le IndexedColorModel. Il peut être dans un état invalide qui produit l'étrangeté dans la table de couleurs. Je vais vérifier et rapporter ici. –

Questions connexes