Frage

im eine Reihe von Fliesen auf einem Canvas zeichnen, diese Fliesen entweder durch Images oder BufferedImages dargestellt werden.

Ich bemerkte, dass im immer Millisekunde mit Images zieht aber was anfangen i BufferedImages für die Fliesen, die Rahmenzeit Himmel Raketen auf über 20 ms verwendet wird.

BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);

Diese beiden Bilder Alphakanäle unterstützen. Ich mag für Vermittler Puffer unter Verwendung von Alpha fähig Image ist zu starten. Jedoch i havent einen Platz in der jdk gefunden, die sie neben diesem Toolkit Anruf erzeugen können, um eine aus einer Datei zu erstellen.

Im Grunde Wer weiß, wie ein leeres Bild erstellen (nicht BufferedImage) von Grund auf, die Alpha unterstützen kann?

War es hilfreich?

Lösung

Um Ihre Frage zu beantworten direkt:

// Create a empty BufferedImage which supports alpha
// It will be just as fast a Toolkit image
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

Einige Hintergrundinformationen:

Es kommt alles auf die Art der BufferedImage Sie verwenden. BufferedImage bietet einen Konstruktor in dem Sie den TYPE specifiy kann (INT_ARGB, 4BYTE_ARGB, etc). Wenn ImageIO verwenden, haben Sie keine Kontrolle über die Art, die bei der Konstruktion des BufferedImage verwendet wird. ImageIO verwendet Typ „0“, die Gewohnheit ist. Die TYPE bestimmt, wie die Bilddaten gespeichert sind / in Speicher zugegriffen, die stark in spielt, wie das Bild gezogen wird / Kopieren / Blitted auf dem Bildschirm (oder ein anderes Bild).

Ich habe einen einfachen Test basiert auf dem Code und die BufferedImage macht immer sehr langsam. Ich erstelle eine zweite BufferedImage mit TYPE_INT_ARGB und kopiert die erste BufferedImage (von ImageIO) hinein. Diese TYPE_INT_ARGB BufferedImage macht mit der gleichen Geschwindigkeit wie das Bild Toolkit.

Andere Tipps

Sie können den alten Imageconsumer / Imageproducer API verwenden, um Bildobjekte mit beliebigen Inhalten erstellen Sie wollen.

Dies wird ein Bildobjekt von ARGB Pixeln in der pix Array mit der angegebenen Breite und Höhe erstellen:

public static Image createImage( int width, int height, int[] pix )
{
    return createImage( width, height, pix, 0, width );
}

public static Image createImage( int width, int height, int[] pix, int offs, int scan )
{
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    ImageProducer source = new MemoryImageSource( width, height, pix, offs, scan );
    return toolkit.createImage( source );
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top