antd-mobile-v2图片选择器ImagePicker压缩图片处理方案

antd-mobile v2版本 在图片选择器后,没有压缩图片选项。自己写一下

官方文档:https://antd-mobile-v2.surge.sh/components/image-picker-cn/

canvas压缩图片常用的是:压缩图片宽高、透明度 这两个。如果要高级压缩,可查看: 我的另一个博客

直接看代码,这只是压缩案例。若项目需要前端上传腾讯云桶,可查看我的其他博客

import React, { useState } from 'react';
import { ImagePicker, Toast } from 'antd-mobile';

const ImagePickerExample = () => {
    const [imgList, setImgList] = useState([]);

    function convertImgToBase64(imgInfo, outputFormat) {
        //小于500kb(500,000) 不压缩 - 不需要可关闭
        if (imgInfo.file.size <= 5e5) return { ...imgInfo, convertImg: imgInfo.url };
        return new Promise((resolve, reject) => {
            let canvas = document.createElement('canvas');
            let ctx = canvas.getContext('2d');
            let img = new Image;
            img.crossOrigin = 'Anonymous';
            img.onload = function () {
                let width = img.width;
                let height = img.height;
                // 比例可根据项目需要自行修改
                let rate = 1 / (Math.round(width / 750) || 1);
                canvas.width = width * rate;
                canvas.height = height * rate;
                ctx.drawImage(img, 0, 0, width, height, 0, 0, width * rate, height * rate);
                let dataURL = canvas.toDataURL(outputFormat || 'image/jpeg', 0.9); // 0.9 可改成0-1,清晰度
                resolve({ ...imgInfo, convertImg: dataURL });
            }
            img.src = imgInfo.url;
        })
    }

    // 新增-删除 图片事件
    function onChange(files, type) {
        if (type === 'add') {
            Toast.loading('上传中...', 1000, '', false);
            let taskAll = files.map(item => {
                if (item.convertImg) {
                    return item;
                } else {
                    return convertImgToBase64(item);
                }
            });
            Promise.all(taskAll).then(arr => {
                Toast.hide();
                setImgList(arr);
            }).catch(() => {
                Toast.hide();
                Toast.info(`上传失败,请稍后重试~`, 2, '', false);
            })
        } else {
            setImgList(files);
        }
    }

    return (
        <ImagePicker
            multiple
            length={3}
            files={imgList}
            onChange={onChange}
        />
    )
}

export default ImagePickerExample

用imgList控制已选图片。onChange触发事件处理。上传到后端亦可在onChange里,分段上传。不要一股脑上传图片,有些图片太大,多张就很费时间。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值