Ejemplo n.º 1
0
  private RenderedImage forceComponentColorModel(RenderedImage image) {
    final IndexColorModel icm = (IndexColorModel) image.getColorModel();
    final SampleModel sm = image.getSampleModel();
    final int datatype = sm.getDataType();
    final boolean alpha = icm.hasAlpha();
    // Definition of the lookup table
    final int numDestinationBands = 4;
    LookupTableJAI lut = null;

    final byte data[][] = new byte[numDestinationBands][icm.getMapSize()];
    icm.getReds(data[0]);
    icm.getGreens(data[1]);
    icm.getBlues(data[2]);
    icm.getAlphas(data[3]);

    lut = new LookupTableJAI(data);
    // Layout creation
    final ImageLayout layout = new ImageLayout(image);
    final RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout);

    int[] bits = new int[numDestinationBands];
    // bits per component
    for (int i = 0; i < numDestinationBands; i++) bits[i] = sm.getSampleSize(i);
    final ComponentColorModel destinationColorModel =
        new ComponentColorModel(
            ColorSpace.getInstance(ColorSpace.CS_sRGB),
            bits,
            alpha,
            image.getColorModel().isAlphaPremultiplied(),
            alpha ? Transparency.TRANSLUCENT : Transparency.OPAQUE,
            datatype);
    final SampleModel destinationSampleModel =
        destinationColorModel.createCompatibleSampleModel(image.getWidth(), image.getHeight());
    layout.setColorModel(destinationColorModel);
    layout.setSampleModel(destinationSampleModel);
    // Lookup Operations
    image =
        LookupDescriptor.create(image, new LookupTableWrapper(lut), 0, null, null, false, hints);

    return image;
  }
  protected RenderedImage convert(RenderedImage renderedImage) throws Exception {

    int height = renderedImage.getHeight();
    int width = renderedImage.getWidth();

    SampleModel sampleModel = renderedImage.getSampleModel();
    ColorModel colorModel = renderedImage.getColorModel();

    Raster raster = renderedImage.getData();

    DataBuffer dataBuffer = raster.getDataBuffer();

    if (colorModel instanceof IndexColorModel) {
      IndexColorModel indexColorModel = (IndexColorModel) colorModel;

      int mapSize = indexColorModel.getMapSize();

      byte[][] data = new byte[4][mapSize];

      indexColorModel.getReds(data[0]);
      indexColorModel.getGreens(data[1]);
      indexColorModel.getBlues(data[2]);
      indexColorModel.getAlphas(data[3]);

      LookupTableJAI lookupTableJAI = new LookupTableJAI(data);

      renderedImage = LookupDescriptor.create(renderedImage, lookupTableJAI, null);
    } else if (sampleModel.getNumBands() == 2) {
      List<Byte> bytesList = new ArrayList<Byte>(height * width * _NUM_OF_BANDS);

      List<Byte> tempBytesList = new ArrayList<Byte>(_NUM_OF_BANDS);

      for (int i = 0; i < dataBuffer.getSize(); i++) {
        int mod = (i + 1) % 2;

        int elemPos = i;

        if (mod == 0) {
          tempBytesList.add((byte) dataBuffer.getElem(elemPos - 1));
          tempBytesList.add((byte) dataBuffer.getElem(elemPos - 1));
        }

        tempBytesList.add((byte) dataBuffer.getElem(elemPos));

        if (mod == 0) {
          Collections.reverse(tempBytesList);

          bytesList.addAll(tempBytesList);

          tempBytesList.clear();
        }
      }

      byte[] data = ArrayUtil.toArray(bytesList.toArray(new Byte[bytesList.size()]));

      DataBuffer newDataBuffer = new DataBufferByte(data, data.length);

      renderedImage = createRenderedImage(renderedImage, height, width, newDataBuffer);
    } else if (colorModel.getTransparency() != Transparency.TRANSLUCENT) {
      List<Byte> bytesList = new ArrayList<Byte>(height * width * _NUM_OF_BANDS);

      List<Byte> tempBytesList = new ArrayList<Byte>(_NUM_OF_BANDS);

      for (int i = 0; i < dataBuffer.getSize(); i++) {
        int mod = (i + 1) % 3;

        int elemPos = i;

        tempBytesList.add((byte) dataBuffer.getElem(elemPos));

        if (mod == 0) {
          tempBytesList.add((byte) 255);

          Collections.reverse(tempBytesList);

          bytesList.addAll(tempBytesList);

          tempBytesList.clear();
        }
      }

      byte[] data = ArrayUtil.toArray(bytesList.toArray(new Byte[bytesList.size()]));

      DataBuffer newDataBuffer = new DataBufferByte(data, data.length);

      renderedImage = createRenderedImage(renderedImage, height, width, newDataBuffer);
    }

    return renderedImage;
  }