美文网首页
前端实现图片裁剪和压缩

前端实现图片裁剪和压缩

作者: 兜兜转转的小菊 | 来源:发表于2022-10-26 08:51 被阅读0次

前端实现图片的裁剪和压缩
1、压缩图片
drawImage,压缩图片长宽或者质量参数来实现压缩

/**
 * 压缩图片
 * @param {*} src 图片的src
 * @param {*} resolve  回调函数,用于处理异步,比如 promise 返回 
 * @param {*} fileName 文件名称
 */
const compressImage = (src, resolve, fileName = "img") => {
    const image = new Image() // 新建一个img标签(还没嵌入DOM节点)
    image.src = src// 将图片的路径设成file路径
    image.onload = () => {
        const canvas = document.createElement('canvas');
        const context = canvas.getContext('2d');

        // 图片原始尺寸
        const originWidth = image.width;
        const originHeight = image.height;

        // 最大尺寸限制
        const maxWidth = Math.min(image.width, 1200);
        const maxHeight = Math.min(image.height, 1200);
        // 目标尺寸
        let targetWidth = originWidth;
        let targetHeight = originHeight;

        let quality = 0.92; // 默认质量
        // 图片尺寸超过 1200 * 1200 的限制
        if (originWidth > maxWidth || originHeight > maxHeight) {
            if (originWidth / originHeight > maxWidth / maxHeight) {
                // 更宽,按照宽度限定尺寸
                targetWidth = maxWidth;
                targetHeight = Math.round(maxWidth * (originHeight / originWidth));
            } else {
               // 更高,按照高度限定尺寸
                targetHeight = maxHeight;
                targetWidth = Math.round(maxHeight * (originWidth / originHeight));
            }
        }

        canvas.width = targetWidth;
        canvas.height = targetHeight;

        // 绘制图片
        context.drawImage(image, 0, 0, targetWidth, targetHeight);
        // 获取图片url, base64格式
        const data = canvas.toDataURL('image/jpeg', quality);
        // base64格式 转为 file 格式,用于上传
        const newfile = dataURLtoFile(data, `${fileName}.jpeg`);
        resolve(newfile, data);
    }
}

2、图片base64转为file,blob格式

/**
 * base64转file对象
 * @param {*} dataurl 图片base64 数据
 * @param {*} filename 文件名称
 * @returns 
 */
const dataURLtoFile = (dataurl, filename) => {
    const arr = dataurl.split(',');
    const mime = arr[0].match(/:(.*?);/)[1];
    const bstr = atob(arr[1]); let n = bstr.length; const u8arr = new Uint8Array(n);
    // eslint-disable-next-line no-plusplus
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, { type: mime });  // 转成了jpeg格式
}

3、用异步的方式用裁剪图片

    // 裁剪图片
    convertImage = (file) => {
        const that = this;
        return new Promise((resolve) => {
            const image = new Image() // 新建一个img标签(还没嵌入DOM节点)
            image.src = file // 将图片的路径设成file路径
            image.onload = () => {
                const canvas = document.createElement('canvas');
                const context = canvas.getContext('2d');

                const targetWidth = 210; // 裁剪目标宽度 210 px
                const targetHeight = image.height; // 裁剪目标高度 image.height 图片本身高度


                canvas.width = targetWidth; // canvas宽度 210 px
                canvas.height = targetHeight; // canvas宽度 targetHeight

                context.drawImage(image, 115, 0, targetWidth, targetHeight, 0, 0, targetWidth, targetHeight); // 裁剪图片
                const data = canvas.toDataURL('image/jpeg', 1);
                resolve(data);
            }
        })
    }

4、FileReader 读取本地上传的图片文件路径

    readImage = (file) => new Promise((resolve) => {
        // 获取文件名
        const fileName = file.name.substring(0, file.name.indexOf('.'));
        const reader = new FileReader(); // 读取file
        reader.readAsDataURL(file);
        reader.onloadend = (e) => {
            const imgSrc = e.target.result; // 获取文件的src
            // ... 执行后续操作
        }
    })

相关文章

  • 前端实现图片裁剪和压缩

    前端实现图片的裁剪和压缩1、压缩图片drawImage,压缩图片长宽或者质量参数来实现压缩 2、图片base64转...

  • 图片处理

    为了适应各种分辨率的显示和速度快,需要将图片进行压缩或者裁剪 前端图片处理 cropperjs可以实现图片的裁剪和...

  • java实现图片压缩

    采用ImageIO实现图片的裁剪与压缩,分为裁剪与压缩两个模块,先裁剪再压缩 效果还不错,11M左右的图片能够在2...

  • gm的使用

    为什么在前后端要对图片进行裁剪压缩?因为图片太大可能会给服务器和传输造成压力 jcrop前端用于对图片压缩的工具(...

  • 移动端添加图片裁剪的坑

    本文关键:阻止冒泡、canvas压缩、canvas裁剪、生成黑色图片。 最近项目需要在添加图片时实现裁剪功能,虽然...

  • 21天习惯养成打卡-day1

    遇到的问题 前端进行图片压缩 bootstrap框架表单的使用 解决方法 张鑫旭博客上的解决方案前端实现图片压缩上...

  • 前端实现图片压缩

    1.思路 获取图片数据 —> 用canvans画图,压缩 —> 压缩后为base64 —> 转成文件格式 —> 上...

  • 【前端】JavaScript实现图片裁剪

    作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:ww...

  • 图片裁剪压缩

    方法1 方法2 也可以使用系统自带的方法,对图片进行降噪: NSData *data=UIImageJPEGR...

  • 【前端】图片裁剪(二)Jcrop实现裁剪

    前一篇文章已经跟大家讲述了如何利用JavaScript实现Web端图片裁剪功能。可能对大多数人来说,利用JavaS...

网友评论

      本文标题:前端实现图片裁剪和压缩

      本文链接:https://www.haomeiwen.com/subject/wrczzrtx.html