Schnelles laden und zeichnen von RGB-Daten in BufferedImage

In einigen Java-code läuft auf Windows, bin ich beim Lesen einige große Blöcke von RGB-Daten von der Festplatte und wollen diese Anzeige auf dem Bildschirm so schnell wie möglich. Die RGB-Daten mit 8 bit pro Kanal ohne alpha. Derzeit habe ich einen code wie den folgenden erstellen des 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);
}

Das problem ist, dass die Leistung der rendering-diese auf dem Bildschirm ist sehr langsam. Rund 250 - 300 ms. Ich habe gelesen, dass für die beste Leistung, die Sie benötigen, um die Anzeige in ein BufferedImage, das mit dem Bildschirm kompatibel. Zu tun, ich pass das gepufferte Bild zurückgegeben, die von der oben genannten Methode eine Methode wie diese.

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

Dass die Methode im wesentlichen wandelt es von RGB auf ARGB auf Windows und es beschleunigt wirklich die Anzeige, aber diese Methode braucht ~300 ms bei 1600 x 1200 RGB-Daten block. Also ich hab jetzt im Grunde gehandelt, die performance-Einbußen der Zeichnung problem auf eine Umwandlung problem.

300ms ist etwa die gleiche Zeit, wie es dauert, zu laden, die RGB-Daten von der Festplatte. Ich würde denken, ich könnte etwas tun, schneller.

Gibt es eine bessere Art und Weise kann ich die Konvertierung? Oder würde es helfen, wenn ich veränderte die RGB-Daten und zusätzlichen Alphakanal mich vorher? Wenn ja, was würde mein Raster und ColorModel Aussehen. Auch, da mein RGB-Daten nicht enthalten Transparenz kann ich keine performance-Verbesserungen durch die Verwendung von pre-alpha multipliziert, oder was?

Sorry, bisschen ich bin ein wenig verloren auf dieser ColorModel, Raster-Zeug.

Dank!

InformationsquelleAutor awinbra | 2011-06-12

Schreibe einen Kommentar