create_thumbnail_grid
Arrange multiple images into a thumbnail grid with customizable size, columns, spacing, and background for organized visual previews.
Instructions
创建缩略图网格
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| image_sources | Yes | 图片源列表,每个元素可以是文件路径或base64编码的图片数据 | |
| thumbnail_size | No | 缩略图大小(像素) | |
| grid_columns | No | 网格列数 | |
| spacing | No | 图片间距(像素) | |
| background_color | No | 背景颜色,支持十六进制颜色代码 | #FFFFFF |
| output_format | No | 输出格式:PNG、JPEG、WEBP 等 | PNG |
Implementation Reference
- tools/advanced.py:594-720 (handler)The core asynchronous function implementing the thumbnail grid creation logic: validates inputs, generates square thumbnails with optional borders, arranges them in a grid layout, and returns base64 output.async def create_thumbnail_grid(arguments: Dict[str, Any]) -> List[TextContent]: """ 创建缩略图网格 Args: arguments: 包含图片源列表和网格参数的字典 Returns: List[TextContent]: 处理结果 """ try: # 参数验证 image_sources = arguments.get("image_sources", []) if not image_sources: raise ValidationError("image_sources不能为空") thumbnail_size = arguments.get("thumbnail_size", 150) columns = arguments.get("columns", 4) spacing = arguments.get("spacing", 10) background_color = arguments.get("background_color", "#FFFFFF") border_width = arguments.get("border_width", 2) border_color = arguments.get("border_color", "#CCCCCC") output_format = arguments.get("output_format", DEFAULT_IMAGE_FORMAT) # 验证参数 validate_numeric_range(thumbnail_size, 50, 300, "thumbnail_size") validate_numeric_range(columns, 1, 10, "columns") validate_numeric_range(spacing, 0, 50, "spacing") validate_color_hex(background_color) validate_numeric_range(border_width, 0, 10, "border_width") validate_color_hex(border_color) processor = ImageProcessor() thumbnails = [] # 创建缩略图 for source in image_sources: try: ensure_valid_image_source(source) image = processor.load_image(source) # 创建正方形缩略图 image.thumbnail((thumbnail_size, thumbnail_size), Image.Resampling.LANCZOS) # 创建正方形背景 thumb = Image.new("RGB", (thumbnail_size, thumbnail_size), background_color) # 居中粘贴图片 x_offset = (thumbnail_size - image.width) // 2 y_offset = (thumbnail_size - image.height) // 2 thumb.paste(image, (x_offset, y_offset)) # 添加边框 if border_width > 0: draw = ImageDraw.Draw(thumb) for i in range(border_width): draw.rectangle( [i, i, thumbnail_size - 1 - i, thumbnail_size - 1 - i], outline=border_color ) thumbnails.append(thumb) except Exception as e: # 创建错误占位符 error_thumb = Image.new("RGB", (thumbnail_size, thumbnail_size), "#FF0000") draw = ImageDraw.Draw(error_thumb) draw.text((10, thumbnail_size//2), "ERROR", fill="white") thumbnails.append(error_thumb) # 计算网格尺寸 rows = (len(thumbnails) + columns - 1) // columns grid_width = columns * thumbnail_size + spacing * (columns - 1) grid_height = rows * thumbnail_size + spacing * (rows - 1) # 创建网格 grid = Image.new("RGB", (grid_width, grid_height), background_color) for i, thumb in enumerate(thumbnails): row = i // columns col = i % columns x = col * (thumbnail_size + spacing) y = row * (thumbnail_size + spacing) grid.paste(thumb, (x, y)) # 转换为base64 output_info = processor.output_image(grid, "batch_resize", output_format) return [TextContent( type="text", text=json.dumps({ "success": True, "message": f"成功创建{len(thumbnails)}个缩略图的网格", "data": { **output_info, "metadata": { "thumbnail_count": len(thumbnails), "grid_size": f"{grid.width}x{grid.height}", "thumbnail_size": thumbnail_size, "columns": columns, "rows": rows, "spacing": spacing, "border_width": border_width, "format": output_format } } }, ensure_ascii=False) )] except ValidationError as e: return [TextContent( type="text", text=json.dumps({ "success": False, "error": f"参数验证失败: {str(e)}" }, ensure_ascii=False) )] except Exception as e: return [TextContent( type="text", text=json.dumps({ "success": False, "error": f"创建缩略图网格失败: {str(e)}" }, ensure_ascii=False) )]
- tools/advanced.py:136-196 (schema)Input schema definition for the create_thumbnail_grid tool, specifying parameters like image_sources, thumbnail_size, columns, spacing, colors, etc., with validation constraints.Tool( name="create_thumbnail_grid", description="创建缩略图网格", inputSchema={ "type": "object", "properties": { "image_sources": { "type": "array", "description": "图片源列表(文件路径或base64编码)", "items": {"type": "string"}, "minItems": 1, "maxItems": 20 }, "thumbnail_size": { "type": "integer", "description": "缩略图大小(像素)", "minimum": 50, "maximum": 300, "default": 150 }, "columns": { "type": "integer", "description": "列数", "minimum": 1, "maximum": 10, "default": 4 }, "spacing": { "type": "integer", "description": "间距(像素)", "minimum": 0, "maximum": 50, "default": 10 }, "background_color": { "type": "string", "description": "背景颜色(十六进制格式)", "default": "#FFFFFF" }, "border_width": { "type": "integer", "description": "边框宽度", "minimum": 0, "maximum": 10, "default": 2 }, "border_color": { "type": "string", "description": "边框颜色(十六进制格式)", "default": "#CCCCCC" }, "output_format": { "type": "string", "description": "输出格式", "enum": ["PNG", "JPEG", "WEBP"], "default": "PNG" } }, "required": ["image_sources"] } ),
- main.py:699-724 (registration)FastMCP tool registration using @mcp.tool() decorator. Defines input parameters with Pydantic validation and wraps the call to the advanced handler function.@mcp.tool() def create_thumbnail_grid( image_sources: Annotated[list, Field(description="图片源列表,每个元素可以是文件路径或base64编码的图片数据")], thumbnail_size: Annotated[int, Field(description="缩略图大小(像素)", ge=50, default=150)], grid_columns: Annotated[int, Field(description="网格列数", ge=1, default=4)], spacing: Annotated[int, Field(description="图片间距(像素)", ge=0, default=10)], background_color: Annotated[str, Field(description="背景颜色,支持十六进制颜色代码", default="#FFFFFF")], output_format: Annotated[str, Field(description="输出格式:PNG、JPEG、WEBP 等", default="PNG")] ) -> str: """创建缩略图网格""" try: arguments = { "image_sources": image_sources, "thumbnail_size": thumbnail_size, "grid_columns": grid_columns, "spacing": spacing, "background_color": background_color, "output_format": output_format } result = safe_run_async(advanced_create_thumbnail_grid(arguments)) return result[0].text except Exception as e: return json.dumps({ "success": False, "error": f"创建缩略图网格失败: {str(e)}" }, ensure_ascii=False, indent=2)