@Override public ImageTypeSpecifier getRawImageType(final int imageIndex) throws IOException { checkBounds(imageIndex); readHeader(); int channels = header.getChannels(); int paletteInfo = header.getPaletteInfo(); ColorSpace cs = paletteInfo == PCX.PALETTEINFO_GRAY ? ColorSpace.getInstance(ColorSpace.CS_GRAY) : ColorSpace.getInstance(ColorSpace.CS_sRGB); switch (header.getBitsPerPixel()) { case 1: case 2: case 4: return ImageTypeSpecifiers.createFromIndexColorModel(header.getEGAPalette()); case 8: // We may have IndexColorModel here for 1 channel images if (channels == 1 && paletteInfo != PCX.PALETTEINFO_GRAY) { IndexColorModel palette = getVGAPalette(); if (palette == null) { throw new IIOException("Expected VGA palette not found"); } return ImageTypeSpecifiers.createFromIndexColorModel(palette); } // PCX has 1 or 3 channels for 8 bit gray or 24 bit RGB, will be validated by // ImageTypeSpecifier return ImageTypeSpecifiers.createBanded( cs, createIndices(channels, 1), createIndices(channels, 0), DataBuffer.TYPE_BYTE, false, false); case 24: // Some sources says this is possible... return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR); case 32: // Some sources says this is possible... return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR); default: throw new IIOException("Unknown number of bytes per pixel: " + header.getBitsPerPixel()); } }