Color substitution in a BufferedImage The setPixelColor function below changes the color of pixels.
I need some suggestions to optimize this function.

Example:

public static void main(String[] args) throws IOException {
    BufferedImage pic1 = ImageIO.read(new File("Images/Input-1.bmp"));
    setPixelColor(pic1, 34, 177, 76, 127, 127, 127);
}


This changes the left image into the right image.





 private static void setPixelColor(BufferedImage imgBuf, int red, int green, int blue, int newRed, int newGreen, int newBlue) throws IOException {
    int[] RGBarray;
    int w;
    int h;

    //Declare color arrays
    int[][] alphaPixels;
    int[][] redPixels;
    int[][] greenPixels;
    int[][] bluePixels;

    w = imgBuf.getWidth();
    h = imgBuf.getHeight();


    alphaPixels = new int[h][w];
    redPixels = new int[h][w];
    greenPixels = new int[h][w];
    bluePixels = new int[h][w];

    RGBarray = imgBuf.getRGB(0, 0, w, h, null, 0, w);

    //Bit shift values into arrays
    int i = 0;
    for (int row = 0; row &lt; h; row++) {
        for (int col = 0; col &lt; w; col++) {
            alphaPixels[row][col] = ((RGBarray[i] &gt;&gt; 24) &amp; 0xff);
            redPixels[row][col] = ((RGBarray[i] &gt;&gt; 16) &amp; 0xff);
            greenPixels[row][col] = ((RGBarray[i] &gt;&gt; 8) &amp; 0xff);
            bluePixels[row][col] = (RGBarray[i] &amp; 0xff);
            i++;
        }
    }

    //Set the values back to integers using re-bit shifting
    for (int row = 0; row &lt; h; row++) {
        for (int col = 0; col &lt; w; col++) {
            if (redPixels[row][col] == red &amp;&amp; greenPixels[row][col] == green &amp;&amp; bluePixels[row][col] == blue) {
                int rgb = (alphaPixels[row][col] &amp; 0xff) &lt;&lt; 24 |
                        (redPixels[row][col] &amp; newRed) &lt;&lt; 16 |
                        (greenPixels[row][col] &amp; newGreen) &lt;&lt; 8 |
                        (bluePixels[row][col] &amp; newBlue);
                imgBuf.setRGB(col, row, rgb);
            }
        }
    }

    //Write back image
    ImageIO.write(imgBuf, "bmp", new File("Images/Output2.bmp"));
}
I think that changeColor or substColor would be a more appropriate name for this function.

I don't see why the function should write out its result to a file.  That's a violation of the Single Responsibility Principle.  What if I want to perform multiple color substitutions before writing out the result?  What if I want a different output filename, or a format other than BMP?

Avoid empty declarations, when you can declare and initialize values at the same time.  It's more readable and less error-prone.

You don't care about the x-y coordinates of each pixel — only the color matters.  So, there is no need to construct the 2-D arrays representing the red, green, and blue channels.

/**
 * Changes all pixels of an old color into a new color, preserving the
 * alpha channel.
 */
private static void changeColor(
        BufferedImage imgBuf,
        int oldRed, int oldGreen, int oldBlue,
        int newRed, int newGreen, int newBlue) {

    int RGB_MASK = 0x00ffffff;
    int ALPHA_MASK = 0xff000000;

    int oldRGB = oldRed &lt;&lt; 16 | oldGreen &lt;&lt; 8 | oldBlue;
    int toggleRGB = oldRGB ^ (newRed &lt;&lt; 16 | newGreen &lt;&lt; 8 | newBlue);

    int w = imgBuf.getWidth();
    int h = imgBuf.getHeight();

    int[] rgb = imgBuf.getRGB(0, 0, w, h, null, 0, w);
    for (int i = 0; i &lt; rgb.length; i++) {
        if ((rgb[i] &amp; RGB_MASK) == oldRGB) {
            rgb[i] ^= toggleRGB;
        }
    }
    imgBuf.setRGB(0, 0, w, h, rgb, 0, w);
}

public static void main(String[] args) throws IOException {
    BufferedImage pic1 = ImageIO.read(new File(…));
    changeColor(pic1, 34, 177, 76, 127, 127, 127);
    ImageIO.write(pic1, "bmp", new File(…));
}