react前端显示图片_前端/JS/React/ES6:纯前端实现图片压缩技术

本文介绍了如何在React应用中实现纯前端的图片压缩功能。通过读取文件、转换为图片、调整画布尺寸并导出压缩后的图片,确保图片大小不超过指定限制。主要涉及到的技术包括异步读取图片、Promise、FileReader、canvas等。
摘要由CSDN通过智能技术生成

import React from 'react';//import logo from './logo.svg';

import './App.css';functionApp() {

const handleChange= e =>{

e.persist()//为了看到原生file的内容,不加这句,原生file内容会被react隐藏

let fileObj = e.target.files[0]//console.log(e)

console.log(fileObj)//设定标准上限为1MB,进行压缩处理

compress(fileObj, 1024, (data) =>{

console.log(data)

})

}//异步读取图片的promise

const loadImageAsync = (url) =>{return new Promise(function(resolve, reject) {

const image= newImage()

image.οnlοad= function() {

resolve(image)

};

image.οnerrοr= function() {

reject(new Error('Could not load image at ' +url))

};

image.src=url

})

}//异步转换成base64编码的promise

const fileToImgAsync = (file) =>{return new Promise(function(resolve, reject) {

const reader= newFileReader()

reader.οnlοad= function(e) {

resolve(e.target.result);

};

reader.οnerrοr= function() {

reject(new Error('readAsDataURL:fail'))

};

reader.readAsDataURL(file)

});

}

const downloadFileByBlob= (blobUrl, filename) =>{

const a= document.createElement('a')

a.download=filename

a.style.display= 'none'a.href=blobUrl//触发点击

document.body.appendChild(a)

a.click()//然后移除

document.body.removeChild(a)

}//async 搭配 promise 使用

const compress = async (file, maxSizeKB, succFunc) =>{if (file.size > maxSizeKB * 1024) {

let rate= 0 //压缩率

//文件转图片

const dataUrl =await fileToImgAsync(file)//图片转画布

const image =await loadImageAsync(dataUrl)//console.log(dataUrl, image)

//文件大小KB, file.size给的是字节Byte

const fileSizeKB = file.size / 1024console.log(fileSizeKB)//当图片大小超标,才进行压缩

if (fileSizeKB >maxSizeKB) {//计算压缩率

rate = (fileSizeKB - maxSizeKB) /fileSizeKB

console.log('压缩率:', rate)

console.log('压缩后文件大小:', fileSizeKB * (1 - rate), 'kb')

}//纠正因子,不加会导致压缩出的文件太小

const factor = 0.2

//画布执行压缩

let canvas = document.createElement('canvas')

let context= canvas.getContext('2d')

const cvWidth= image.width * (1 - rate +factor)

const cvHeight= image.height * (1 - rate +factor)

console.log(image.width, image.height, cvWidth, cvHeight)

canvas.height=cvHeight

canvas.width=cvWidth

context.clearRect(0, 0, cvWidth, cvHeight)

context.drawImage(image,0, 0, cvWidth, cvWidth)//导出图片

canvas.toBlob((blob) =>{//方式一:下载到本地

const blobUrl =window.URL.createObjectURL(blob)

downloadFileByBlob(blobUrl, file.name)//方式二:生成网页可读取的对象

//const newImage = new File([blob], file.name, { type: file.type });

//succFunc(newImage)

});

}

}return(

);

}

exportdefault App;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值