Usando JAI, ¿cómo agrego un nuevo color a la paleta?

Estoy usando JAI para agregar un "borde" a una imagen. P.ej

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);

El valor de 'consts' anterior depende del ColorModel. Al usar ComponentColorModel, cada píxel tiene su propio color, por lo que no tengo que meterme con una paleta. Cuando una imagen tiene una paleta (GIF, PNG, ...) el ColorModel es IndexColorModel.

Cuando se usa IndexColorModel, 'consts' es una matriz doble [], con el tamaño de uno. El valor de la matriz es el índice de la paleta de colores.

He descubierto cómo modificar la paleta creando un nuevo IndexColorModel, ¡pero la lógica que tendría que codificar sería una locura! (Por ejemplo, la cantidad de colores que puedo tener en la paleta depende de muchos factores. Además, si necesito eliminar un color de la paleta para agregar el nuevo, necesitaría una lógica que determine qué color sería mejor eliminar y luego modifique todos los píxeles que anteriormente hacían referencia a ese color; ¡guau, eso es mucho código!)

Entonces, mi pregunta es, ¿cómo se agrega un color a la paleta? ¿Existe una biblioteca? ¿O debería usar algo de ioimage? (Para ser honesto, estoy un poco confundido donde jai "termina" e ioimage "comienza").

Además, pregunta al margen, por alguna razón, mis imágenes de prueba que solo tienen alrededor de 10 colores en la paleta se leen como si tuvieran 256 colores. Cuando guardo la imagen con jai, se guardan todos los 256 colores (del 11 al 255 son todos negros). ¿Alguna idea de por qué está haciendo esto?

¡Gracias! David

preguntado el 08 de noviembre de 11 a las 18:11

1 Respuestas

La mejor solución que he podido encontrar para mi pregunta anterior es convertir la imagen de IndexColorModel a ComponentColorModel. (Cada píxel de un ComponentColorModel especifica su propio color, por lo que no hay una paleta con la que tenga que trabajar; puede usar fácilmente cualquier color que desee).

Me levanto con esta sencilla solución después de leer http://java.sun.com/products/java-media/jai/forDevelopers/jaifaq.html#palette

Esto es lo que hago después de leer una imagen en:

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);
}

Una vez realizada la manipulación, puede volver a ocultar la imagen. No he perdido el tiempo para averiguarlo. Si alguien más quiere averiguarlo, es posible que desee leer esto: http://www.java.net/node/675577

respondido 14 nov., 11:19

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.