public BufferedImage getOpaqueRGBImage() {
    if (bimage.getType() == BufferedImage.TYPE_INT_ARGB) {
      int w = bimage.getWidth();
      int h = bimage.getHeight();
      int size = w * h;

      // Note that we steal the data array here, but only for reading...
      DataBufferInt db = (DataBufferInt) biRaster.getDataBuffer();
      int[] pixels = SunWritableRaster.stealData(db, 0);

      for (int i = 0; i < size; i++) {
        if ((pixels[i] >>> 24) != 0xff) {
          return bimage;
        }
      }

      ColorModel opModel = new DirectColorModel(24, 0x00ff0000, 0x0000ff00, 0x000000ff);

      int bandmasks[] = {0x00ff0000, 0x0000ff00, 0x000000ff};
      WritableRaster opRaster = Raster.createPackedRaster(db, w, h, w, bandmasks, null);

      try {
        BufferedImage opImage = createImage(opModel, opRaster, false, null);
        return opImage;
      } catch (Exception e) {
        return bimage;
      }
    }
    return bimage;
  }
  private void convertToRGB() {
    int w = bimage.getWidth();
    int h = bimage.getHeight();
    int size = w * h;

    DataBufferInt dbi = new DataBufferInt(size);
    // Note that stealData() requires a markDirty() afterwards
    // since we modify the data in it.
    int newpixels[] = SunWritableRaster.stealData(dbi, 0);
    if (cmodel instanceof IndexColorModel
        && biRaster instanceof ByteComponentRaster
        && biRaster.getNumDataElements() == 1) {
      ByteComponentRaster bct = (ByteComponentRaster) biRaster;
      byte[] data = bct.getDataStorage();
      int coff = bct.getDataOffset(0);
      for (int i = 0; i < size; i++) {
        newpixels[i] = srcLUT[data[coff + i] & 0xff];
      }
    } else {
      Object srcpixels = null;
      int off = 0;
      for (int y = 0; y < h; y++) {
        for (int x = 0; x < w; x++) {
          srcpixels = biRaster.getDataElements(x, y, srcpixels);
          newpixels[off++] = cmodel.getRGB(srcpixels);
        }
      }
    }
    // We modified the data array directly above so mark it as dirty now...
    SunWritableRaster.markDirty(dbi);

    isSameCM = false;
    cmodel = ColorModel.getRGBdefault();

    int bandMasks[] = {0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000};

    biRaster = Raster.createPackedRaster(dbi, w, h, w, bandMasks, null);

    bimage = createImage(cmodel, biRaster, cmodel.isAlphaPremultiplied(), null);
    srcLUT = null;
    isDefaultBI = true;
  }