Cómo reemplazar colores en BufferedImage en JAVA

Me pregunto si hay un método más eficiente para reemplazar colores en una imagen almacenada. Por el momento, uso el siguiente método:

Relleno una matriz con los colores que se reemplazarán y los colores con los que se reemplazarán, incluida la transparencia. Luego recorro cada píxel en 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 > 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 las que estoy trabajando son pequeñas, 20×20 píxeles más o menos. Sin embargo, parece que debe haber una manera más eficiente de hacer esto.

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 recorrer toda la imagen para que se escale bien.

Utilice un HashMap . La clave debe ser el color original, y el valor es el reemplazo. Si el resultado es nulo, no haga nada.

Parece que la forma idiomática de hacer esto es implementar un LookupOp y luego aplicar esta operación para crear un nuevo BufferedImage destino. Hay una gran respuesta aquí .

Eche un vistazo a BufferedImageFilter / BufferedImageOp para filtrar su imagen en el paradigma productor / consumidor / observador.