Быстрый способ конвертировать BufferedImage в байтовый массив и добавить альфа - PullRequest
0 голосов
/ 26 февраля 2019

Я использую следующее, чтобы добавить оверлей к видео;но он не работает должным образом, потому что требует обработки всех пикселей (что ОЧЕНЬ много работы, если у вас есть full-HD со скоростью 50 кадров / сек!)

private static byte[] convert(BufferedImage image, int opacity)
{
    int imgWidth  = image.getWidth();
    int imgHeight = image.getHeight();

    byte[] buffer = new byte[imgWidth * imgHeight * 4]

    int imgLoc = 0;

    for(int y=0; y < imgHeight; y++)
    {
        for(int x=0; x  < imgWidth; x++)
        {
            int argb = image.getRGB(x, y);

            imgBuffer[(imgLoc*4)+0] = (byte)((argb>>0)&0x0FF);
            imgBuffer[(imgLoc*4)+1] = (byte)((argb>>8)&0x0FF);
            imgBuffer[(imgLoc*4)+2] = (byte)((argb>>16)&0x0FF);

            int alpha = ((argb>>24)&0x0FF);
            if (opacity < 100)
                alpha = (alpha*opacity)/100;

            imgBuffer[(imgLoc*4)+3] = (byte)alpha;

            imgLoc++;
        }
    }

Как я могу переписать этокод для выполнения лучше?Я пробовал много разных вещей, например:

  • image.getRGB (0, 0, image.getWidth (), image.getHeight (), null, 0, image.getWidth ());
  • ((DataBufferByte) image.getData (). GetDataBuffer ()). GetData ()

Но, похоже, ничего из этого не работает;наложение не отображается, в то время как более медленный метод, по крайней мере, показывает наложение.

PS: я знаю, что ARGB преобразуется в ABGR в функции выше;Я исправлю это позже.Наложение должно отображаться, хотя и в других цветах

...