java imágenes con canal alfa sin necesidad de utilizar la imagen tamponada
Pregunta
im dibujo un montón de tejas de un Canvas
, estas baldosas están representados por cualquiera de Image
s o BufferedImage
s.
i di cuenta de que im conseguir milisegundos dibuja con Image
s pero lo que empezar a usar BufferedImage
s de las baldosas los cohetes cielo Marco de tiempo a 20 ms arriba.
BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);
Ambas imágenes admite canales alfa. Me gustaría empezar a utilizar alfa capaces de Image
de buffers intermedios. Sin embargo no he encontrado un lugar en el JDK que pueden generarlos, además de esta llamada Toolkit para crear uno desde un archivo.
Básicamente, ¿alguien sabe cómo crear una imagen en blanco (no BufferedImage) a partir de cero que puede soportar alfa?
Solución
Para responder a su pregunta directamente:
// 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);
Algunos antecedentes:
Todo se reduce al tipo de BufferedImage que está utilizando. BufferedImage ofrece un constructor en el que se puede specifiy el TIPO (INT_ARGB, 4BYTE_ARGB, etc). Al utilizar ImageIO, usted no tiene control sobre el tipo que se usa en la construcción de la BufferedImage. ImageIO utiliza el tipo "0", que es personalizado. El TIPO gobierna cómo se almacena / visitada en la memoria, que juega en gran medida en cómo se dibuja la imagen / copiado / intercambiada a la pantalla (u otra imagen) los datos de imagen.
He creado una prueba simple basado en su código y la BufferedImage siempre hace muy lentamente. Creo un segundo BufferedImage con TYPE_INT_ARGB y copié el primer BufferedImage (de ImageIO) en ella. Este TYPE_INT_ARGB BufferedImage hace a la misma velocidad la imagen Toolkit como.
Otros consejos
Puede utilizar la API de edad ImageConsumer / ImageProducer para crear objetos de imagen con cualquier contenido que desee.
Esto creará un objeto de imagen de píxeles ARGB en la matriz pix
con la anchura dada y altura:
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 );
}