封装了一个Modal弹框作为组件使用,需要传递进来代码中标注的一些参数

项目中使用了react  antd  以及  react-image-crop

需要安装8.6.4版本的 react-image-crop(截取图片插件),例如:yarn add react-image-crop@8.6.4

import React, { useEffect, useState } from 'react';
import { Modal, Button } from 'antd';
import ReactCrop from 'react-image-crop';
import 'react-image-crop/dist/ReactCrop.css';let imageRef = null;
let videoWidth = 0;
let videoHeight = 0;const Index = props => {// visible 控制弹框开关 handleCancel 弹框关闭事件 handleOk 弹框点击确定 inputVideoUrl 视频的url  aspect 需要截取图片的比例 例如 1 / 1const { visible, handleCancel, handleOk, inputVideoUrl, aspect } = props;const [src, setSrc] = useState(''); // 当前视频的图片urlconst [croppedImageUrl, setCroppedImageUrl] = useState(''); // 截取之后的视频的urlconst [crop, setCrop] = useState({unit: '%',width: 30,aspect,}); // 裁剪组件的基本参数// 初始化数据useEffect(() => {imageRef = null;videoWidth = 0;videoHeight = 0;const video = document.createElement('video');video.setAttribute('width', '300');video.setAttribute('height', '300');video.setAttribute('src', inputVideoUrl);video.setAttribute('crossOrigin', 'anonymous');video.addEventListener('loadeddata', () => {const { videoWidth: w, videoHeight: h } = video;videoWidth = w;videoHeight = h;});}, []);// 手动截取视频画面作为封面const buttonFun = () => {const canvas = document.createElement('canvas');const video = document.getElementById('video');canvas.width = videoWidth;canvas.height = videoHeight;const context = canvas.getContext('2d');context.clearRect(0, 0, videoWidth, videoHeight); // 清除画布内容context.drawImage(video, 0, 0, videoWidth, videoHeight); // 将绘制的图像用img显示setSrc(canvas.toDataURL('image/png'));};// 图片加载完之后的信息const onImageLoaded = image => {imageRef = image;};// 裁剪窗口的变化const onCropChange = cropData => {setCrop(cropData);};const getCroppedImg = (image, cropData) => {const canvas = document.createElement('canvas');const scaleX = image.naturalWidth / image.width;const scaleY = image.naturalHeight / image.height;canvas.width = cropData.width;canvas.height = cropData.height;const ctx = canvas.getContext('2d');ctx.drawImage(image,cropData.x * scaleX,cropData.y * scaleY,cropData.width * scaleX,cropData.height * scaleY,0,0,cropData.width,cropData.height);return canvas.toDataURL('image/png');};const makeClientCrop = cropData => {if (imageRef && cropData.width && cropData.height) {const url = getCroppedImg(imageRef, cropData);setCroppedImageUrl(url);}};// 裁剪完成const onCropComplete = cropData => {makeClientCrop(cropData);};return (<Modaltitle="截取封面"width="50%"visible={visible}maskClosable={false}destroyOnCloseonCancel={handleCancel}onOk={() => {handleOk(croppedImageUrl);}}><div className="App"><div>视频</div><div id="video_div"><videoid="video"width="300"height="300"src={inputVideoUrl}crossOrigin="anonymous"controls="controls"className="video_d"><track kind="captions" />您的浏览器不支持 video 标签。</video></div><Button type="primary" onClick={buttonFun} style={{ margin: '20px 0' }}>作为视频封面图</Button><div style={{ padding: '20px 0' }}>截取封面图</div><div style={{ width: 300 }}>{src && (<ReactCropsrc={src}crop={crop}ruleOfThirdsonImageLoaded={onImageLoaded}onComplete={onCropComplete}onChange={onCropChange}/>)}</div><div style={{ padding: '20px 0' }}>封面图预览</div><div>{croppedImageUrl && <img alt="Crop" src={croppedImageUrl} />}</div></div></Modal>);
};export default Index;

react 截取视频随意一帧裁剪图片存为base64格式相关推荐

  1. ffmpeg(ubuntu16.04):视频抽成帧(图片)/图片合成视频

    · 视频抽成帧(图片): cd 到视频所在目录下: 输入: ffmpeg -i output-processed.avi -q:v 2 -f image2 frame_%06d.jpg (注:上述代码 ...

  2. 多线程截取视频为每帧

    1 多线程截取视频为每帧 功能: 将多个视频文件进行抽帧,每个视频开启一个线程 #!/usr/bin/python3.6 # -*- coding: utf-8 -*- # @Time : 2021/ ...

  3. 使用js截取视频指定秒数的图片

    使用js截取视频指定秒数的图片 点击按钮,选择本地视频后,截取指定秒数的图片 运行结果如下图: 直接上代码: 1.html代码 <!DOCTYPE html> <html>&l ...

  4. 视频怎么抽帧变成图片格式

    最近有很多朋友在问,如何剪辑视频,比如对多个视频进行抽帧变成图片呢?今天小编给大家分享一个新的剪辑技巧,下面一起来试试. 所需工具 视频.图片素材若干 操作步骤 首先,要将准备好的所有视频素材都保存在 ...

  5. elementUI压缩图片和将图片转成base64格式

    为了降低资源服务器的消耗.有些时候需要前端压缩图片,转码等一些处理. 一.Base64的优点和缺点 图片转换成base64格式的优缺点 1. 优点 (1)base64格式的图片是文本格式,占用内存小, ...

  6. py读取本地图片并返回图片给前端base64格式

    py读取本地图片并返回图片给前端base64格式 直接贴代码,有用请收藏 from fastapi import FastAPI from get90V import resBody, getRewr ...

  7. python实现截取视频中特定帧进行保存功能

    # -*- encoding: utf-8 -*- # @File : screenshot.py # @Author: Mr. Luo # @Date: 2021/11/3 14:30 ''' 读取 ...

  8. python把视频取帧_Python批量截取视频某一帧

    该文讲了如何调用opencv这个包对一个视频的某段时间进行均匀截多张图图(当然也可以是多个时间,也可以是不均匀时间,也可以是单张图片-都是可以自己定的呀) 大家都是成熟的Python人了,所以很多细节 ...

  9. 【前端图片转化】 base64格式 转为 File文件类型

    下面的函数能将base664格式 用于已知bseae64 转File格式上传 求点赞!! 关注!! 收藏 !! base64格式的图片不能直接上传到oss图片服务器的,需要转换成file文件流的形式上 ...

  10. 将图片转化成base64格式

    // 如果用户选择了图片就将图片转化为base64位的格式进行存储和使用// 第一步:先读取文件const base = new FileReader()// console.dir(base)// ...

最新文章

  1. 腾讯会议又一黑科技,屏蔽超过 200 种会议噪声是如何做到的?
  2. php 如何利用 soap调用.Net的WebService asmx文件
  3. 【转载】OSPF网络类型
  4. matlab 绘图2
  5. WCF+Silverlight部署本机备忘
  6. linux怎么远程windows桌面,Windows系统怎么远程登陆桌面Linux?
  7. ceph linux内核配置,centos 7.4-aarch64如何编译Ceph
  8. 微服务架构师的职责——《微服务设计读书笔记》
  9. 那些被大数据时代抛弃的人
  10. 分号不是个“随便的人”
  11. 蜕变成蝶~Linux设备驱动之字符设备驱动
  12. 使用sublime的SQLTools插件访问MySQL的配置方法
  13. 1.Kubernetes权威指南 --- Kubernetes入门
  14. java 内存屏障_关于Java中的内存屏障
  15. 联想服务器pxe安装系统,使用CloudBoot裸机部署Lenovo ThinkSystem服务器
  16. 量土地用计算机,土地面积换算(土地面积计算器)
  17. 《东周列国志》第十二回 卫宣公筑台纳媳 高渠弥乘间易君
  18. 量化研究 | 策略在指数与主连复权的差异化分析(最终篇)
  19. 手撸架构,Java基础 面试100问
  20. 小程序如何隐藏滚动条

热门文章

  1. java 有哪些框架_Java常用框架有哪些?这些框架有什么用?
  2. STM32CubeMX 安装提示需要java环境(1.8.0_45)
  3. WiFi6技术特点及现状调研
  4. TensorRt - caffe中支持prelu
  5. 这样的科幻不该被埋没,吐血推荐!
  6. Docker 下载安装使用(简单教程)
  7. LeetCode题目分类整理
  8. 深度森林论文阅读笔记
  9. 安装谷歌 axure插件
  10. 基于cmake的交叉编译工具链