import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Base64;

import java.awt.image.BufferedImage;
import java.awt.image.IndexColorModel;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;

public class IndexedBMPWriteTest {

    public static void main(String[] args) throws Exception {

        System.out.println("original BITMAPINFOHEADER.biClrUsed:");
        biClrUsed(IMAGE_4BIT);

        BufferedImage fourBitImage = ImageIO.read(new ByteArrayInputStream(IMAGE_4BIT));
        IndexColorModel cm = (IndexColorModel) fourBitImage.getColorModel();

        ImageWriter bmpWriter = ImageIO.getImageWritersByFormatName("bmp").next();
        System.out.println(bmpWriter.getClass().getName()+"changes BITMAPINFOHEADER.biClrUsed:");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(fourBitImage, "bmp", baos);
        biClrUsed(baos.toByteArray());

    }

    static final byte[] IMAGE_4BIT = Base64.getDecoder().decode(
            "Qk1GAgAAAAAAAEYAAAAoAAAAIAAAACAAAAABAAQAAAAAAAACAAATCwAAEwsA"
                    + "AAQAAAAEAAAAAAAAAADAAADgoEAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    + "AAAiIhERAAAAAAAAAAAAAAIiIiIREREQAAAAAAAAAAAiIiIiEREREQAAAAAA"
                    + "AAAiIiIiIhERERERAAAAAAACIiIiIiIRERERERAAAAAAIiIiIiIiERERERER"
                    + "AAAAACIiIiIiIhEREREREQAAAAIiIiIiIiIREREREREQAAAiIiIiIiIiERER"
                    + "EREREQAAIiIiIiIiIhEREREREREAACIiIiIiIiIRERERERERAAIiIiIiIiIi"
                    + "ERERERERERACIiIiIiIiIhEREREREREQAiIiIiIiIiIREREREREREAIiIiIi"
                    + "IiIiERERERERERACIiIiIiIiIhEREREREREQAiIiIiIiIiIREREREREREAIi"
                    + "IiIiIiIiERERERERERACIiIiIiIiIhEREREREREQACIiIiIiIiIRERERERER"
                    + "AAAiIiIiIiIiEREREREREQAAIiIiIiIiIhEREREREREAAAIiIiIiIiIRERER"
                    + "EREQAAAAIiIiIiIiERERERERAAAAACIiIiIiIhEREREREQAAAAACIiIiIiIR"
                    + "ERERERAAAAAAACIiIiIiEREREREAAAAAAAAAIiIiIhEREREAAAAAAAAAAAIi"
                    + "IiIREREQAAAAAAAAAAAAACIiEREAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

    static void biClrUsed(byte[] image) {

        int index = 46;

        int biClrUsed = (image[index + 3] & 0xff) << 24 | (image[index + 2] & 0xFF) << 16 | (image[index + 1] & 0xFF) << 8
                | (image[index + 0] & 0xFF);
        System.out.println(biClrUsed);
    }
}