Chargement rapide et le dessin de données RVB dans BufferedImage

Dans certains code Java en cours d'exécution sur Windows, je suis en train de lire quelques gros blocs de données RVB à partir d'un disque et que vous voulez afficher ce à écran aussi vite que possible. Les données RVB 8 bits par canal, sans alpha. Actuellement, j'ai le code suivant pour créer le 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);
}

Le problème est que les performances de rendu présent à l'écran est assez lent. Environ 250 - 300 ms. J'ai lu que pour la meilleure performance dont vous avez besoin dans un BufferedImage compatible avec l'écran. Pour ce faire, je passe de la mémoire tampon de l'image renvoyée de la méthode ci-dessus pour une méthode de ce genre.

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;
}

Cette méthode convertit essentiellement à partir de l'espace RVB à l'ARGB sur Windows et il accélère vraiment, l'affichage, mais cette méthode prend ~300 ms pour un 1600 x 1200 RVB bloc de données. Alors maintenant, j'ai essentiellement négociés les performances du dessin problème à une conversion de problème.

300ms est d'environ le même temps qu'il faut pour charger les données RVB en données à partir du disque. Je pense que je pourrais faire quelque chose de plus rapide.

Est-il une meilleure façon que je peux faire la conversion? Ou serait-il aider si j'ai modifié les données RVB et ajouter un canal alpha moi-même à l'avance? Si oui, quel serait mon Raster et modèle colorimétrique. Aussi, depuis mon RVB de données ne contient pas de transparence puis-je obtenir toutes les améliorations de performances par l'utilisation de pré multiplié alpha ou quelque chose?

Désolé, bits, je suis un peu perdu sur ce modèle colorimétrique, Raster choses.

Merci!

OriginalL'auteur awinbra | 2011-06-12