immagini java con canale alfa senza utilizzando un'immagine tamponata
Domanda
im disegnando un mucchio di piastrelle su una Canvas
, queste piastrelle sono rappresentati da entrambi Image
s o BufferedImage
s.
ho notato che nel mese di ottenere millisecondo disegna con Image
s ma quello che ho iniziare a utilizzare BufferedImage
s per le piastrelle il cielo razzi lasso di tempo di 20 ms di cui sopra.
BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);
Entrambe queste immagini supporta i canali alfa. Vorrei iniziare a utilizzare alfa capaci di Image
per i buffer intermedi. Tuttavia i havent trovato un posto nel JDK che li può generare oltre a questo invito Toolkit per creare uno da un file.
In sostanza qualcuno sa come creare un immagine in bianco (non BufferedImage) da zero in grado di supportare alpha?
Soluzione
Per rispondere direttamente alla tua domanda:
// 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);
Alcuni retroscena:
Tutto si riduce al tipo di BufferedImage si sta utilizzando. BufferedImage offre un costruttore in cui è possibile specifiy TYPE (INT_ARGB, 4BYTE_ARGB, ecc). Quando si utilizza ImageIO, non si ha il controllo sul tipo che viene utilizzato nella costruzione del BufferedImage. ImageIO utilizza tipo "0", che è personalizzato. Il TIPO governa come i dati immagine viene memorizzata / accede in memoria che gioca pesantemente sul modo in cui l'immagine viene disegnata / copiati / blitted allo schermo (o un'altra immagine).
ho creato un semplice test, sulla base di codice e l'BufferedImage rende sempre molto lentamente. Creo un secondo BufferedImage con TYPE_INT_ARGB e copiato prima BufferedImage (da ImageIO) in esso. Questo TYPE_INT_ARGB BufferedImage rende alla stessa velocità come immagine Toolkit.
Altri suggerimenti
È possibile utilizzare la vecchia API ImageConsumer / ImageProducer per creare oggetti Image con qualsiasi contenuto che si desidera.
Ciò creerà un oggetto Immagine da pixel ARGB nella matrice pix
con la larghezza e l'altezza data:
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 );
}