通义万相 + OSS:给商会活动做一套自动生成海报的方案

简介: 商会年办十余场活动,海报设计成本高、效率低。我们采用“AI生成底图+前端Canvas合成文字”方案:用通义万相turbo版快速产出无文字背景图,再由前端精准叠加标题、时间等关键信息并上传OSS。兼顾准确性、统一性与低成本,全年节省设计费用数万元。(239字)

商会办活动的频率不低,一年十几场。每场活动都要出海报——年会、对接会、走访、沙龙,样式还要有形有色。秘书长找设计做,一张海报几十到几百块,一年下来也是一笔开销;找会员里的设计师帮忙,欠人情。

去年我们把这件事自动化了。这篇把方案记下来:用通义万相生成底图,前端合成文字,上传到 OSS,全程不用人画图。

先说清楚边界

有一点要先说明:我们没有让模型直接生成带文字的完整海报。原因很实际——文生图模型写汉字的能力不稳定,生成的标题经常是错字或者乱码。商会的海报上,活动名称、时间、地点必须准确,错一个字就不敢往外发。

所以方案拆成两步:模型只负责生成底图(背景、氛围、配色),文字部分用前端 Canvas 合成。这样既省了设计成本,文字又完全可控。

整体架构

流程是四步。第一步,活动信息录入系统,拿到标题、时间、地点、主办方。第二步,把活动类型映射成提示词模板,调通义万相生成底图。第三步,前端用 Canvas 把底图和文字合成一张完整海报。第四步,合成结果上传 OSS,拿到链接返回给前端。

为什么要拆成"模型出底图、前端合文字"两步,而不是让模型一步出完?除了前面说的汉字准确性问题,还有一个考虑是可复用性。同一张底图,换个活动标题就能再用一次;如果让模型把文字也画进去,每换一个活动就要重新生成一次,成本和耗时都上去了。

还有一点是版式对齐。商会的海报经常要发给会员、发到群里,版式得统一。让模型自由发挥,每一张的标题位置、字号都不一样,看起来不像一个系列。用 Canvas 合成,版式是写死在代码里的,几十张海报的标题都在同一个位置。

调用通义万相

用 DashScope 的 Node SDK。文生图是异步接口,提交任务之后拿 task_id 去轮询结果。

import DashScope from 'dashscope-sdk';

const client = new DashScope({
    apiKey: process.env.DASHSCOPE_KEY });

async function generatePoster(prompt) {
   
  // 1. 提交任务
  const task = await client.images.generations.create({
   
    model: 'wanx2.1-t2i-turbo',
    input: {
    prompt },
    parameters: {
    size: '1024*1536', n: 1 }
  });
  const taskId = task.output.task_id;

  // 2. 轮询结果,超时上限设为 60 秒
  const deadline = Date.now() + 60_000;
  while (Date.now() < deadline) {
   
    const res = await client.tasks.get(taskId);
    const status = res.output.task_status;
    if (status === 'SUCCEEDED') {
   
      return res.output.results[0].url; // 底图临时地址
    }
    if (status === 'FAILED') {
   
      throw new Error('底图生成失败: ' + res.output.message);
    }
    await new Promise((r) => setTimeout(r, 2000));
  }
  throw new Error('底图生成超时');
}

模型选型上我们对比过。通义万相的 turbo 版本生成速度快,两三秒出图,适合这种批量、对细节要求不高的场景;标准版出图质量更细腻,但耗时长,用在需要精修的场合。商会的活动海报对画质要求不高——发出去看的是信息,不是画质细节——所以选了 turbo 版本。

提示词模板按活动类型分开维护。年会用偏正式的红金配色,对接会用偏商务的蓝白配色,沙龙用轻松一点的浅色系。

const PROMPT_TPL = {
   
  annual: '年会庆典海报背景,红色与金色为主,喜庆庄重,留白区域在下方三分之一,无文字',
  match: '商务对接会海报背景,蓝色与白色为主,简洁现代,留白区域在下方三分之一,无文字',
  salon: '轻松沙龙海报背景,浅米色与绿色为主,柔和自然,留白区域在下方三分之一,无文字'
};

function buildPrompt(type) {
   
  return PROMPT_TPL[type] || PROMPT_TPL.salon;
}

提示词里"无文字"这三个字很关键,不加的话模型会自己往上写一堆看不懂的字符,后期不好处理。

前端 Canvas 合成文字

底图拿到之后,前端把底图画到 Canvas 上,再往上写文字。

async function compose(bgUrl, info) {
   
  const img = new Image();
  img.crossOrigin = 'anonymous';
  await new Promise((res, rej) => {
   
    img.onload = res;
    img.onerror = rej;
    img.src = bgUrl;
  });

  const canvas = document.createElement('canvas');
  canvas.width = img.width;
  canvas.height = img.height;
  const ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0);

  // 底部加一层半透明遮罩,保证文字可读
  ctx.fillStyle = 'rgba(0,0,0,0.35)';
  ctx.fillRect(0, img.height * 0.62, img.width, img.height * 0.38);

  ctx.textAlign = 'center';
  ctx.fillStyle = '#ffffff';

  ctx.font = `bold ${
     img.width * 0.075}px "PingFang SC", "Microsoft YaHei", sans-serif`;
  ctx.fillText(info.title, img.width / 2, img.height * 0.72);

  ctx.font = `${
     img.width * 0.04}px "PingFang SC", "Microsoft YaHei", sans-serif`;
  ctx.fillText(`时间:${
     info.time}`, img.width / 2, img.height * 0.8);
  ctx.fillText(`地点:${
     info.place}`, img.width / 2, img.height * 0.85);
  ctx.fillText(info.org, img.width / 2, img.height * 0.92);

  return canvas;
}

上传 OSS

合成完拿到 canvas,转成 blob 上传。上传走服务端签名,直传 OSS,不经过应用服务器。

async function uploadPoster(canvas, fileName) {
   
  // 1. 向服务端要直传签名
  const {
    policy, signature, ossAccessKeyId, host, dir } =
    await fetch('/api/oss/sign').then((r) => r.json());

  const blob = await new Promise((res) =>
    canvas.toBlob(res, 'image/png', 0.92)
  );

  const form = new FormData();
  form.append('key', dir + fileName);
  form.append('policy', policy);
  form.append('OSSAccessKeyId', ossAccessKeyId);
  form.append('signature', signature);
  form.append('success_action_status', '200');
  form.append('file', blob);

  await fetch(host, {
    method: 'POST', body: form });
  return `${
     host}/${
     dir}${
     fileName}`;
}

服务端签名用 STS 临时凭证,不要用主账号 AK,权限只给到指定目录的写权限。

这套方案跑了一年,跟两种替代方式对比过。一种是纯人工找设计做,一张海报几十到几百块,一年十几场活动攒下来不是小数,而且设计的档期经常赶不上活动临时改时间。另一种是第三方海报 SaaS,模板多但风格偏通用,商会的红金喜庆调性得反复调,而且数据在别人服务器上。自己搭这套方案,前期多花点开发时间,后面每次活动点一下就出图,长期看划算。

踩过的坑

第一个是跨域。Canvas 要读底图的像素,底图跨域的话 canvas 会被污染,toBlob 会报错。解决办法是给 OSS 的 Bucket 配跨域规则,并且 img 标签设 crossOrigin。

第二个是异步轮询。文生图是异步的,提交完不能直接拿结果。一开始没做超时,遇到一次任务卡住,前端一直转圈。加上超时和失败处理之后正常了。

第三个是字体。Canvas 里用的字体必须是用户机器上有的,不然会退化成默认字体,海报排版会散。中文字体统一用系统字体族兜底。

第四个是底图的有效期。通义万相返回的底图地址是临时的,合成上传要在这个地址失效前完成。做法是拿到底图后立刻合成上传,不做缓存。

第五个是生成结果不合用。模型出图有随机性,同一句提示词也可能出一张风格跑偏的图。我们的做法是一次生成两张,前端做成左右选择,秘书长挑一张继续合成。多一次请求的成本,比让秘书长重走一遍流程低。

我们这边在跑的商会管理系统叫未来漫城·商会互联平台,上面这套海报生成现在嵌在活动发布流程里,秘书长填完活动信息点一下,两三分钟出一张海报。

相关文章
|
1月前
|
存储 运维 关系型数据库
PolarDB-X 大规模 TCO Benchmark:自建方案与云原生 3 年成本全面实测对比
本次大规模 TCO Benchmark 全面覆盖了 100 CU 到 512 CU 三种规模场景,数据一致表明阿里云瑶池数据库旗下的 PolarDB-X 在大规模部署中具有 40-55% 的 TCO 优势,是业界最值得推荐的分布式数据库方案。人力成本的断崖式下降、故障损失的显著减少和弹性效率的大幅提升是 PolarDB-X 成本领先的三大驱动力。强烈推荐所有大规模数据库用户将 PolarDB-X 作为首选方案进行评估,建议尽快启动迁移以获得成本红利,适用于电商、金融、物联网、社交、物流、政府等行业的大规模数据场景,尤其适用于节点数超过 100 的大型集群部署场景。
103 0
|
1月前
|
人工智能 运维 安全
登顶Data Agent领导者的背后:阿里云 AIDBS 给出关键答案
IDC《中国Data Agent 2026厂商评估》显示,阿里云位居领导者最领先位置。其AI原生数据库服务(AIDBS)作为核心底座,支持100+多源数据,通过OneMeta语义层与超级Agent协同,实现数据资产化、智能分析、自治运维全链路闭环,推动企业从“拥有数据”迈向“用Agent释放价值”。
267 0
|
1月前
|
缓存 API 开发工具
Qwen3.8‑Flash完整能力深度解析:新一代MoE大模型、API实操调用与计费规则全拆解
随着大模型应用从简单对话走向长文档处理、代码智能体、多步骤工具调用、图文混合分析,开发者对模型同时提出三重诉求:更强推理能力、更大上下文窗口、更低推理成本。传统稠密大模型想要做到百万Token上下文,推理算力开销会急剧上涨,直接抬高业务运行成本,很多面向高并发智能体、批量文档解析的业务,受限于开销无法大规模落地。Qwen3.8‑Flash作为新一代多模态混合专家MoE模型,采用Next全新架构,总参数规模125B,推理阶段每一次Token仅激活6B参数,兼顾大模型的综合能力与小模型的推理速度,原生支持百万级上下文窗口,同时具备多模态输入、函数调用、深度思考、上下文缓存等全套生产级特性,成为高并
627 0
|
1月前
|
人工智能 算法
3个月,520万播放,6666个粉丝,普通人如何用AI搞副业?
AI时代,普通人也能轻松做自媒体!本文揭秘“AI自动变现”全流程:从0搭建账号、AI批量生产内容、多平台自动分发,到广告/带货/IP多元变现。无需天赋团队,7天起号,日更3-5条,小投入撬动长期收益。方法已验证,人人可复制。
|
1月前
|
存储 弹性计算 运维
什么是阿里云服务器ECS,及其优势、购买、使用方式和部署建议与实操命令教程
在云计算技术普及的时代,传统自建机房模式面临硬件采购成本高、部署周期漫长、硬件维护繁琐、资源弹性不足等诸多现实痛点。企业想要搭建业务系统,需要采购服务器硬件、搭建机房环境、部署供电与网络设施,前期投入巨大,业务流量波动时,硬件资源很难快速扩缩容。而云服务器ECS(Elastic Compute Service)作为IaaS层级的核心云计算服务,把计算资源转变为可按需取用的公共基础设施,如同日常使用水电燃气,用户无需采购实体IT硬件,就可以获取虚拟服务器能力,实现资源分钟级交付、弹性伸缩,广泛适配个人开发者、中小企业、大型企业的各类业务场景。本文将完整讲解ECS产品定义、核心优势、产品架构组件、
606 1
|
1月前
|
缓存 JSON 安全
百炼Kimi‑K3旗舰模型完整解析:2.8万亿MoE架构、百万上下文、分层计费与API实操指南
随着知识分析、大型代码工程、多模态复杂推理类业务快速增长,普通大模型受限于上下文窗口、长序列推理能力,很难处理上百万字卷宗、完整代码仓库、图文混合的复杂研判任务。Kimi‑K3作为月之暗面推出的开源旗舰MoE混合专家大模型,总参数达到2.8万亿,依托自研KDA混合线性注意力与注意力残差技术,拥有100万Token超大上下文,原生支持图文多模态输入,现已正式上架百炼平台对外提供托管推理服务。
346 1
|
1月前
|
人工智能 运维 数据可视化
【新版】阿里云百炼大模型服务平台解读:核心产品功能介绍、配置价格表、模型矩阵、计费体系、API实操与选型配置完整指南
随着大模型技术落地走向规模化,开发者与企业对模型调用、模型微调、智能体构建、知识库问答的需求持续上涨,多模型管理、接口适配、成本管控成为开发过程中亟待解决的痛点。阿里云百炼作为一站式大模型开发与应用平台,整合自研千问全系模型以及多款第三方主流大模型,将模型推理、模型微调、应用编排、知识库、智能体编排、API网关、权限管控全部集成在同一平台内部,既可以满足普通开发者快速调用模型的需求,也能够支撑企业完成私有化微调、业务化智能应用开发,实现从模型能力到业务落地的全链路闭环。
439 1
|
1月前
|
人工智能 自然语言处理 安全
阿里云AI数智鉴密:AI 生成内容如何拿到一张"防篡改的身份证"
隐形水印 + C2PA签名:让AI生成内容“持证上岗”。
1280 0
|
1月前
|
人工智能 自然语言处理 小程序
阿里云秒悟 Meoo是什么?能力与适用场景、体验步骤及最新活动参考
本文介绍阿里云秒悟Meoo这款零门槛云端极速AI应用创作平台,用户仅用自然语言描述需求,即可分钟级生成含前端、后端、数据库的完整全栈应用,自动完成云资源配置与一键部署,支持网页、小程序、安卓APP三类应用形态。平台聚合四大主流大模型,提供多档限时优惠套餐,新用户注册即送万级积分,叠加夜间22点至次日8点指定模型低至2折福利,大幅降低非技术人员的应用开发门槛。
|
1月前
|
人工智能 自然语言处理 运维
阿里云万小智AI建站平台深度解析:零代码快速搭建企业站点全功能详解
传统网站搭建长期存在技术门槛高、开发周期漫长、整体成本居高不下的痛点。想要完成一套企业官网,通常需要产品梳理需求、UI输出设计稿、前端开发页面、后端编写业务逻辑、数据库设计、服务器部署、域名备案、证书配置等一系列环节,整套流程走完往往需要数周甚至数月时间,对于初创团队、中小微企业以及个人创业者而言,无论是人力投入还是资金成本都存在不小压力。很多业务想法仅仅卡在网站搭建环节就无法落地,大量商业构想难以转化为对外可访问的线上门户。阿里云万小智AI建站平台的出现,就是为了解决这一系列行业痛点,依托大模型能力重构建站全流程,实现从自然语言需求输入,到生成完整前后端站点,再到域名绑定、备案、发布上线的一
220 2