当前位置:网站首页>根据指定区域内容生成图片并进行分享总结
根据指定区域内容生成图片并进行分享总结
2022-08-01 06:52:00 【桐溪漂流】
需求及思路
- 需要把特定的页面区域生成图片
- 分享生成的图片
最终结论
- 可以根据
html2canvas
来生成特定的图片 - 普通浏览器中可以把生成的图片直接下载下来,最简单的就是通过
a
标签下载 - 微信中不允许直接下载,只能进行长按进行保存的操作
- 对保存的图片再进行转发分享
效果
这里只展示如何生成图片的,下载的就不做展示了
具体实现
本次尝试是在react项目中进行的,所以下面展示的代码直接是JSX的语法了
- 安装
html2canvas
依赖
// yarn add html2canvas
- 页面使用代码
import { Button, Image } from 'antd-mobile';
import styles from './index.less';
import { useCallback, useState } from 'react';
import ShareContainer from '@/components/ShareContainer';
// ShareContainer 是为了方便使用,创建的一个组件,大小依据外层容器的大小
// 生成的图片范围也为它的直接父级所覆盖的区域-本例中为蓝色线框的区域
export default function IndexPage() {
const [create, setCreate] = useState<any>();
const onClick = useCallback(() => {
create();
}, [create]);
return (
<div className={styles.layout}>
<ShareContainer setCreate={(create) => setCreate(create)}>
<div className={styles.content}>
<div className={styles.top}></div>
<div className={styles.btn}>
<Button color="primary" block onClick={onClick}>
click
</Button>
</div>
<div className={styles.bottom}>
<Image src='/123.png' />
</div>
</div>
</ShareContainer>
</div>
);
}
样式文件
.layout {
width: 90%;
height: 90%;
border: 1px solid blue;
}
.content {
width: 100%;
height: 100%;
.top {
width: 100%;
height: 128px;
background: url(/avatar.png);
background-size: 64px 64px;
}
.btn {
width: 100%;
margin: 8px 0;
}
.bottom {
width: 100%;
}
}
ShareContainer
组件代码
import { ImageViewer } from 'antd-mobile';
import styles from './index.less';
import html2canvas from 'html2canvas';
import { useCallback, useEffect, useRef, useState } from 'react';
interface Props {
children: any;
setCreate?: (create: any) => void;
}
export default function IndexPage({ children, setCreate }: Props) {
const [url, setUrl] = useState('');
const [visible, setVisible] = useState(false);
const boxRef = useRef<any>();
const onCreate = useCallback(() => {
if (boxRef.current) {
html2canvas(boxRef?.current, { scale: 1 }).then(function (canvas) {
const aurl = canvas.toDataURL('image/png');
canvas.getContext('2d')?.save();
setUrl(aurl);
setVisible(true);
});
}
}, [url]);
useEffect(() => {
if (setCreate) {
setCreate(() => onCreate);
}
}, [setCreate]);
return (
<div className={styles.box + ' share-container'} ref={boxRef}>
<ImageViewer
image={url}
visible={visible}
onClose={() => {
setVisible(false);
}}
renderFooter={() => <div className={styles.tip}>长按保存图片</div>}
/>
{children}
</div>
);
}
// 如果需要在普通浏览器中进行下载。这里可以把 长按保存图片 换成<a download href={url}></a>标签
// 这样可以直接利用a标签进行下载生成的图片
样式文件
.box {
width: 100%;
height: 100%;
}
.tip {
width: 100%;
text-align: center;
font-size: 18px;
line-height: 60px;
color: #fff;
}
边栏推荐
- 戴尔PowerEdge服务器R450 RAID配置步骤
- Srping中bean的生命周期
- matlab wind speed model wavelet filtering
- MATLAB program design and application of MATLAB 2.5
- 仿牛客网项目总结
- Does flinkcdc have any solution for mysql's date field type conversion?
- The BP neural network based on MATLAB voice characteristic signal classification
- Vim扩展内容
- 曲柄滑块机构运动分析和参数优化
- Go 支持 OOP: 用 struct 代替 class
猜你喜欢
特别数的和
Json对象和Json字符串的区别
企业员工人事管理系统(数据库课设)
"By sharing" northwestern university life service | | bytes a second interview on three sides by HR
Detailed explanation of the crawler framework Scrapy
仿牛客网讨论社区项目—项目总结及项目常见面试题
仿牛客网项目总结
戴尔PowerEdge服务器R450 RAID配置步骤
奇葩问题 npm install 报错 gyp ERR
Zero-code website development tool: WordPress
随机推荐
【一句话攻略】彻底理解JS中的回调(Callback)函数
深度比较两个对象是否相同
金山打字通 官网 下载
Qt Widget project loading example of qml
支付宝如何生成及配置公钥证书
After the image is updated, Glide loading is still the original image problem
戴尔PowerEdge服务器R450 RAID配置步骤
return;代表含义
太厉害了,终于有人能把文件上传漏洞讲的明明白白了
实战演练 Navicat 中英文模式切换
小程序通过云函数操作数据库【使用get取数据库】
LeetCode 0149. Maximum number of points on a line
特别数的和
Create, modify and delete tables
Bean的生命周期
05-SDRAM: Arbitration
Matlab simulink particle swarm optimization fuzzy pid control motor pump
MATLAB program design and application of MATLAB 2.5
Windows taskbar icon abnormal solution
crypto-js uses