当前位置:网站首页>根据指定区域内容生成图片并进行分享总结
根据指定区域内容生成图片并进行分享总结
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;
}
边栏推荐
- 安装SQL Server详细教程
- MVVM project development (commodity management system 1)
- Explosive 30,000 words, the hardest core丨Mysql knowledge system, complete collection of commands [recommended collection]
- I have three degrees, and I have five faces. I was "confessed" by the interviewer, and I got an offer of 33*15.
- Leetcode第 304 场周赛
- R语言使用tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图可视化股票月收益率数据、使用百分比显示Y轴坐标数据、使用不同的色彩表征正负收益率
- uva12326
- 小白的0基础教程SQL: 什么是SQL 01
- 滚动条样式修改
- Induction jian hai JustFE 2022/07/29 team, I learned the efficient development summary (years)
猜你喜欢
随机推荐
数据湖:数据同步工具NiFi
LeetCode Question of the Day (309. Best Time to Buy and Sell Stock with Cooldown)
matplotlib pyplot
戴尔PowerEdge服务器R450 RAID配置步骤
Compare two objects are the same depth
声音信号处理基频检测和时频分析
Explosive 30,000 words, the hardest core丨Mysql knowledge system, complete collection of commands [recommended collection]
仿牛客网讨论社区项目—项目总结及项目常见面试题
Offer刷题——1
Json对象和Json字符串的区别
牛客刷SQL---2
Xiaobai's 0 Basic Tutorial SQL: An Overview of Relational Databases 02
weight distribution
NUMPY
Does flinkcdc have any solution for mysql's date field type conversion?
More than 2022 cattle guest school game 4 yue
仿牛客网项目总结
对于升级go1.18的goland问题
torch
matlab simulink 粒子群优化模糊pid控制的电机泵