react图片裁剪工具 - react-image-crop
react-image-crop
react-image-crop 是react响应式图片裁剪的一个工具包,能做到裁剪区域,裁剪宽高比限制等等。
npm地址:https://www.npmjs.com/package/react-image-crop
阅读前须知
版本的不同,在使用时有不同的表现,也可能造成使用失败。
本文中基于版本:8.6.2
安装
npm
npm install react-image-crop --save
CDN
<script src="https://unpkg.com/react-image-crop/dist/ReactCrop.min.js"></script>
注意,当使用<script>标签全局导入脚本时,请使用ReactCrop.Component访问组件。
使用
在使用得地方导入组件和样式模块
import ReactCrop from 'react-image-crop';
import 'react-image-crop/dist/ReactCrop.css';
// or scss;
import 'react-image-crop/lib/ReactCrop.scss'
组件使用
<ReactCropsrc={imageurl} crop={crop}ruleOfThirdsonImageLoaded={this.onImageLoaded}onComplete={this.onCropComplete}onChange={this.onCropChange}/>
属性解释:
src:图片路径
crop:裁剪相关配置 参考地址:https://www.npmjs.com/package/react-image-crop#crop-required
ruleOfThirds:裁剪区域三分规则默认false;
ruleOfThirds为false时:
ruleOfThirds为true时(注意图中裁剪区域的九宫格):
onImageLoaded: 图片加载时的回调函数,返回image对象;
onComplete:裁剪区域调整大小、拖动、微调之后的回调,返回当前裁剪对象;
onChange:裁剪区域调整大小、拖动、微调时的回调,返回当前裁剪对象;官网中的提示:请注意,您必须实现此回调并更新您的裁剪状态,否则什么都不会改变!
更多属性参考
获取到的裁剪区域保存为图片
// 组件的onComplete事件onCropComplete = crop => {this.makeClientCrop(crop);};// 调用getCroppedImg函数获取裁剪图片信息async makeClientCrop(crop) {if (this.imageRef && crop.width && crop.height) {const croppedImageUrl = await this.getCroppedImg(this.imageRef,crop,'newFile.jpeg');/** croppedImageUrl: {url,blob,crop}* @url:图片文件对象的DOMString url * @blob: 图片文件的类文件对象* @crop: 裁剪参数*/}
// 裁剪区域转图片的处理 getCroppedImg(image, crop, fileName) {const canvas = document.createElement('canvas');const scaleX = image.naturalWidth / image.width;const scaleY = image.naturalHeight / image.height;canvas.width = crop.width;canvas.height = crop.height;const ctx = canvas.getContext('2d');ctx.drawImage(image,crop.x * scaleX,crop.y * scaleY,crop.width * scaleX,crop.height * scaleY,0,0,crop.width,crop.height);return new Promise((resolve, reject) => {canvas.toBlob(blob => {if (!blob) {//reject(new Error('Canvas is empty'));console.error('Canvas is empty');return;}blob.name = fileName;window.URL.revokeObjectURL(this.fileUrl);this.fileUrl = window.URL.createObjectURL(blob);resolve({url:this.fileUrl,blob,crop});}, 'image/jpeg');});}
官方完整示例代码
import ReactDOM from "react-dom";
import React, { PureComponent } from "react";
import ReactCrop from "react-image-crop";
import "react-image-crop/dist/ReactCrop.css";import "./App.css";class App extends PureComponent {state = {src: null,crop: {unit: "%",width: 30,aspect: 16 / 9}};onSelectFile = e => {if (e.target.files && e.target.files.length > 0) {const reader = new FileReader();reader.addEventListener("load", () =>this.setState({ src: reader.result }));reader.readAsDataURL(e.target.files[0]);}};// If you setState the crop in here you should return false.onImageLoaded = image => {this.imageRef = image;};onCropComplete = crop => {this.makeClientCrop(crop);};onCropChange = (crop, percentCrop) => {// You could also use percentCrop:// this.setState({ crop: percentCrop });this.setState({ crop });};async makeClientCrop(crop) {if (this.imageRef && crop.width && crop.height) {const croppedImageUrl = await this.getCroppedImg(this.imageRef,crop,"newFile.jpeg");this.setState({ croppedImageUrl });}}getCroppedImg(image, crop, fileName) {const canvas = document.createElement("canvas");const scaleX = image.naturalWidth / image.width;const scaleY = image.naturalHeight / image.height;canvas.width = crop.width;canvas.height = crop.height;const ctx = canvas.getContext("2d");ctx.drawImage(image,crop.x * scaleX,crop.y * scaleY,crop.width * scaleX,crop.height * scaleY,0,0,crop.width,crop.height);return new Promise((resolve, reject) => {canvas.toBlob(blob => {if (!blob) {//reject(new Error('Canvas is empty'));console.error("Canvas is empty");return;}blob.name = fileName;window.URL.revokeObjectURL(this.fileUrl);this.fileUrl = window.URL.createObjectURL(blob);resolve(this.fileUrl);}, "image/jpeg");});}render() {const { crop, croppedImageUrl, src } = this.state;return (<div className="App"><div><input type="file" accept="image/*" onChange={this.onSelectFile} /></div>{src && (<ReactCropsrc={src}crop={crop}ruleOfThirdsonImageLoaded={this.onImageLoaded}onComplete={this.onCropComplete}onChange={this.onCropChange}/>)}{croppedImageUrl && (<img alt="Crop" style={{ maxWidth: "100%" }} src={croppedImageUrl} />)}</div>);}
}ReactDOM.render(<App />, document.getElementById("root"));
在线编辑地址:https://codesandbox.io/s/react-image-crop-demo-with-classes-7jxc0?file=/src/index.js:0-2838
react图片裁剪工具 - react-image-crop相关推荐
- HTML5图片裁剪工具 HTML5 image crop tool
这是一篇介绍如何利用HTML5的canvas标签来裁剪图片的教程.图片裁剪的典型应用就是网站的头像裁剪.利用HTML5来裁剪图片,只需要在客户端实现,不需要将坐标数据发送至服务器端. 第1步. HTM ...
- react 图片剪切(react-easy-crop)
antd 官方提供的剪切组件 仅支持本地图片的剪切和上传 import { Upload } from 'antd'; import ImgCrop from 'antd-img-crop'; imp ...
- react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目
当前前端开发,90%的项目都是Vue和React,然而70%的同学都基于脚手架创建项目,因为脚手架会包含项目基本框架.webpack配置.scss/sass/less解析.babel配置.DevSer ...
- native react 图片多选_react-native实现的多图片选择器
react-native-syan-image-picker 功能介绍 基于已有原生第三方框架封装的多图片选择组件,适用于 React Native App. 原生框架依赖 功能特点 支持 iOS.A ...
- React图片懒加载
React图片懒加载 话不多说了,创建一个LazyLoad.js的React组件,然后将下面的代码复制过去: import React from 'react' // import './lazylo ...
- [译] React 路由和 React 组件的爱恨情仇
原文地址:The Love-Hate Relationship between React Router and React Components 原文作者:Kasra 译文出自:掘金翻译计划 本文永 ...
- (React 框架)React技术
1.简介 React 是Facebook 开发并开源的前端框架 当时他们的团队在市面上没找到合适的MVC 框架,就自己写一个 JS 框架,用来架设 instagram(图片分享社交网路),2013年开 ...
- react html编辑器,react项目中使用富文本编辑器
安装: cnpm install -D draft-js draftjs-to-html react-draft-wysiwyg // 用来指定商品详情的富文本编辑库 import React, { ...
- 16、React系列之 React 路由
版权声明:本文为博主原创文章,未经博主允许不得转载. PS:转载请注明出处 作者:TigerChain 地址:http://www.jianshu.com/p/b55cf53e633a 本文出自 Ti ...
最新文章
- Linux编程下open()函数的用法
- Maven项目中获取classpath和资源文件的路径
- 详细解释到底啥是共轭先验(用本科知识来解释)
- python核心编程——python对象
- Objective-C 中自动生成 setter getter 方法
- java如何检测redis是否可用
- word里画的流程图怎么全选_怎么用word画流程图
- yum 与pip区别
- google广告推广提示有恶意软件链接的处理方案
- win10笔记本网络重置后没有网络连接了
- IM即时通讯需要解决的问题
- Linux环境部署:开启电脑虚拟化
- 花菁染料(cas773041-79-5|cas427882-78-8|cas14134-81-7)结构图及合成路线图
- JS 动画基础: 细说 requestAnimationFrame
- 清华大学、北京大学毕业生的去向
- 基于matlab的陷波滤波器设计
- 解决webpack打包样式url()背景图片问题
- 一文让你彻底了解EMC防护器件之TVS
- 解决.Net 4.0 A potentially dangerous Request.Form value was detected from the client 异常
- 一个公开了源码的Android UI 设计器,很好很强大,不知道的可以看看
热门文章
- oracle数据库系统登陆,系统验证登陆Oracle数据库
- php 请求是什么请求,PHP判断一个请求是Ajax请求还是普通请求
- windows操作系统的安装
- java 记录微信app支付接口实现
- windows的图片浏览器
- php nsapi,PHP 配置参数
- qt中drawline函数的参数_在Qt GraphicsView中创建长线(或十字线)光标的最佳方法...
- Linux多线程网络编程要义丨epoll与reactor原理
- 用cocos2dx做一个简单的单机捕鱼达人游戏(1)
- linux远程窗口无法当机,linux – 当我已经进入远程机器时,如何回到本地?