happytails.ai

Image to STL

Open Image to STL 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": "image-to-stl",
  "category": "maker-tools",
  "built": true,
  "requirements": "Runs locally without uploads. One still PNG, JPEG or WebP up to 20 MiB, 40 megapixels and 16,384 pixels per side. Builds a closed, outward-facing binary STL height-map relief with a flat base, not a complete reconstructed 3D object. Alpha is composited on white, then brightness uses 0.299 red + 0.587 green + 0.114 blue in decoded 8-bit RGB. A deterministic bilinear sample grid sets the top surface; light pixels are higher unless inverted. Image top faces positive model Y. Width is 1 to 500 mm, relief 1 to 50 mm, base 1 to 20 mm; depth follows the image ratio and must not exceed 500 mm. Resolution is 8 to 256 samples on the longest side, with at least 2 per axis. All dimensions use millimeters, but STL does not encode a formal unit: confirm units in your slicer. Processing stops after 90 seconds.",
  "implementation": {
    "fields": [
      {
        "key": "width",
        "label": "Model width (mm)",
        "value": "100",
        "type": "number",
        "min": 1,
        "max": 500,
        "step": 0.1
      },
      {
        "key": "height",
        "label": "Relief height (mm)",
        "value": "5",
        "type": "number",
        "min": 1,
        "max": 50,
        "step": 0.1
      },
      {
        "key": "base",
        "label": "Base thickness (mm)",
        "value": "2",
        "type": "number",
        "min": 1,
        "max": 20,
        "step": 0.1
      },
      {
        "key": "resolution",
        "label": "Samples on longest side",
        "value": "100",
        "type": "number",
        "min": 8,
        "max": 256,
        "step": 1
      },
      {
        "key": "invert",
        "label": "Darker pixels are higher",
        "value": false,
        "type": "checkbox"
      }
    ],
    "registrationFamily": "image-local-exports",
    "presentation": "metrics",
    "files": true,
    "input": false,
    "multiple": false,
    "deferImagePreview": true,
    "accept": ".png,.jpg,.jpeg,.webp",
    "maxFileBytes": 20971520,
    "note": "Runs locally without uploads. One still PNG, JPEG or WebP up to 20 MiB, 40 megapixels and 16,384 pixels per side. Builds a closed, outward-facing binary STL height-map relief with a flat base, not a complete reconstructed 3D object. Alpha is composited on white, then brightness uses 0.299 red + 0.587 green + 0.114 blue in decoded 8-bit RGB. A deterministic bilinear sample grid sets the top surface; light pixels are higher unless inverted. Image top faces positive model Y. Width is 1 to 500 mm, relief 1 to 50 mm, base 1 to 20 mm; depth follows the image ratio and must not exceed 500 mm. Resolution is 8 to 256 samples on the longest side, with at least 2 per axis. All dimensions use millimeters, but STL does not encode a formal unit: confirm units in your slicer. Processing stops after 90 seconds.",
    "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": "Convert file"
    },
    "mode": "explicit",
    "interactive": false
  },
  "execution": "POST /api/v1/tools/image-to-stl/run",
  "api": {
    "id": "image-to-stl",
    "name": "Image to STL",
    "category": "maker-tools",
    "description": "Turn a still image into a closed binary STL height-map relief with millimeter dimensions, a flat base and bounded sampling.",
    "notes": "Processed on our server with no external conversion service. Creates a solid height-map relief, not a complete 3D object. Transparent pixels use white. Open the STL in a slicer and confirm millimeter units before printing.",
    "human_path": "/en/maker-tools/image-to-stl/",
    "method": "POST",
    "endpoint": "/api/v1/tools/image-to-stl/run",
    "schema_url": "/api/v1/tools/image-to-stl",
    "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": {
            "width": {
              "type": "number",
              "description": "Model width (mm)",
              "default": 100.0,
              "minimum": 1,
              "maximum": 500,
              "multipleOf": 1
            },
            "height": {
              "type": "number",
              "description": "Relief height (mm)",
              "default": 5.0,
              "minimum": 1,
              "maximum": 50,
              "multipleOf": 1
            },
            "base": {
              "type": "number",
              "description": "Base thickness (mm)",
              "default": 2.0,
              "minimum": 1,
              "maximum": 20,
              "multipleOf": 1
            },
            "resolution": {
              "type": "number",
              "description": "Samples on longest side",
              "default": 100.0,
              "minimum": 8,
              "maximum": 256,
              "multipleOf": 1
            },
            "invert": {
              "type": "boolean",
              "description": "Darker pixels are higher",
              "default": false
            }
          }
        },
        "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

Turn a still image into a closed binary STL height-map relief with millimeter dimensions, a flat base and bounded sampling.

How to use Image to STL
  1. Choose one still PNG, JPEG or WebP image.
  2. Set model width, relief height, base thickness, sampling resolution and whether dark pixels are higher.
  3. Review the actual model dimensions and triangle count, then download the STL and confirm millimeter units in your slicer.

Useful next steps

Brightness controls relief height

Transparency is composited over white. Brightness uses 0.299 red + 0.587 green + 0.114 blue in decoded 8-bit RGB, then deterministic bilinear sampling. Inversion swaps which brightness values are high. This is a height-map relief, not full 3D reconstruction.

Check units and mesh scale

Depth follows the oriented image aspect ratio and cannot exceed 500 mm. The model has a flat base and closed side walls with outward-facing triangles. STL does not encode a formal unit; confirm millimeters in your slicer before printing.