Essayez de créer APNG à partir de JavaFX

Créer une animation PNG (APNG)

Ceci est une continuation de Dernière fois.

Chunk requis pour APNG

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.

Différence entre IDAT et fdAT

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.

Apportez rapidement des données d'animation

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.

sauvegarder

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);

Le produit fini

Cette fois, j'ai décidé sur un dossier de le déplacer pour le moment.

https://github.com/tsudon/Ugoira2GIF

Recommended Posts

Essayez de créer APNG à partir de JavaFX
Essayez Spring Boot de 0 à 100.
Essayez d'utiliser Cocoa de Ruby
Création d'index Elastic Search à partir de Java