Skip to main content
Glama
filters.py22 kB
""" 滤镜效果工具模块 提供各种图片滤镜效果,包括模糊、锐化、边缘检测、浮雕等。 """ from mcp.types import Tool from utils.image_processor import ImageProcessor from utils.validation import validate_numeric_range, ValidationError from mcp.types import TextContent from PIL import Image, ImageFilter, ImageOps import json # 全局图片处理器实例 processor = ImageProcessor() def get_filter_tools() -> list[Tool]: """ 获取滤镜效果工具列表 Returns: 滤镜效果工具列表 """ return [ Tool( name="apply_blur", description="应用模糊滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" }, "radius": { "type": "number", "description": "模糊半径(0.1-10.0)", "minimum": 0.1, "maximum": 10.0 } }, "required": ["image_data", "radius"] } ), Tool( name="apply_gaussian_blur", description="应用高斯模糊滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" }, "radius": { "type": "number", "description": "高斯模糊半径(0.1-10.0)", "minimum": 0.1, "maximum": 10.0 } }, "required": ["image_data", "radius"] } ), Tool( name="apply_sharpen", description="应用锐化滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" } }, "required": ["image_data"] } ), Tool( name="apply_edge_enhance", description="应用边缘增强滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" } }, "required": ["image_data"] } ), Tool( name="apply_emboss", description="应用浮雕滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" } }, "required": ["image_data"] } ), Tool( name="apply_find_edges", description="应用边缘检测滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" } }, "required": ["image_data"] } ), Tool( name="apply_smooth", description="应用平滑滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" } }, "required": ["image_data"] } ), Tool( name="apply_contour", description="应用轮廓滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" } }, "required": ["image_data"] } ), Tool( name="apply_sepia", description="应用复古棕褐色滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" } }, "required": ["image_data"] } ), Tool( name="apply_invert", description="应用反色滤镜", inputSchema={ "type": "object", "properties": { "image_data": { "type": "string", "description": "图片数据(base64编码)" } }, "required": ["image_data"] } ) ] async def apply_blur(image_source: str, radius: float) -> list[TextContent]: """ 应用模糊滤镜 Args: image_source: 图片源(文件路径或base64编码数据) radius: 模糊半径 Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_source: raise ValidationError("图片源不能为空") if not validate_numeric_range(radius, 0.1, 10.0): raise ValidationError(f"模糊半径必须在0.1-10.0范围内: {radius}") # 加载图片 image = processor.load_image(image_source) # 应用模糊滤镜 blurred_image = image.filter(ImageFilter.BoxBlur(radius)) # 输出处理后的图片 output_info = processor.output_image(blurred_image, "blur") result = { "success": True, "message": f"模糊滤镜应用成功: 半径 {radius}", "data": { **output_info, "filter_type": "blur", "radius": radius, "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"模糊滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] async def apply_gaussian_blur(image_data: str, radius: float) -> list[TextContent]: """ 应用高斯模糊滤镜 Args: image_data: 图片数据(base64编码) radius: 高斯模糊半径 Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_data: raise ValidationError("图片数据不能为空") if not validate_numeric_range(radius, 0.1, 10.0): raise ValidationError(f"高斯模糊半径必须在0.1-10.0范围内: {radius}") # 加载图片 image = processor.load_image(image_data) # 应用高斯模糊滤镜 blurred_image = image.filter(ImageFilter.GaussianBlur(radius)) # 输出处理后的图片 output_info = processor.output_image(blurred_image, "gaussian_blur") result = { "success": True, "message": f"高斯模糊滤镜应用成功: 半径 {radius}", "data": { **output_info, "filter_type": "gaussian_blur", "radius": radius, "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"高斯模糊滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] async def apply_sharpen(image_data: str) -> list[TextContent]: """ 应用锐化滤镜 Args: image_data: 图片数据(base64编码) Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_data: raise ValidationError("图片数据不能为空") # 加载图片 image = processor.load_image(image_data) # 应用锐化滤镜 sharpened_image = image.filter(ImageFilter.SHARPEN) # 输出处理后的图片 output_info = processor.output_image(sharpened_image, "sharpen") result = { "success": True, "message": "锐化滤镜应用成功", "data": { **output_info, "filter_type": "sharpen", "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"锐化滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] async def apply_edge_enhance(image_data: str) -> list[TextContent]: """ 应用边缘增强滤镜 Args: image_data: 图片数据(base64编码) Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_data: raise ValidationError("图片数据不能为空") # 加载图片 image = processor.load_image(image_data) # 应用边缘增强滤镜 enhanced_image = image.filter(ImageFilter.EDGE_ENHANCE) # 输出处理后的图片 output_info = processor.output_image(enhanced_image, "edge_enhance") result = { "success": True, "message": "边缘增强滤镜应用成功", "data": { **output_info, "filter_type": "edge_enhance", "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"边缘增强滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] async def apply_emboss(image_data: str) -> list[TextContent]: """ 应用浮雕滤镜 Args: image_data: 图片数据(base64编码) Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_data: raise ValidationError("图片数据不能为空") # 加载图片 image = processor.load_image(image_data) # 应用浮雕滤镜 embossed_image = image.filter(ImageFilter.EMBOSS) # 输出处理后的图片 output_info = processor.output_image(embossed_image, "emboss") result = { "success": True, "message": "浮雕滤镜应用成功", "data": { **output_info, "filter_type": "emboss", "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"浮雕滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] async def apply_find_edges(image_data: str) -> list[TextContent]: """ 应用边缘检测滤镜 Args: image_data: 图片数据(base64编码) Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_data: raise ValidationError("图片数据不能为空") # 加载图片 image = processor.load_image(image_data) # 应用边缘检测滤镜 edges_image = image.filter(ImageFilter.FIND_EDGES) # 输出处理后的图片 output_info = processor.output_image(edges_image, "find_edges") result = { "success": True, "message": "边缘检测滤镜应用成功", "data": { **output_info, "filter_type": "find_edges", "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"边缘检测滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] async def apply_smooth(image_data: str) -> list[TextContent]: """ 应用平滑滤镜 Args: image_data: 图片数据(base64编码) Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_data: raise ValidationError("图片数据不能为空") # 加载图片 image = processor.load_image(image_data) # 应用平滑滤镜 smooth_image = image.filter(ImageFilter.SMOOTH) # 输出处理后的图片 output_info = processor.output_image(smooth_image, "smooth") result = { "success": True, "message": "平滑滤镜应用成功", "data": { **output_info, "filter_type": "smooth", "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"平滑滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] async def apply_contour(image_data: str) -> list[TextContent]: """ 应用轮廓滤镜 Args: image_data: 图片数据(base64编码) Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_data: raise ValidationError("图片数据不能为空") # 加载图片 image = processor.load_image(image_data) # 应用轮廓滤镜 contour_image = image.filter(ImageFilter.CONTOUR) # 输出处理后的图片 output_info = processor.output_image(contour_image, "contour") result = { "success": True, "message": "轮廓滤镜应用成功", "data": { **output_info, "filter_type": "contour", "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"轮廓滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] async def apply_sepia(image_data: str) -> list[TextContent]: """ 应用复古棕褐色滤镜 Args: image_data: 图片数据(base64编码) Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_data: raise ValidationError("图片数据不能为空") # 加载图片 image = processor.load_image(image_data) # 转换为RGB模式 if image.mode != 'RGB': image = image.convert('RGB') # 应用棕褐色滤镜 pixels = image.load() width, height = image.size for y in range(height): for x in range(width): r, g, b = pixels[x, y] # 棕褐色变换公式 tr = int(0.393 * r + 0.769 * g + 0.189 * b) tg = int(0.349 * r + 0.686 * g + 0.168 * b) tb = int(0.272 * r + 0.534 * g + 0.131 * b) # 确保值在0-255范围内 tr = min(255, tr) tg = min(255, tg) tb = min(255, tb) pixels[x, y] = (tr, tg, tb) # 输出处理后的图片 output_info = processor.output_image(image, "sepia") result = { "success": True, "message": "复古棕褐色滤镜应用成功", "data": { **output_info, "filter_type": "sepia", "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"复古棕褐色滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] async def apply_invert(image_data: str) -> list[TextContent]: """ 应用反色滤镜 Args: image_data: 图片数据(base64编码) Returns: 应用滤镜后的图片数据 """ try: # 验证参数 if not image_data: raise ValidationError("图片数据不能为空") # 加载图片 image = processor.load_image(image_data) # 应用反色滤镜 inverted_image = ImageOps.invert(image.convert('RGB')) # 输出处理后的图片 output_info = processor.output_image(inverted_image, "invert") result = { "success": True, "message": "反色滤镜应用成功", "data": { **output_info, "filter_type": "invert", "size": image.size } } return [TextContent(type="text", text=json.dumps(result, ensure_ascii=False))] except ValidationError as e: error_result = { "success": False, "error": f"参数验证失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))] except Exception as e: error_result = { "success": False, "error": f"反色滤镜应用失败: {str(e)}" } return [TextContent(type="text", text=json.dumps(error_result, ensure_ascii=False))]

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/duke0317/ps-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server