2010-03-03 6 views
5

Me pregunto si existe un método más eficiente para reemplazar colores en una imagen Buffered. En este momento utilizo el siguiente método:Cómo reemplazar colores en BufferedImage en JAVA

Lleno una matriz con colores para reemplazar y los colores para reemplazarlos, incluida la transparencia. Luego recorro cada píxel de la imagen. Si coincide con uno de los colores de la matriz, lo reemplazo con el nuevo color de la matriz. Aquí está el código:

Graphics2D g2; 
    g2 = img.createGraphics(); 
    int x, y, i,clr,red,green,blue; 

    for (x = 0; x < img.getWidth(); x++) { 
    for (y = 0; y < img.getHeight(); y++) { 

     // For each pixel in the image 
     // get the red, green and blue value 
     clr = img.getRGB(x, y); 
     red = (clr & 0x00ff0000) >> 16; 
     green = (clr & 0x0000ff00) >> 8; 
     blue = clr & 0x000000ff; 

     for (i = 1; i <= Arraycounter; i++) { 
     // for each entry in the array 
     // if the red, green and blue values of the pixels match the values in the array 
     // replace the pixels color with the new color from the array 
     if (red == Red[i] && green == Green[i] && blue == Blue[i]) 
     { 
      g2.setComposite(Transparency[i]); 
      g2.setColor(NewColor[i]); 
      g2.fillRect(x, y, 1, 1); 
     } 
     } 
    } 

Las imágenes con los que trabajo son pequeñas, de 20x20 píxeles o menos. Sin embargo, parece que debe haber una forma más eficiente de hacerlo.

+0

quizás si explicas el problema original, podríamos ayudarte más – medopal

+0

El código crea imágenes para usarlas como leyenda en un mapa. Tenemos un conjunto de imágenes de plantilla con cuatro colores. negro, rojo, verde y azul. Dependiendo de la representación temática en el mapa, las imágenes de la plantilla deben obtener el color correcto. El negro se convertirá en el color de fondo, el rojo en el borde correcto, el verde en el patrón de hash y las áreas azules se volverán transparentes. – Rene

Respuesta

10

En lugar de cambiar el valor de los píxeles de la imagen, puede modificar el ColorModel subyacente. Mucho más rápido de esa manera y sin necesidad de iterar sobre toda la imagen para que se adapte bien.

+1

'ColorMap' no es una clase en la API de Java. ¿Cómo se supone que debe hacer eso? – uckelman

+2

Eso es un error tipográfico (que ya se ha solucionado), la votación negativa parece un poco dura – objects

+0

Y la técnica funciona bien, la he usado para el visor de imágenes médicas donde el contraste de una imagen debía ajustarse en tiempo real. Cambiar los valores de píxeles individuales es demasiado lento. – objects

3

Utilice un HashMap<Color,Color>. La clave debe ser el color original y el valor el reemplazo. Si el get devuelve nulo, no haga nada.

3

Parece que la forma idiomática de hacerlo es implementar un LookupOp y luego aplicar esta operación para crear un nuevo objetivo BufferedImage. Hay una gran respuesta here.

+0

Lo que tengo que hacer es convertir píxeles rojos, verdes, azules y negros a su propio color nuevo. ¿Se puede hacer esto usando LookupOp? Parece que funciona en cada componente de color individualmente. – Rene

+0

No lo he usado, pero estoy muy seguro de que sí. Al mirar la respuesta que menciono, parece que LookupTable (construido con una matriz 2D) se usa para asignar colores de origen a destino. Mira el método lookupPixel LookupTable ... Estoy bastante seguro de que esto es lo que se llamará, por lo general con una matriz src de 4 elementos que contiene los valores RGBA (aunque debes comprobar esto). – Adamski

Cuestiones relacionadas