Versuchen Sie, APNG aus JavaFX zu erstellen

Animations-PNG erstellen (APNG)

Dies ist eine Fortsetzung von Letztes Mal.

Chunk für APNG erforderlich

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.

Unterschied zwischen IDAT und fdAT

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.

Bringen Sie Animationsdaten schnell

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

Das fertige Produkt

Dieses Mal habe ich mich für eine Datei entschieden, um sie vorerst zu verschieben.

https://github.com/tsudon/Ugoira2GIF

Recommended Posts

Versuchen Sie, APNG aus JavaFX zu erstellen
Versuchen Sie Spring Boot von 0 bis 100.
Versuchen Sie es mit Cocoa von Ruby
Elastic Search Indexerstellung aus Java