Java-изображения с альфа-каналом без использования буферизованного изображения - PullRequest
1 голос
/ 16 февраля 2010

Я рисую группу плиток на Canvas, эти плитки представлены либо Image с, либо BufferedImage с.

Я заметил, что я получаю миллисекундные дро с Image с, но то, что я начинаю использовать BufferedImage с для тайлов, время полета которых составляет более 20мс.

BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);

Оба эти изображения поддерживают альфа-каналы. Я хотел бы начать использовать альфа-способ Image для промежуточных буферов. Однако я не нашел места в jdk, которое может сгенерировать их, кроме этого вызова Toolkit для его создания из файла.

В принципе кто-нибудь знает, как создать пустое изображение (не BufferedImage) с нуля, которое может поддерживать альфа?

Ответы [ 2 ]

9 голосов
/ 16 февраля 2010

Чтобы ответить на ваш вопрос напрямую:

// 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 всегда ОЧЕНЬ медленно рендерится. Я создаю второй BufferedImage с TYPE_INT_ARGB и копирую первый BufferedImage (из ImageIO) в него. Этот TYPE_INT_ARGB BufferedImage рендерится с той же скоростью, что и изображение Toolkit.

2 голосов
/ 16 февраля 2010

Вы можете использовать старый API ImageConsumer / ImageProducer для создания объектов Image с любым контентом, который вам нужен.

Это создаст объект Image из пикселей 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 );
}
...