coze中计算输入图片像素的小插件pixel

1,506 阅读5分钟

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 requests
from PIL import Image
from 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 requests
from PIL import Image
from 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

  1. 常见的链接输入报错:

输入图片链接的时候,很多人会遇到报错的情况,这时候不一定是图像流的工具或者插件有问题,大概率是输入图片的链接,coze读不出来。

这时候,最好是用一个图像流工具,把网上图片保存到电脑里面,然后上传后,得到类似如下链接格式的图片链接,输入后就可以了

https://lf-bot-studio-plugin-resource.coze.cn/obj/bot-studio-platform-plugin-tos/image/98ebbe14b3404720988481f92ae2a811.png
  1. 叠图比例和位置的设定

这个工具只能帮大家再确定了背景图中预留的宽高之后,才计算出适当的缩放比例。

但是背景图中往往在location和offset上,需要用户自己来设置。

上架插件商店

那么,问题来了,这么好用的插件,在哪里可以用得到呢

好消息,好消息,这个插件已经上架到了coze.cn的插件商店,插件商店里面搜索pixel就可以看到。

www.coze.cn/store/plugi…

插件中有两个工具可用: 第一个pixel工具只是计算输入图片链接的高度和宽度;

第二个img_zoom需要输入背景中预留的叠图宽高数据。