java-изображения с альфа-каналом без использования буферизованного изображения

StackOverflow https://stackoverflow.com/questions/2273730

  •  20-09-2019
  •  | 
  •  

Вопрос

я рисую кучу плиток на Canvas, эти плитки представлены либо Imageы или BufferedImages.

я заметил, что я получаю миллисекундные розыгрыши с Images но что я начинаю использовать BufferedImages для плиток время кадра увеличивается до более чем 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 );
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top