Carregamento rápido e desenho de dados RGB no BufferedImage

Em algum código Java em execução no Windows, estou lendo alguns grandes blocos de dados RGB do disco e quero exibi-los na tela o mais rápido possível. Os dados RGB são 8 bits por canal sem alfa. Atualmente, tenho um código como o seguinte para criar o BufferedImage.

BufferedImage getBufferedImage(File file, int width, int height) {

    byte[] rgbData = readRGBFromFile(file);

    WritableRaster raster = Raster.createInterleavedRaster(
        rgbData, width, height, 
        width * 3, // scanlineStride
        3, // pixelStride
        new int[]{0, 1, 2}, // bandOffsets
        null);

    ColorModel colorModel = new ComponentColorModel(
        ColorSpace.getInstance(ColorSpace.CS_sRGB), 
        new int[]{8, 8, 8}, // bits
        false, // hasAlpha
        false, // isPreMultiplied
        ComponentColorModel.OPAQUE, 
        DataBuffer.TYPE_BYTE);

    return new BufferedImage(colorModel, raster, false, null);
}

O problema é que o desempenho de renderizar isso na tela é bastante lento. Cerca de 250 - 300 ms. Eu li que, para obter o melhor desempenho, você precisa exibir em uma BufferedImage compatível com a tela. Para fazer isso, passo a imagem em buffer retornada do método acima para um método como est

BufferedImage createCompatibleImage(BufferedImage image)
{
    GraphicsConfiguration gc = GraphicsEnvironment.
        getLocalGraphicsEnvironment().
        getDefaultScreenDevice().
        getDefaultConfiguration();

    BufferedImage newImage = gc.createCompatibleImage(
        image.getWidth(), 
        image.getHeight(), 
        Transparency.TRANSLUCENT);

    Graphics2D g = newImage.createGraphics();
    g.drawImage(image, 0, 0, null);
    g.dispose();

    return newImage;
}

Esse método basicamente o converte de RGB para ARGB no Windows e realmente acelera a exibição, mas esse método leva ~ 300 ms para um bloco de dados de 1600 x 1200 RGB. Então agora eu basicamente troquei o desempenho do problema do desenho para um problema de conversã

300ms é quase o mesmo tempo necessário para carregar os dados RGB do disco. Eu acho que poderia fazer algo mais rápido.

Existe uma maneira melhor de fazer a conversão? Ou ajudaria se eu modificasse os dados RGB e adicionasse um canal alfa antes? Nesse caso, qual seria a aparência do meu Raster e ColorModel. Além disso, como meus dados RGB não contêm transparência, posso obter melhorias de desempenho usando alfa pré-multiplicado ou algo assim?

Desculpe, mas estou um pouco perdido nesse material ColorModel, Raste

Obrigado

questionAnswers(2)

yourAnswerToTheQuestion