Объединить URI данных в APNG?

Глядя на спецификацию APNG, кажется, что APNG - это PNG, которые описывают кадры после первого в своих "дополнительных" фрагментах. Поэтому кажется, что было бы целесообразно легко создавать APNG в Javascript, просто составляя заголовки PNG и добавляя dataURI. им. Однако это не идет хорошо.

function compileAPNG (frames, width, height, fps) {

    var fromCharCode = String.fromCharCode;

    var CRC = fromCharCode(0, 0, 0, 0);

    var pngData = fromCharCode(137, 80, 78, 71, 13, 10, 26, 10);

    pngData += fromCharCode(0, 0, 0, 13) + "IHDR" + convertIntToBytes(width) + convertIntToBytes(height) + fromCharCode(0, 0, 0, 0, 0) + CRC
    pngData += fromCharCode(0, 0, 0, 8) + "acTL" + convertIntToBytes(frames.length) + fromCharCode(0, 0, 0, 0) + CRC;
    pngData += fromCharCode(0, 0, 0, 25) + "fcTL" + fromCharCode(0, 0, 0, 0) + convertIntToBytes(width) + convertIntToBytes(height);
    pngData += fromCharCode(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + convertShortToBytes(fps) + fromCharCode(1, 0) + CRC;
    pngData += convertIntToBytes(frames[0].toDataURL().length) + "IDAT" + frames[0].toDataURL() + CRC;

    for (index = 1; index < frames.length; index++) {
        pngData += fromCharCode(0, 0, 0, 25) + "fcTL" + fromCharCode(0, 0, 0, 0) + convertIntToBytes(width) + convertIntToBytes(height);
        pngData += fromCharCode(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + convertShortToBytes(fps) + fromCharCode(1, 0) + CRC;
        pngData += convertIntToBytes(frames[index].toDataURL().length) + "fdAT" + convertIntToBytes(index) + frames[index].toDataURL() + CRC;
    }
    pngData += fromCharCode(0, 0, 0, 0) + "IEND" + CRC;
    window.open("data:image/png;base64," + btoa(pngData));
}

Вычисления CRC являются вычислительно дорогостоящими, поэтому я попытался обмануть их, установив их все в 0. Является ли поэтому Firefox не воспринимает dataURI как изображение?

1 ответ

Firefox отклоняет ваш файл по крайней мере по следующим причинам:

  1. Firefox будет отклонять фрагменты, которые имеют неправильный CRC.

  2. Глубина в битах IHDR не должна быть равна нулю.

  3. Порядковые номера фрагментов fcTL и фрагментов fdAT, за исключением первого фрагмента fcTL, не должны быть равны нулю (должны быть 0001, 0002 и т. Д.)

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