2010-02-16 7 views
0

En dessinant un tas de tuiles sur un Canvas, ces tuiles sont représentées par Image s ou BufferedImage s.images java avec canal alpha sans utiliser d'image tamponnée

J'ai remarqué que im obtenant tirages milliseconde avec Image s mais ce que je commence à utiliser BufferedImage s pour les tuiles la fuseau horaire du ciel fusées au-dessus de 20ms.

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

Ces deux images prennent en charge les canaux alpha. Je voudrais commencer à utiliser alpha Image pour les tampons intermédiaires. Cependant, je n'ai pas trouvé une place dans le jdk qui peut les générer en plus de cet appel Toolkit pour en créer un à partir d'un fichier.

Fondamentalement quelqu'un sait-il comment créer une image vide (pas BufferedImage) à partir de zéro qui peut supporter l'alpha?

+1

BufferedImage est une Image. Image est une classe abstraite et les deux seules sous-classes dans la bibliothèque Java standard sont BufferedImage et VolatileImage (que vous ne voulez probablement pas utiliser). La vraie question est pourquoi le dessin se fait-il plus rapidement avec les images chargées à partir d'un Toolkit? Etes-vous en train d'écrire une applet? Si ce n'est pas le cas, envisagez d'utiliser un objet JComponent au lieu d'un objet Canvas. La bibliothèque AWT est généralement plus lente que sa contrepartie Swing. – Pace

+1

Comment créez-vous vos images tamponnées? De quel type sont-ils? – basszero

+1

@Pace: il existe d'autres sous-classes de 'java.awt.Image', c'est-à-dire' sun.awt.image.ToolkitImage' que vous obtenez lorsque vous utilisez les méthodes Toolkit pour créer une image et que ces images peignent beaucoup plus rapidement que BufferedImage objets pour une raison quelconque. – x4u

Répondre

8

Pour répondre à votre question directement:

// 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); 

Un peu d'histoire:

Tout se résume au TYPE de BufferedImage que vous utilisez. BufferedImage propose un constructeur dans lequel vous pouvez spécifier le TYPE (INT_ARGB, 4BYTE_ARGB, etc). Lorsque vous utilisez ImageIO, vous n'avez aucun contrôle sur le type utilisé dans la construction de BufferedImage. ImageIO utilise le type "0" qui est personnalisé. Le TYPE régit la façon dont les données d'image sont stockées/accédées en mémoire, ce qui joue lourdement sur la manière dont l'image est dessinée/copiée/fusionnée sur l'écran (ou sur une autre image).

J'ai créé un test simple basé sur votre code et le BufferedImage rend toujours très lentement. Je crée une seconde BufferedImage avec TYPE_INT_ARGB et copié le premier BufferedImage (à partir de ImageIO) dans celui-ci. Ce TYPE_INT_ARGB BufferedImage s'affiche à la même vitesse que l'image Toolkit.

+0

Fondamentalement quelqu'un sait-il comment créer une image vide (pas BufferedImage) à partir de zéro qui peut supporter l'alpha? – aepurniet

+1

Pourquoi l'exigence non-BufferedImage?Si vous lisez le reste de ma réponse, vous apprendrez qu'un INT_ARGB BufferedImage est tout aussi rapide que l'image du Toolkit – basszero

+0

wow votre droite, j'ai essayé de trouver pourquoi c'était, mais la seule différence que je peux trouver est que l'image IMageIO tamponnée utilise un type d'image de 0, ou CUSTOM, donc je suppose qu'il boucle et peint chaque pixel individuellement. désolé de la réponse brève. – aepurniet

1

Vous pouvez utiliser l'ancienne API ImageConsumer/ImageProducer pour créer des objets Image avec le contenu de votre choix.

Cela va créer un objet image de pixels ARVB dans le tableau pix avec la largeur et une hauteur:

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); 
} 
+0

jamais utilisé auparavant, va lui donner un tourbillon. Cela semble prometteur, mais je n'ai jamais utilisé cette API auparavant. – aepurniet