happytails.ai

GIF maker

Open GIF maker 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": "gif-maker",
  "category": "image-tools",
  "built": true,
  "requirements": "Files stay in your browser. Use up to 20 MiB of files and 64 megapixels across the source images. The output is limited to 16 million pixels across all frames. Animated source files are rejected. GIF uses up to 256 colors and binary transparency, so colors and translucent edges can change. Your originals are unchanged.",
  "implementation": {
    "fields": [
      {
        "key": "duration",
        "label": "Frame duration (milliseconds)",
        "value": 200,
        "type": "number",
        "min": 20,
        "max": 10000,
        "step": 1
      },
      {
        "key": "width",
        "label": "Maximum width (pixels)",
        "value": 640,
        "type": "number",
        "min": 16,
        "max": 960,
        "step": 1
      },
      {
        "key": "loop",
        "label": "Loop count (0 repeats forever)",
        "value": 0,
        "type": "number",
        "min": 0,
        "max": 1000,
        "step": 1
      }
    ],
    "files": true,
    "multiple": true,
    "input": false,
    "accept": ".png,.jpg,.jpeg,.webp",
    "maxFileBytes": 20971520,
    "note": "Create an animated GIF from 2 to 60 still PNG, JPG or WebP images in your chosen file order. Up to 20 MiB total and 64 megapixels of source images. The first frame sets the shape; other frames fit inside it with transparent padding. Output is limited to 16 million frame-pixels. Timing rounds to 10 milliseconds. GIF supports 256 colors and binary transparency. Files stay in your browser.",
    "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": "Create GIF"
    },
    "mode": "explicit",
    "interactive": false
  },
  "execution": "POST /api/v1/tools/gif-maker/run",
  "api": {
    "id": "gif-maker",
    "name": "GIF maker",
    "category": "image-tools",
    "description": "Turn a sequence of photos into an animated GIF. Choose the speed, size and loop count, then download it.",
    "notes": "Processed by the local, self-hosted engine. No third-party conversion service is used. ",
    "human_path": "/en/image-tools/gif-maker/",
    "method": "POST",
    "endpoint": "/api/v1/tools/gif-maker/run",
    "schema_url": "/api/v1/tools/gif-maker",
    "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": {
            "duration": {
              "type": "number",
              "description": "Frame duration (milliseconds)",
              "default": 200.0,
              "minimum": 20,
              "maximum": 10000,
              "multipleOf": 1
            },
            "loop": {
              "type": "number",
              "description": "Loop count (0 repeats forever)",
              "default": 0.0,
              "minimum": 0,
              "maximum": 1000,
              "multipleOf": 1
            }
          }
        },
        "files": {
          "type": "array",
          "maxItems": 20,
          "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": 20,
      "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

Turn a sequence of photos into an animated GIF. Choose the speed, size and loop count, then download it.

How to use GIF maker
  1. Choose 2 to 60 still PNG, JPG or WebP images in the order you want them to play. Set the time for each frame, the maximum width and the loop count. Select Create GIF and check the animation before downloading.
  2. The first picture sets the shape of the GIF. Other pictures fit inside that shape with transparent padding. The maximum output width is 960 pixels. A loop count of 0 repeats forever. Frame times round to the nearest 10 milliseconds.

Useful next steps

How GIF maker works

Choose 2 to 60 still PNG, JPG or WebP images in the order you want them to play, set a frame duration, maximum width and loop count, and the tool encodes an animated GIF in your browser. The first image sets the shape; other images are scaled to fit inside it with transparent padding, and nothing is enlarged beyond the first image's width. Every frame gets the same duration, rounded to the nearest 10 milliseconds. GIF allows 256 colors and on or off transparency, so gradients and soft edges can change.

Before you start

Put your files in playback order and make the first image the size and shape you want the whole GIF to be. Animated PNG or WebP files are rejected, and the total upload is limited to 20 MiB.

A worked example

Three 1200 × 800 images with a 500 ms frame duration, a 640 pixel maximum width and loop count 0 produced a 640 × 427 GIF with 3 frames that repeats forever. A 125 ms setting was stored as 130 ms.

Put your pictures in motion

Choose 2 to 60 still PNG, JPG or WebP images in the order you want them to play. Set the time for each frame, the maximum width and the loop count. Select Create GIF and check the animation before downloading.

Keep the animation the right size

The first picture sets the shape of the GIF. Other pictures fit inside that shape with transparent padding. The maximum output width is 960 pixels. A loop count of 0 repeats forever. Frame times round to the nearest 10 milliseconds.

What this tool supports

Files stay in your browser. Use up to 20 MiB of files and 64 megapixels across the source images. The output is limited to 16 million pixels across all frames. Animated source files are rejected. GIF uses up to 256 colors and binary transparency, so colors and translucent edges can change. Your originals are unchanged.

Common questions

How do I make a GIF from pictures?

Choose 2 to 60 still images in the order they should play, set how long each frame shows, the maximum width and the loop count, then select Create GIF. Check the preview before downloading animation.gif. Your original images are not changed.

Why does my GIF have transparent or empty borders?

The first image sets the width and height of the whole animation. Images with a different shape are scaled to fit inside that frame and centered with transparent padding. To avoid borders, crop all your images to the same aspect ratio as the first one before you add them.

How fast should each frame be?

Frame duration can be 20 to 10,000 milliseconds and applies to every frame. Around 100 ms gives smooth, quick motion, while 500 to 1,000 ms suits slideshows. GIF stores timing in hundredths of a second, so values round to the nearest 10 ms.

Why do the colors look different in my GIF?

GIF can only use 256 colors per image and each pixel is either fully transparent or fully opaque. Photos, gradients and soft shadows are reduced to that palette with dithering, and partly transparent edges become hard. This is a limit of the GIF format, not a bug.

How large can the GIF be?

The output width can be 16 to 960 pixels and is never larger than the first image. Source images can total 20 MiB and 64 megapixels, with each one up to 16 megapixels. All frames together are limited to 16 million pixels, so long animations need a smaller width.