当前位置:网站首页>根据指定区域内容生成图片并进行分享总结
根据指定区域内容生成图片并进行分享总结
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;
}
边栏推荐
猜你喜欢
随机推荐
uva12326
LeetCode240+312+394
LeetCode 0149. 直线上最多的点数
测试工具(四)Jenkins环境搭建与使用
Dell PowerEdge Server R450 RAID Configuration Steps
LeetCode每日一题(309. Best Time to Buy and Sell Stock with Cooldown)
Information system project managers must recite the work of the core test site (56) Configuration Control Board (CCB)
阿里三面:MQ 消息丢失、重复、积压问题,该如何解决?
从底层结构开始学习FPGA(6)----分布式RAM(DRAM,Distributed RAM)
flinkcdc对mysql的date字段类型转化有什么解决思路么
【翻译】确保云原生通信的安全:从入口到服务网及更远的地方
matlab wind speed model wavelet filtering
Offer刷题——1
curl (7) Failed connect to localhost8080; Connection refused
first unique character in characters
Using FiddlerScript caught poly FiddlerScript 】 【 download
GO错误处理方式
return; represents meaning
滚动条样式修改
牛客刷SQL---2