Как установить альфа-флаг в фрагменте VP8X веб-изображения с прозрачностью

Я работаю над декодером кодировщика для анимированного изображения webp, используя чистую java. Мне нужно написать статическое изображение webp из каждого анимированного изображения webp. Он отлично работает, но для изображения с прозрачностью в изображении. читатель получает флаги для анимации и альфы, но когда я пишу флаг для альфы (не устанавливая анимацию как создание статического изображения данного кадра). Но, что удивительно, он вообще не устанавливает флаг. Я пробовал разные индексы, но не работал. Выходное изображение имеет белый фон, а прозрачный bg.

код:

        public byte[] encodeWebPFrame(Frame frame, WebpImage webpImage) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        
        baos.write(riff); // 4
        baos.write(intToByteArray(getFileSize(frame))); // 4
        baos.write(webp); // 4

        baos.write(vp8x); // 4
        baos.write(intToByteArray(10)); // 4
        BitSet bs = new BitSet(32);
        bs.set(1, false); // A hasAnim
        bs.set(2, false); // X hasXmp
        bs.set(3, false); // E hasExif
        bs.set(4, true);  // L hasalpha
        bs.set(5, false); // I hasIccp
        baos.write(bitSetToBytes(bs,4)); // 4
        baos.write(intTo3ByteArray(frame.width)); // 3
        baos.write(intTo3ByteArray(frame.height)); // 3

        // alpha data, bitStream
        if(frame.hasVP8chunk) {
            if(frame.hasALPHchunk) {
                baos.write(alph); // 4
                baos.write(intToByteArray(frame.alphaData.length)); // 4
                baos.write(frame.alphaData); // frame.alphaData.length
            }
            baos.write(vp8); // 4
            baos.write(intToByteArray(frame.bitStream.length)); // 4
            baos.write(frame.bitStream); // frame.bitStream.length
        }else{
//            Logs.i(this,"write byte[] -> VP8L "+frame.bitStream.length+" | baso - "+baos.size());
            baos.write(vp8l); // 4
            baos.write(intToByteArray(frame.bitStream.length)); // 4
            baos.write(frame.bitStream); // frame.bitStream.length
        }
        baos.close();
        return baos.toByteArray();
    }


Здесь я устанавливаю альфа-флаг. Если я установлю для него значение false, то вывод будет неверным изображением. та же логика, которую я использовал для записи в поток, и она работает нормально, но здесь я получаю ошибку при записи в bytearrayoutputstream. Есть идеи?

0 ответов

Другие вопросы по тегам