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相关推荐

  1. HTML5图片裁剪工具 HTML5 image crop tool

    这是一篇介绍如何利用HTML5的canvas标签来裁剪图片的教程.图片裁剪的典型应用就是网站的头像裁剪.利用HTML5来裁剪图片,只需要在客户端实现,不需要将坐标数据发送至服务器端. 第1步. HTM ...

  2. react 图片剪切(react-easy-crop)

    antd 官方提供的剪切组件 仅支持本地图片的剪切和上传 import { Upload } from 'antd'; import ImgCrop from 'antd-img-crop'; imp ...

  3. react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目

    当前前端开发,90%的项目都是Vue和React,然而70%的同学都基于脚手架创建项目,因为脚手架会包含项目基本框架.webpack配置.scss/sass/less解析.babel配置.DevSer ...

  4. native react 图片多选_react-native实现的多图片选择器

    react-native-syan-image-picker 功能介绍 基于已有原生第三方框架封装的多图片选择组件,适用于 React Native App. 原生框架依赖 功能特点 支持 iOS.A ...

  5. React图片懒加载

    React图片懒加载 话不多说了,创建一个LazyLoad.js的React组件,然后将下面的代码复制过去: import React from 'react' // import './lazylo ...

  6. [译] React 路由和 React 组件的爱恨情仇

    原文地址:The Love-Hate Relationship between React Router and React Components 原文作者:Kasra 译文出自:掘金翻译计划 本文永 ...

  7. (React 框架)React技术

    1.简介 React 是Facebook 开发并开源的前端框架 当时他们的团队在市面上没找到合适的MVC 框架,就自己写一个 JS 框架,用来架设 instagram(图片分享社交网路),2013年开 ...

  8. react html编辑器,react项目中使用富文本编辑器

    安装: cnpm install -D draft-js draftjs-to-html react-draft-wysiwyg // 用来指定商品详情的富文本编辑库 import React, { ...

  9. 16、React系列之 React 路由

    版权声明:本文为博主原创文章,未经博主允许不得转载. PS:转载请注明出处 作者:TigerChain 地址:http://www.jianshu.com/p/b55cf53e633a 本文出自 Ti ...

最新文章

  1. Linux编程下open()函数的用法
  2. Maven项目中获取classpath和资源文件的路径
  3. 详细解释到底啥是共轭先验(用本科知识来解释)
  4. python核心编程——python对象
  5. Objective-C 中自动生成 setter getter 方法
  6. java如何检测redis是否可用
  7. word里画的流程图怎么全选_怎么用word画流程图
  8. yum 与pip区别
  9. google广告推广提示有恶意软件链接的处理方案
  10. win10笔记本网络重置后没有网络连接了
  11. IM即时通讯需要解决的问题
  12. Linux环境部署:开启电脑虚拟化
  13. 花菁染料(cas773041-79-5|cas427882-78-8|cas14134-81-7)结构图及合成路线图
  14. JS 动画基础: 细说 requestAnimationFrame
  15. 清华大学、北京大学毕业生的去向
  16. 基于matlab的陷波滤波器设计
  17. 解决webpack打包样式url()背景图片问题
  18. 一文让你彻底了解EMC防护器件之TVS
  19. 解决.Net 4.0 A potentially dangerous Request.Form value was detected from the client 异常
  20. 一个公开了源码的Android UI 设计器,很好很强大,不知道的可以看看

热门文章

  1. oracle数据库系统登陆,系统验证登陆Oracle数据库
  2. php 请求是什么请求,PHP判断一个请求是Ajax请求还是普通请求
  3. windows操作系统的安装
  4. java 记录微信app支付接口实现
  5. windows的图片浏览器
  6. php nsapi,PHP 配置参数
  7. qt中drawline函数的参数_在Qt GraphicsView中创建长线(或十字线)光标的最佳方法...
  8. Linux多线程网络编程要义丨epoll与reactor原理
  9. 用cocos2dx做一个简单的单机捕鱼达人游戏(1)
  10. linux远程窗口无法当机,linux – 当我已经进入远程机器时,如何回到本地?