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