coze图像流里面可以在背景上叠加图片,有很多应用:
- 比如将头像叠加到一个固定格式的面板上形成个人资料比如将美食图片叠加到一个海报面板上比如将表情包和meme叠加在一起等等
但是用户输入的图片链接尺寸不可控,背景预留给图片的大小区域也是可变的,所以需要计算输入图片的像素,并且和背景中预留出的叠图区域做对比,尽量的生成一个可适配的图片缩放参数。
好工具已经上架到了coze.cn的插件商店,搜索pixel即可。
1 捏个像素提取的插件
1.1 只计算输入图片的像素
在coze中建立一个插件,用IDE环境直接上,依赖包中添加requests和image。
计算图片的源代码,可以PUA coze的IDE让它帮你写一个,类似以下源码:
输入中添加img_url作为图片输入即可。
from runtime import Args # 假设 Args 是从某个库导入的from typings.pixel.pixel import Input, Output # 假设 Input 和 Output 是从某个库导入的import requestsfrom PIL import Imagefrom io import BytesIO# 其他必要的导入和类定义...# 定义 handler 函数def handler(args: Args) -> Output: try: url = args.input.img_url # 假设 Args 类型的对象有一个 input 属性,它是一个 Input 类型的对象 if not url: raise ValueError("No URL provided") response = requests.get(url, timeout=10) # 设置超时时间 if response.status_code == 200: image = Image.open(BytesIO(response.content)) width, height = image.size return Output(height=height, width=width) # 返回尺寸 else: return Output(error=f"HTTP error: status code {response.status_code}") except ValueError as ve: return Output(error=str(ve)) # 返回错误信息 except requests.exceptions.RequestException as e: return Output(error=str(e)) # 返回请求错误信息 except Exception as e: return Output(error=str(e)) # 返回其他错误信息# 模拟 Args 类型定义,根据您的环境进行调整class Args: def __init__(self, input_data: dict): self.input = Input(input_data['img_url'])# 模拟 Input 类型定义class Input: def __init__(self, img_url: str): self.img_url = img_url# 模拟 Output 类型定义class Output: def __init__(self, height: int = None, width: int = None, error: str = None): self.height = height self.width = width self.error = error# 以下是模拟的代码执行逻辑if __name__ == "__main__": # 假设我们有一个模拟的输入,包含一个图片 URL input_data = {'img_url': 'https://lf-bot-studio-plugin-resource.coze.cn/obj/bot-studio-platform-plugin-tos/artist/image/6c4d9f5dea034f95979ed2e0b23d5b38.png'} args = Args(input_data) # 创建 Args 对象 # 调用 handler 函数并获取结果 result = handler(args) # 根据需要处理结果,例如打印或转换为 JSON 响应 print(result) # 这里使用 print 作为示例,您可以根据需要进行调整
搞个已知尺寸的图片链接,读出来是对的,一个512*512的图。
1.2 和背景预留尺寸做自适应
上一步计算出了输入图片的尺寸。
那么,假如给定一个背景中预留的叠图区域的尺寸,那么就需要让输入的图片和这个尺寸做自适应。
输入除了img_url之外,增加了bgh,bgw两个参数,分别代表需要去适配的高度和宽度。
将wz=bgw/width, hz=bgh/height,如果hz>wz,那么输出的zoom=取整数(wz*100)
一共的输出为height, width, zoom.
继续PUA coze ide和gpt帮我写功能代码。
from runtime import Args # 假设 Args 是从某个库导入的from typings.pixel.pixel import Input, Output # 假设 Input 和 Output 是从某个库导入的import requestsfrom PIL import Imagefrom io import BytesIO# 其他必要的导入和类定义...# 定义 handler 函数def handler(args: Args) -> Output: try: url = args.input.img_url # 获取图片 URL if not url: raise ValueError("No URL provided") response = requests.get(url, timeout=10) # 设置超时时间 if response.status_code == 200: image = Image.open(BytesIO(response.content)) width, height = image.size # 计算新的 zoom 值,并乘以 100,然后取整数 wz = args.input.bgw / width hz = args.input.bgh / height zoom = round(min(hz, wz) * 100) return Output(height=height, width=width, zoom=zoom) # 返回尺寸和 zoom 值 else: return Output(error=f"HTTP error: status code {response.status_code}") except ValueError as ve: return Output(error=str(ve)) # 返回错误信息 except requests.exceptions.RequestException as e: return Output(error=str(e)) # 返回请求错误信息 except Exception as e: return Output(error=str(e)) # 返回其他错误信息# Args 类型定义需要添加 bgh 和 bgw 参数class Args: def __init__(self, input_data: dict): self.input = Input(input_data['img_url'], input_data.get('bgh'), input_data.get('bgw'))# Input 类型定义需要添加 bgh 和 bgw 参数class Input: def __init__(self, img_url: str, bgh: int = None, bgw: int = None): self.img_url = img_url self.bgh = bgh self.bgw = bgw# Output 类型定义,添加 zoom 参数class Output: def __init__(self, height: int = None, width: int = None, zoom: int = None, error: str = None): self.height = height self.width = width self.zoom = zoom self.error = error# 模拟代码执行逻辑部分将被省略,因为它是示例用法,不是核心逻辑
2 搞个背景测试下
一个512*512的纯色背景示例地址如下
https://lf-bot-studio-plugin-resource.coze.cn/obj/bot-studio-platform-plugin-tos/image/477076072fde45e3a4a27e0d86a4deb8.png
做个叠图的workflow
叠图图像流输入就是背景链接,图片链接,zoom值
其中img_logo图像流如下,就是做一个叠图的作用。IM
工作流中调用的img_zoom中,把背景的预留尺寸定义为512*512。
用这个插件,后续大家再叠图的那一步,只需要自己预留好尺寸和图片位置,就可以享受叠图自由了。
并且,单独看插件的输出,可以看到插件输出了图片的宽度width和高度height,还有zoom的建议值50。
Note1: 50代表缩小到原来的50%
Note2:图像流叠图插件里面,取值是0~1000,其中100以内为缩小,100以上为放大
踩坑tips
- 常见的链接输入报错:
输入图片链接的时候,很多人会遇到报错的情况,这时候不一定是图像流的工具或者插件有问题,大概率是输入图片的链接,coze读不出来。
这时候,最好是用一个图像流工具,把网上图片保存到电脑里面,然后上传后,得到类似如下链接格式的图片链接,输入后就可以了
https://lf-bot-studio-plugin-resource.coze.cn/obj/bot-studio-platform-plugin-tos/image/98ebbe14b3404720988481f92ae2a811.png
- 叠图比例和位置的设定
这个工具只能帮大家再确定了背景图中预留的宽高之后,才计算出适当的缩放比例。
但是背景图中往往在location和offset上,需要用户自己来设置。
上架插件商店
那么,问题来了,这么好用的插件,在哪里可以用得到呢
好消息,好消息,这个插件已经上架到了coze.cn的插件商店,插件商店里面搜索pixel就可以看到。
https://www.coze.cn/store/plugin/7387238703439167514
插件中有两个工具可用: 第一个pixel工具只是计算输入图片链接的高度和宽度;
第二个img_zoom需要输入背景中预留的叠图宽高数据。