Dies ist eine Fortsetzung von Letztes Mal.
Zusätzlich zu den erforderlichen Blöcken (IHDR / IDAT / IEND)
Chunk | Inhalt |
---|---|
acTL | Informieren Sie, dass es APNG ist |
fcTL | Informieren Sie den Rahmen |
fdAT | Bilddaten rahmen |
Die oben genannten drei. Weitere Informationen finden Sie unter Animierte PNG-Grafiken.
Im Gegensatz zu IDAT hat fdAT eine Sequenznummer in den ersten 4 Bytes. Beachten Sie, dass dies von der Rahmennummer abweicht.
Es sieht aus wie unten.
chunk | Rahmennummer | Sequenznummer |
---|---|---|
acTL(none) | (none) | |
fcTL | 0 | 0 |
IDAT | 0 | (none) |
IDAT | 0 | (none) |
IDAT | 0 | (none) |
fcTL | 1 | 1 |
fdAT | 1 | 2 |
fdAT | 1 | 3 |
fdAT | 1 | 4 |
fcTL | 2 | 5 |
fdAT | 2 | 6 |
fdAT | 2 | 7 |
fdAT | 2 | 8 |
Mit Ausnahme der eigentlichen PNG-Datei werden IDAT und fdAT in mehrere Teile aufgeteilt, dies ist jedoch nur eine Datei, die in Blöcke aufgeteilt ist. Es wird sein, den Speicherverbrauch zu reduzieren, indem bei der Handhabung von Defrator auf die Puffergröße ausgegeben wird.
Holen Sie es mit dem Ank-Pixiv-Tool von Pixiv ab. Wenn Sie die Metadaten zusammen nehmen, erhalten Sie zwei .zip- und .json-Dateien. Tatsächlich sind die Rahmendaten in der .json-Datei enthalten. Ohne diese Daten ist die Zeitleiste unbekannt.
Inhalt der JSON-Datei
{
"info": {
"illust": {
//Kürzung
"path": [
{
"src": "https://i.pximg.net/img-zip-ugoira/img/xx .... xx.zip",
"frames": [
{
"f": "000000.jpg ",
"d": 50
//Kürzung
"referrer": "https://www.pixiv.net/member_illust.php?xxxxx"
}
]
}
}
Alles was Sie tun müssen, ist f und d unter info-> path [0] -> frame [] zu verdienen. f ist der Dateiname und d ist die Verzögerung (in Schritten von 1 ms).
Java hat jedoch keine Standard-JSON-Bibliothek, daher werde ich sie von außen bringen.
Der Unterschied zum letzten Mal besteht darin, dass es den Alphakanal unterstützt und die APNG-Ausgabe und den IDAT-Block teilt. (Ich habe versucht, die Größe in 64 KB-12 Byte zu teilen.)
Dies ist ein Unterschied in der Verwendung von Deflater. Wenn die komprimierten Daten beim letzten Mal nicht größer als das Original sein konnten, wurde entschieden, dass die Puffergröße mit der Eingabegröße übereinstimmt, sie wird jedoch auf den festen Puffer umgeschaltet.
Deflater encoder = new Deflater();
encoder.setInput(buffer);
encoder.finish();
int compresslength;
do {
byte[] outbuffer = new byte[buffersize];
PNGChunk data = new PNGChunk(ChunkTYPE.IDAT);
compresslength = encoder.deflate(outbuffer);
data.setBuffer(outbuffer);
data.setLength(compresslength);
if (compresslength != 0) {
list.add(data);
}
} while (compresslength != 0);
Dieses Mal habe ich mich für eine Datei entschieden, um sie vorerst zu verschieben.
https://github.com/tsudon/Ugoira2GIF