PosterRender 实现微信下步伐 分享商品天生海报

打印 上一主题 下一主题

主题 993|帖子 993|积分 2979

PosterRender 是什么

PosterRender 是一种专注于天生高质量海报图像的技能或工具,常用于天生静态图片,特殊是适合用于营销、宣传和展示的图形设计。它通常用于在服务端或客户端渲染复杂的图像,包罗文字、图形、图标、背景等,天生可供下载或直接使用的终极图片格式(如 PNG 或 JPEG)。
PosterRender 用来做什么



  • 营销海报天生:
    用于快速天生电商平台的商品促销海报、活动宣传海报等。
  • 用户内容分享:
    在社交媒体上分享的内容卡片、个人成绩海报(如活动记录、学习记录等)。
  • 模版化设计:
    通过可设置的模板,快速天生批量的海报,适合规模化需求。
  • 动态内容渲染:
    根据用户数据动态天生个性化的海报,如公众号文章分享页、个人二维码推广图等。
PosterRender 的长处



  • 高效性:
    能快速天生高质量的图像,特殊适合批量任务。
  • 灵活性:
    支持高度定制化设计,可以通过模板调解文字、颜色、结构等细节。
  • 跨平台支持:
    可以在服务端或客户端完成渲染,适合多种技能栈(如 Node.js、Python、前端欣赏器)。
  • 自动化:
    可结合动态数据天生个性化内容,减少人工设计本钱。
  • 高质量输出:
    支持高清图片输出,满意打印与表现需求。
PosterRender 的缺点



  • 复杂性:
    对于初学者来说,模板设置与设计可能存在一定学习本钱。
  • 性能依靠:
    如果在服务端渲染,天生大量高分辨率图片可能斲丧较多的盘算资源;如果在客户端渲染,可能受限于设备性能。
  • 开辟本钱:
    自定义模板和动态渲染的实现需要一定的开辟工作量。
  • 及时性限定:
    对于需要及时天生大量图片的场景(如高并发访问),可能需要额外优化或使用缓存机制。
PosterRender实例



  • 实例是结合taro+react 实现微信小步伐分享商品
  • 通过样式增加遮照,设置z-index 浮在页面上
  • PosterRender list举行x,y轴坐标结构
  1.   // 父组件代码
  2.   import type { QrcodeRenderRef } from '@/components/Qrcode/QrcodeRender';
  3.   import QrcodeRender from '@/components/Qrcode/QrcodeRender';
  4.   const ref = useRef<QrcodeRenderRef>(null);
  5.   <QrcodeRender ref={ref} />
  6. // 子组件代码
  7. import type { ForwardRefRenderFunction } from 'react';
  8. import { forwardRef, useCallback, useImperativeHandle, useRef, useState } from 'react';
  9. import type { PosterRenderRef } from '@poster-render/taro-react';
  10. import { PosterRender } from '@poster-render/taro-react';
  11. import { View } from '@tarojs/components';
  12. import Taro, { pxTransform } from '@tarojs/taro';
  13. import classNames from 'classnames';
  14. import { getRoutineCode } from '@/services/promotion';
  15. import styles from './styles.modules.less';
  16. //设置海报的宽度和高度
  17. const SIZE = {
  18.   width: 315,
  19.   height: 365
  20. };
  21. export interface QrcodeRenderRef {
  22.   // 子组件暴露给父组件的方法
  23.   open: () => Promise<void>;
  24. }
  25. const QrcodeRender: ForwardRefRenderFunction<QrcodeRenderRef> = (_, ref) => {
  26.   const posterRender = useRef<PosterRenderRef>(null);
  27.   // const [qrcode, setQrcode] = useState('');
  28.   const [rendered, setRendered] = useState(false);
  29.   const [visible, setVisible] = useState(false);
  30.   const [data, setData] = useState<Promotion.CodeInfo>();
  31.   // 请求接口 获取要渲染的数据
  32.   const handleShow = useCallback(async () => {
  33.     Taro.showToast({
  34.       title: '正在生成',
  35.       icon: 'loading',
  36.       mask: true
  37.     });
  38.     const res = await getRoutineCode();
  39.     if (res?.status !== 200) {
  40.       Taro.showToast({
  41.         title: '生成失败,请重试',
  42.         icon: 'none'
  43.       });
  44.       return;
  45.     }
  46.     setData(res?.data);
  47.     setVisible(true);
  48.   }, []);
  49.   useImperativeHandle(
  50.     ref,
  51.     () => ({
  52.       open: async () => {
  53.         handleShow().then().catch();
  54.       }
  55.     }),
  56.     [handleShow]
  57.   );
  58.   const onRender = useCallback(async () => {
  59.     Taro.hideLoading();
  60.     setRendered(true);
  61.   }, []);
  62.   const handleHide = useCallback(async () => {
  63.     setVisible(false);
  64.     setRendered(false);
  65.   }, []);
  66.   const handleSave = useCallback(() => {
  67.     posterRender.current?.savePosterToPhoto();
  68.   }, []);
  69.   return (
  70.     <>
  71.       <View
  72.         catchMove
  73.         className={classNames({
  74.           [styles.qrcodeWrap]: true,
  75.           [styles.qrcodeWrapShow]: rendered
  76.         })}
  77.       >
  78.         <View className={styles.masker} onClick={handleHide} />
  79.         <View className={styles.container}>
  80.           <View className={styles.containerBox}>
  81.             {visible && (
  82.               <PosterRender
  83.                 disableRerender
  84.                 ref={posterRender}
  85.                 canvasId="taro-poster-render"
  86.                 renderType="image"
  87.                 canvasWidth={SIZE.width}
  88.                 canvasHeight={SIZE.height}
  89.                 debug={false}
  90.                 style={{
  91.                   width: pxTransform(SIZE.width),
  92.                   height: pxTransform(SIZE.height)
  93.                 }}
  94.                 showMenuByLongpress
  95.                 onRender={onRender}
  96.                 onLongTap={handleSave}
  97.                 onRenderFail={(err) => console.error('onRenderFail', err?.message)}
  98.                 onSave={(url) => {
  99.                   console.warn('onSave', url);
  100.                   Taro.showToast({
  101.                     title: '保存成功',
  102.                     icon: 'none',
  103.                     duration: 2000
  104.                   });
  105.                 }}
  106.                 onSaveFail={(err) => console.error('onSaveFail', err?.message)}
  107.                 list={[
  108.                   {
  109.                     type: 'rect',
  110.                     x: 0,
  111.                     y: 0,
  112.                     width: SIZE.width,
  113.                     height: SIZE.height,
  114.                     backgroundColor: '#fff',
  115.                     borderWidth: 7,
  116.                     radius: 16,
  117.                     borderColor: '#00C8C8'
  118.                   },
  119.                   {
  120.                     type: 'image',
  121.                     width: 240,
  122.                     height: 240,
  123.                     backgroundColor: '#333333',
  124.                     src: `${data?.url}`,
  125.                     x: 37,
  126.                     y: 47,
  127.                     radius: 120,
  128.                     mode: 'cover'
  129.                   },
  130.                   {
  131.                     type: 'text',
  132.                     x: (tw) => (SIZE.width - tw) * 0.5,
  133.                     y: 310,
  134.                     text: '长按识别或扫描二维码识别',
  135.                     fontSize: 14,
  136.                     color: '#999999',
  137.                     width: (tw) => tw,
  138.                     height: 19,
  139.                     lineHeight: 19
  140.                   }
  141.                 ]}
  142.               />
  143.             )}
  144.             <View className={styles.desc}>扫描该二维码与您绑定推广关系</View>
  145.             <View onClick={handleSave} className={styles.close}>
  146.               保存图片
  147.             </View>
  148.           </View>
  149.         </View>
  150.       </View>
  151.     </>
  152.   );
  153. };
  154. export default forwardRef(QrcodeRender);
  155. // styles.modules.css 代码
  156. }
  157. .qrcodeWrap {
  158.   position: fixed;
  159.   top: -100%;
  160.   left: -200%;
  161.   z-index: -1;
  162.   align-items: center;
  163.   justify-content: center;
  164.   width: 100%;
  165.   height: 100%;
  166. }
  167. .qrcodeWrapShow {
  168.   top: 0;
  169.   left: 0;
  170.   z-index: 9999999999;
  171. }
  172. .masker {
  173.   position: absolute;
  174.   top: 0;
  175.   left: 0;
  176.   width: 100%;
  177.   height: 100%;
  178.   background-color: rgba(0, 0, 0, 0.6);
  179. }
  180. .container {
  181.   width: 100vw;
  182.   height: 100vh;
  183. }
  184. .containerBox {
  185.   position: relative;
  186.   top: 50%;
  187.   width: 315px;
  188.   //height: 503px;
  189.   margin: 0 auto;
  190.   transform: translateY(-50%);
  191. }
  192. .desc {
  193.   margin-top: 35px;
  194.   color: #fff;
  195.   font-weight: 400;
  196.   font-size: 14px;
  197.   font-style: normal;
  198.   line-height: normal;
  199.   text-align: center;
  200. }
  201. .close {
  202.   position: absolute;
  203.   left: 50%;
  204.   display: flex;
  205.   align-items: center;
  206.   justify-content: center;
  207.   width: 249px;
  208.   height: 40px;
  209.   margin-top: 30px;
  210.   color: #fff;
  211.   font-weight: 500;
  212.   font-size: 18px;
  213.   background-color: @primary-color;
  214.   border-radius: 249px * 0.5;
  215.   transform: translateX(-50%);
  216. }
复制代码
实例图片



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表