Ejemplo n.º 1
0
  @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());
    }
  }