java-изображения с альфа-каналом без использования буферизованного изображения
Вопрос
я рисую кучу плиток на Canvas
, эти плитки представлены либо Image
ы или BufferedImage
s.
я заметил, что я получаю миллисекундные розыгрыши с Image
s но что я начинаю использовать BufferedImage
s для плиток время кадра увеличивается до более чем 20 мс.
BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);
Оба этих изображения поддерживают альфа-каналы.Я хотел бы начать использовать alpha capable Image
's для промежуточных буферов.Однако я не нашел места в jdk, которое могло бы сгенерировать их, кроме этого вызова инструментария для создания одного из файлов.
В принципе, кто-нибудь знает, как создать пустое изображение (не BufferedImage) с нуля, которое может поддерживать alpha?
Решение
Чтобы прямо ответить на ваш вопрос:
// 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);
Некоторая предыстория:
Все сводится к ТИПУ BufferedImage, который вы используете.BufferedImage предлагает конструктор, в котором вы можете указать ТИП (INT_ARGB, 4BYTE_ARGB и т.д.).При использовании ImageIO у вас нет контроля над типом, который используется при создании BufferedImage.ImageIO использует тип "0", который является пользовательским.Тип определяет, как данные изображения хранятся / к которым осуществляется доступ в памяти, что в значительной степени влияет на то, как изображение рисуется / копируется / размывается на экране (или другом изображении).
Я создал простой тест, основанный на вашем коде, и BufferedImage всегда отображается ОЧЕНЬ медленно.Я создаю второе изображение буфера с помощью TYPE_INT_ARGB и копирую в него первое изображение буфера (из ImageIO).Это буферное изображение TYPE_INT_ARGB отображается с той же скоростью, что и изображение Toolkit.
Другие советы
Вы можете использовать старый API ImageConsumer /ImageProducer для создания объектов изображений с любым нужным вам содержимым.
Это создаст объект изображения из пикселей ARGB в pix
массив с заданной шириной и высотой:
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 );
}