Объединить 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 отклоняет ваш файл по крайней мере по следующим причинам:
Firefox будет отклонять фрагменты, которые имеют неправильный CRC.
Глубина в битах IHDR не должна быть равна нулю.
Порядковые номера фрагментов fcTL и фрагментов fdAT, за исключением первого фрагмента fcTL, не должны быть равны нулю (должны быть 0001, 0002 и т. Д.)