Ceci est une continuation de Dernière fois.
En plus des blocs requis (IHDR / IDAT / IEND)
Chunk | Contenu |
---|---|
acTL | Informez que c'est APNG |
fcTL | Informer le cadre |
fdAT | Données d'image de cadre |
Les trois ci-dessus. Voir Graphiques PNG animés pour plus d'informations.
Contrairement à IDAT, fdAT a un numéro de séquence dans les 4 premiers octets. Notez que ceci est différent du numéro de cadre.
Cela ressemble à celui ci-dessous.
chunk | Numéro de cadre | Numéro de séquence |
---|---|---|
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 |
À l'exclusion du fichier PNG réel, IDAT et fdAT sont divisés en plusieurs parties, mais il ne s'agit que d'un seul fichier divisé en morceaux. Il s'agira de réduire la consommation de mémoire en affichant la taille du tampon lors de la manipulation de Defrator.
Récupérez-le de Pixiv en utilisant Ank-Pixiv-Tool. Si vous prenez les métadonnées ensemble, vous obtiendrez deux .zip et .json. En fait, les données de trame sont contenues dans le fichier .json. Sans ces données, la chronologie sera inconnue.
Contenu du fichier json
{
"info": {
"illust": {
//réduction
"path": [
{
"src": "https://i.pximg.net/img-zip-ugoira/img/xx .... xx.zip",
"frames": [
{
"f": "000000.jpg ",
"d": 50
//réduction
"referrer": "https://www.pixiv.net/member_illust.php?xxxxx"
}
]
}
}
Tout ce que vous avez à faire est de gagner f et d sous info-> chemin [0] -> frames []. f est le nom du fichier et d est le délai (par incréments de 1 ms).
Cependant, Java n'a pas de bibliothèque JSON standard, je vais donc l'apporter de l'extérieur.
La différence par rapport à la dernière fois est qu'il prend en charge le canal alpha et divise la sortie APNG et le bloc IDAT. (J'ai essayé de diviser la taille en 64 Ko-12 octets.)
C'est une différence dans la façon d'utiliser Deflater. La dernière fois, si les données compressées ne pouvaient pas être plus grandes que l'original, il a été décidé que la taille de la mémoire tampon était la même que la taille d'entrée, mais elle est basculée vers la mémoire tampon fixe.
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);
Cette fois, j'ai décidé sur un dossier de le déplacer pour le moment.
https://github.com/tsudon/Ugoira2GIF