happytails.ai

APNG to GIF

Open APNG to GIF on Happytails.ai. This view has the same page content and links, with explicit tool capabilities. Read the processing notes before using a tool.

Tool capabilities

{
  "id": "apng-to-gif",
  "category": "image-tools",
  "built": true,
  "requirements": "Runs locally in your browser. Choose one animation up to 20 MiB, 120 frames, 1920 pixels per side and 16 million decoded frame pixels. Processing stops after 120 seconds. Every frame is retained. GIF timing and playback count are preserved; APNG timing rounds cumulatively to 10 milliseconds and playback count is mapped to GIF repeats. GIF supports only binary transparency: the selected alpha threshold is applied after resizing. Palette and dither settings change color quality. Output may be larger; compare before and after bytes. Unsafe delta-frame optimization falls back to full-canvas frames and is reported. Files stay on your device.",
  "implementation": {
    "fields": [
      {
        "key": "colors",
        "label": "Palette colors",
        "value": "256",
        "type": "select",
        "values": [
          "32",
          "64",
          "128",
          "256"
        ]
      },
      {
        "key": "dither",
        "label": "Dithering",
        "value": "sierra2_4a",
        "type": "select",
        "values": [
          "none",
          "bayer",
          "sierra2_4a"
        ]
      },
      {
        "key": "alphaThreshold",
        "label": "Alpha threshold (1 to 255)",
        "value": 128,
        "type": "number",
        "min": 1,
        "max": 255,
        "step": 1
      },
      {
        "key": "optimizeFrames",
        "label": "Optimize frame rectangles",
        "value": "true",
        "type": "select",
        "values": [
          "true",
          "false"
        ]
      }
    ],
    "registrationFamily": "gif-repair",
    "presentation": "metrics",
    "files": true,
    "multiple": false,
    "input": false,
    "accept": ".apng,.png,image/apng,image/png",
    "maxFileBytes": 20971520,
    "note": "Runs locally in your browser. Choose one animation up to 20 MiB, 120 frames, 1920 pixels per side and 16 million decoded frame pixels. Processing stops after 120 seconds. Every frame is retained. GIF timing and playback count are preserved; APNG timing rounds cumulatively to 10 milliseconds and playback count is mapped to GIF repeats. GIF supports only binary transparency: the selected alpha threshold is applied after resizing. Palette and dither settings change color quality. Output may be larger; compare before and after bytes. Unsafe delta-frame optimization falls back to full-canvas frames and is reported. Files stay on your device.",
    "experience": {
      "automatic": false,
      "single": false,
      "inputMaxLength": 1000000,
      "inputMode": "text",
      "label": "Your text",
      "placeholder": "Type or paste your input…",
      "help": "Up to 1,000,000 characters. Review the settings before running.",
      "helpParts": [
        "Up to 1,000,000 characters.",
        "Review the settings before running."
      ],
      "action": "APNG to GIF"
    },
    "mode": "explicit",
    "interactive": false
  },
  "execution": "POST /api/v1/tools/apng-to-gif/run",
  "api": {
    "id": "apng-to-gif",
    "name": "APNG to GIF",
    "category": "image-tools",
    "description": "Convert a validated animated PNG into a GIF while retaining animation frames and playback count, with explicit timing and transparency quantization.",
    "notes": "Processed by the local, self-hosted engine. No third-party conversion service is used. Preserves decoded animation frames and timing. GIF has fewer colours and only binary transparency.",
    "human_path": "/en/image-tools/apng-to-gif/",
    "method": "POST",
    "endpoint": "/api/v1/tools/apng-to-gif/run",
    "schema_url": "/api/v1/tools/apng-to-gif",
    "input_schema": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "input": {
          "type": "string",
          "maxLength": 1000000,
          "default": "",
          "description": "Plain text input. File tools use files instead unless otherwise documented."
        },
        "options": {
          "type": "object",
          "additionalProperties": false,
          "properties": {}
        },
        "files": {
          "type": "array",
          "maxItems": 1,
          "items": {
            "type": "object",
            "required": [
              "name",
              "base64"
            ],
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 200,
                "description": "Filename only, no path."
              },
              "mime": {
                "type": "string",
                "maxLength": 150
              },
              "bytes": {
                "type": "integer",
                "minimum": 0,
                "description": "Optional decoded byte count; must match content if supplied."
              },
              "base64": {
                "type": "string",
                "contentEncoding": "base64",
                "description": "File bytes as padded base64. Use the tool-specific limits.files_bytes value for the total decoded input size."
              }
            }
          }
        }
      }
    },
    "output_schema": {
      "type": "object",
      "required": [
        "tool",
        "result"
      ],
      "properties": {
        "tool": {
          "type": "string"
        },
        "result": {
          "type": "object",
          "required": [
            "text",
            "files"
          ],
          "properties": {
            "text": {
              "type": [
                "string",
                "null"
              ]
            },
            "data": {
              "description": "Parsed JSON when the textual result is JSON."
            },
            "name": {
              "type": "string"
            },
            "mime": {
              "type": "string"
            },
            "files": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "name",
                  "mime",
                  "bytes",
                  "base64"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "base64": {
                    "type": "string",
                    "contentEncoding": "base64"
                  }
                }
              }
            }
          }
        }
      }
    },
    "processing": "Server; self-hosted native engine, no external conversion service",
    "limits": {
      "request_bytes": 31457280,
      "input_characters": 1000000,
      "files_bytes": 20971520,
      "max_files": 1,
      "timeout_seconds": 90
    }
  },
  "agent_processing": "Server; self-hosted native engine, no external conversion service",
  "browser_agent": {
    "supported": true,
    "name": "run_current_tool",
    "discovery": "WebMCP on the human page in a supporting browser",
    "verification": "See audit/API-AUDIT.md; availability is not verification"
  }
}

Page guide

Convert a validated animated PNG into a GIF while retaining animation frames and playback count, with explicit timing and transparency quantization.

How to use APNG to GIF
  1. Choose one animated PNG file and select palette colors, dithering and alpha threshold.
  2. Run the conversion and review the animation, retained frame count, playback count and timing difference.
  3. Download the GIF and JSON report, then check playback in the viewer where you will use it.

Useful next steps

Timing and loop formats differ

APNG frame delays are rounded cumulatively to GIF units of 10 milliseconds. This keeps total rounding error bounded but individual delays may change. One play becomes a GIF without a loop extension; infinite playback remains infinite. Unrepresentable delays or playback counts are rejected.

APNG transparency becomes binary

The converter validates PNG checksums, animation frame counts, sequence numbers, rectangles, disposal and blend controls before decoding. A non-animated PNG is rejected. The separate default image, when present, is not counted as an animation frame. Partial alpha is quantized using the selected threshold; the report records changed alpha pixels.