apply_vignette
Adds a vignette effect to images, allowing control over strength and output format. Use to enhance or modify visual focus in photos with customizable intensity.
Instructions
应用晕影效果
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| image_source | Yes | 图片源,可以是文件路径或base64编码的图片数据 | |
| output_format | No | 输出格式:PNG、JPEG、WEBP 等 | PNG |
| strength | No | 晕影强度,范围 0.0-1.0,值越大效果越明显 |
Implementation Reference
- tools/effects.py:783-892 (handler)Core handler function that applies vignette effect by creating a radial gradient mask with Gaussian blur and compositing a colored overlay onto the image.async def apply_vignette(arguments: Dict[str, Any]) -> List[TextContent]: """ 为图片添加暗角效果 Args: arguments: 包含图片源和暗角参数的字典 Returns: List[TextContent]: 处理结果 """ try: # 参数验证 image_source = arguments.get("image_source") ensure_valid_image_source(image_source) intensity = arguments.get("intensity", 0.5) radius = arguments.get("radius", 0.7) color = arguments.get("color", "#000000") output_format = arguments.get("output_format", DEFAULT_IMAGE_FORMAT) # 验证参数 validate_numeric_range(intensity, 0.0, 1.0, "intensity") validate_numeric_range(radius, 0.0, 1.0, "radius") validate_color_hex(color) # 加载图片 processor = ImageProcessor() image = processor.load_image(image_source) # 转换为RGBA模式 if image.mode != "RGBA": image = image.convert("RGBA") # 创建暗角遮罩 mask = Image.new("L", image.size, 255) draw = ImageDraw.Draw(mask) # 计算中心点和半径 center_x, center_y = image.width // 2, image.height // 2 max_radius = min(image.width, image.height) // 2 vignette_radius = int(max_radius * radius) # 创建径向渐变 for y in range(image.height): for x in range(image.width): # 计算到中心的距离 distance = ((x - center_x) ** 2 + (y - center_y) ** 2) ** 0.5 # 计算暗角强度 if distance <= vignette_radius: alpha = 255 else: # 在半径外应用渐变 fade_distance = distance - vignette_radius fade_ratio = min(fade_distance / (max_radius - vignette_radius), 1.0) alpha = int(255 * (1 - intensity * fade_ratio)) mask.putpixel((x, y), alpha) # 应用高斯模糊使暗角更自然 mask = mask.filter(ImageFilter.GaussianBlur(radius=max_radius * 0.1)) # 创建暗角图层 vignette_rgb = tuple(int(color[i:i+2], 16) for i in (1, 3, 5)) vignette_layer = Image.new("RGBA", image.size, vignette_rgb + (0,)) # 应用遮罩 vignette_layer.putalpha(mask) # 合成图片 result_image = Image.alpha_composite(image, vignette_layer) # 转换为base64 output_info = processor.output_image(result_image, "border", output_format) return [TextContent( type="text", text=json.dumps({ "success": True, "message": "成功添加暗角效果", "data": { **output_info, "metadata": { "size": f"{image.width}x{image.height}", "intensity": intensity, "radius": radius, "color": color, "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) )]
- main.py:603-623 (registration)MCP tool registration using @mcp.tool() decorator, which wraps the effects handler and defines the input schema via Annotated fields.@mcp.tool() def apply_vignette( image_source: Annotated[str, Field(description="图片源,可以是文件路径或base64编码的图片数据")], strength: Annotated[float, Field(description="晕影强度,范围 0.0-1.0,值越大效果越明显", ge=0.0, le=1.0, default=0.5)], output_format: Annotated[str, Field(description="输出格式:PNG、JPEG、WEBP 等", default="PNG")] ) -> str: """应用晕影效果""" try: arguments = { "image_source": image_source, "strength": strength, "output_format": output_format } result = safe_run_async(effects_apply_vignette(arguments)) return result[0].text except Exception as e: return json.dumps({ "success": False, "error": f"应用晕影效果失败: {str(e)}" }, ensure_ascii=False, indent=2)
- tools/effects.py:215-252 (schema)JSON schema definition for the apply_vignette tool input parameters, part of get_effect_tools() function.Tool( name="apply_vignette", description="为图片添加暗角效果", inputSchema={ "type": "object", "properties": { "image_source": { "type": "string", "description": "图片源(文件路径或base64编码)" }, "intensity": { "type": "number", "description": "暗角强度(0.0-1.0)", "minimum": 0.0, "maximum": 1.0, "default": 0.5 }, "radius": { "type": "number", "description": "暗角半径(0.0-1.0)", "minimum": 0.0, "maximum": 1.0, "default": 0.7 }, "color": { "type": "string", "description": "暗角颜色(十六进制格式)", "default": "#000000" }, "output_format": { "type": "string", "description": "输出格式", "enum": ["PNG", "JPEG", "WEBP"], "default": "PNG" } }, "required": ["image_source"] }