当前位置: 首页 > 科技观察

使用React-Cropper-Pro实现图片裁剪、压缩和上传

时间:2023-03-20 22:07:37 科技观察

在前端开发的过程中,我们经常会遇到文件上传或者图片上传的需求。在某些场景下,可能需要在上传图片后进行裁剪。压缩。对于不想加班的程序员来说,首先要做的就是使用第三方库。虽然我们熟悉的antd、element等库提供上传组件:image.png,但是这些第三方UI库体积比较大,不够轻量,另一方面不支持裁剪、压缩等功能,所以还是需要自己实现或者集成第三方库。当然,antd提供了图片裁剪库antd-img-crop,但是极其“用”的不舒服(restricted),无法自由裁剪图片,也无法提供压缩能力:所以这个方案也是直接pass。最后,为了达到想要的效果,我决定牺牲自己,手动实现一个支持上传、裁剪、压缩的Component,并命名为react-cropper-pro。react-cropper-pro使用介绍react-cropper-pro是一个简单轻量级的图片上传+crop+压缩组件,不依赖antd/element等第三方UI,快速实现图片处理相关操作,底层依赖于react-cropper。使用importCropperProfrom'react-cropper-pro'安装yarnaddreact-cropper-pro;exportdefault()=>console.log(file)}onDel={(image)=>console.log('remove',image)}/>;image.pngAPI介绍技术技术实现主要有以下几个核心点:实现文件上传组件样式(主要覆盖原生input[file]“PureUI”)。实现图像突然裁剪。实现图像压缩。打包成react组件发布到npm。下面简单介绍一下实现细节。1.实现文件上传组件的样式我们都知道元素的输入文件上传组件默认的样式很简单,所以我们需要通过某种方式替换掉原来的样式,这里分享一下实现方式.其实很简单。就是通过定位在input上覆盖一个同样大小的div,然后让div事件穿透响应input事件。核心代码如下:/>

二是用户上传图片后,可以在上传区展示图片,如下:完整代码这块内容如下:>{裁剪数据?:'+'}{!!cropData&&?}
2.实现突发图片裁剪Imagecropping这里我使用的是react-cropper这个库。虽然不能直接上传图片,但是裁剪图片的能力还是很强大的。我们需要实现的效果是图片上传后会出现上传弹窗,显示裁剪后的区域。如下:我这里使用了React-Dom的createPortalAPI来实现弹窗,可以实现弹出dom挂载到指定容器上。许多组件库组件,如抽屉、Modal、DropDown,都采用了类似的实现原理。之前也写过一篇文章介绍createPortal的使用方法。有兴趣的朋友可以学习参考:《精通react/vue组件设计》配合ReactPortals实现强大的抽屉(Drawer)组件这块核心源码可以参考github仓库对应的134行。文件路径如下:https://github.com/MrXujiang/react-cropper-pro/tree/main/src/crop。3、实现图像压缩图像压缩主要是根据产品业务场景设计的。这里我分为无压缩、高、中、低4个文件如下:这部分主要用到了canvas和cropper的能力。我们控制canvas对象的长宽比,通过canvas提供的toBlob实现图片压缩,核心代码如下:if(typeofcropper!=="undefined"){setCropData(cropper.getCroppedCanvas().toDataURL());constrate=1/(4-imgLevel);const{宽度,高度}=cropper.getCropBoxData();cropper.getCroppedCanvas({width:width*rate,height:height*rate,imageSmoothingQuality:imgLevelValueMap[imgLevel],fillColor:'transparent',}).toBlob((blob:Blob)=>{if(blob){consttime=Date.now();让croppedFile:any=newFile([blob],fileRef.current.name,{type:fileRef.current.type,lastModified:Date.now(),});croppedFile.uid=time;onChange&&onChange(croppedFile)}else{newError('Imagecroppingfailed');}},fileRef.current.type,rate)}当然canvas的toBlobAPI不熟悉熟悉的朋友可以移步MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toBlob4,打包成react组件发布到npm,最后看看在应用场景。目前react-cropper-pro已经应用于H5-Dooring视觉构建平台,实现对图片更精准的控制:有兴趣的朋友可以体验一下,当然内容平台也有很多,因为小编的写作能力比较强,比如richtext或者md,所以也会涉及到图片的控制,所以这些就是react-cropper-pro的应用领域。