java imagens com canal alfa sem o uso de buffer de imagem
Pergunta
im desenho de um monte de peças em um Canvas
, esses blocos são representados por Image
s ou BufferedImage
s.
percebi que estou ficando milissegundo sorteios com Image
mas o que eu começar a usar BufferedImage
s para as telhas o quadro de horário de céu foguetes acima de 20ms.
BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);
Ambas essas imagens apoio canais alfa.Eu gostaria de começar a usar alpha capaz Image
's por intermédio de buffers.No entanto, eu não encontrei um lugar em que o jdk que podem gerá-los, além desse kit de ferramentas chamada para criar um a partir de um arquivo.
Basicamente, alguém sabe como criar uma Imagem em branco (não BufferedImage) a partir do zero que pode oferecer suporte a alpha?
Solução
Para responder a sua pergunta diretamente:
// 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);
Alguns antecedentes:
Tudo isso vem para baixo para o TIPO de BufferedImage que você está usando.BufferedImage oferece um construtor na qual você pode especificar o TIPO (INT_ARGB, 4BYTE_ARGB, etc.).Quando utilizar o ImageIO, você não tem controle sobre o tipo que é usado na construção do BufferedImage.ImageIO usa tipo "0", que é personalizado.O TIPO de governa o modo como os dados de imagem são armazenados/acessado na memória, que desempenha fortemente na forma como a imagem é desenhada/copiar/blitted para a tela (ou outra imagem).
Eu criei um simples teste com base no seu código e o BufferedImage sempre processa MUITO lentamente.Criar uma segunda BufferedImage com TYPE_INT_ARGB e copiou o primeiro BufferedImage (a partir de ImageIO) para ele.Este TYPE_INT_ARGB BufferedImage processa na mesma velocidade, como o kit de ferramentas de imagem.
Outras dicas
Você pode usar a API antiga do ImageConsumer/ImageProducer para criar objetos de imagem com qualquer conteúdo que desejar.
Isso criará um objeto de imagem a partir de pixels argb no pix
Array com a largura e a altura fornecidas:
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 );
}