2011-11-08 2 views
1

J'utilise JAI pour ajouter une "bordure" à une image. Par exempleEn utilisant JAI, comment ajouter une nouvelle couleur à la palette?

ParameterBlock pb = new ParameterBlock(); 
pb.addSource(r); 
pb.add(leftPad); 
pb.add(rightPad); 
pb.add(topPad); 
pb.add(bottomPad); 

pb.add(new BorderExtenderConstant(consts)); 

r = JAI.create("border", pb); 

La valeur de 'consts' ci-dessus dépend du ColorModel. Lorsque vous utilisez ComponentColorModel, chaque pixel a sa propre couleur, donc je n'ai pas besoin de jouer avec une palette. Lorsqu'une image possède une palette (GIF, PNG, ...), ColorModel est IndexColorModel.

Lorsque IndexColorModel est utilisé, "consts" est un tableau double [] de la taille d'un. La valeur dans le tableau est l'index de la palette de couleurs.

J'ai trouvé comment modifier la palette en créant un nouveau IndexColorModel mais la logique que je devrais coder serait folle! (Par exemple, combien de couleurs je peux avoir dans la palette dépend de nombreux facteurs.En outre, si j'ai besoin d'enlever une couleur de la palette afin d'ajouter la nouvelle, j'aurais besoin de logique qui détermine quelle couleur serait préférable de retirer et puis modifiez tous les pixels qui faisaient auparavant référence à cette couleur - wow, c'est beaucoup de code!)

Alors, ma question est: comment ajouter une couleur à la palette? Y a-t-il une bibliothèque existante? Ou devrais-je utiliser quelque chose de ioimage? (Pour être honnête je suis un peu confus où jai "se termine" et ioimage "commence".)

Aussi, question secondaire, pour une raison quelconque mes images de test qui ont seulement environ 10 couleurs dans la palette sont lues comme avoir 256 couleurs. Lorsque je sauvegarde l'image avec jai, toutes les 256 couleurs sont enregistrées (11 à 255 sont toutes noires). Une idée de pourquoi ça fait ça?

Merci! David

Répondre

0

La meilleure solution que j'ai pu trouver à ma question ci-dessus est de convertir l'image d'IndexColorModel à ComponentColorModel. (Chaque pixel d'un ComponentColorModel spécifie sa propre couleur donc il n'y a pas de palette que vous devez travailler avec - vous pouvez facilement utiliser toutes les couleurs que vous voulez.)

I cam avec cette solution simple après avoir lu http://java.sun.com/products/java-media/jai/forDevelopers/jaifaq.html#palette

C'est ce que je fais après avoir lu une image dans:

if(image.getColorModel() instanceof IndexColorModel) { 
    IndexColorModel icm = (IndexColorModel)image.getColorModel(); 
    byte[][] data = new byte[4][icm.getMapSize()]; 

    icm.getReds(data[0]); 
    icm.getGreens(data[1]); 
    icm.getBlues(data[2]); 
    icm.getAlphas(data[3]); 

    LookupTableJAI lut = new LookupTableJAI(data); 

    image = JAI.create("lookup", image, lut); 
} 

Une fois la manipulation effectuée, vous pouvez recopier l'image. Je n'ai pas passé le temps de comprendre cela. Si quelqu'un d'autre veut le comprendre, vous pouvez lire ceci: http://www.java.net/node/675577

Questions connexes