前端 - 将非 jpeg 格式图片转为 jpeg 格式、压缩图片

news/2024/7/8 1:13:45

目录

  • 将非 jpeg 格式图片转为 jpeg 格式
  • 压缩图片
  • 使用

将非 jpeg 格式图片转为 jpeg 格式

/common/compressImage/convertImage

// 思路是创建一个图片,将file等于这个图片,然后创建一个canvas图层 ,将canvas等比例缩放,
//然后用canvas的drawImage将图片与canvas合起来,然后在把canvas的base64转成file即可
export default function ConvertImage(file) {
	return new Promise((resolve, reject) => {
		const fileName = file.name.substring(0, file.name.indexOf('.'))
		let reader = new FileReader() //读取file
		reader.readAsDataURL(file)
		reader.onloadend = function (e) {
			let image = new Image() //新建一个img标签(还没嵌入DOM节点)
			image.src = e.target.result //将图片的路径设成file路径
			image.onload = function () {
				let canvas = document.createElement('canvas'),
					context = canvas.getContext('2d'),
					imageWidth = image.width,
					imageHeight = image.height,
					data = ''
				canvas.width = imageWidth
				canvas.height = imageHeight

				context.drawImage(image, 0, 0, imageWidth, imageHeight)
				data = canvas.toDataURL('image/jpeg')
				var newfile = dataURLtoFile(data, fileName + '.jpeg')
				resolve(newfile)
			}
		}
	})
}
function dataURLtoFile(dataurl, filename) {
	// base64转file对象
	let arr = dataurl.split(','),
		mime = arr[0].match(/:(.*?);/)[1],
		bstr = atob(arr[1]),
		n = bstr.length,
		u8arr = new Uint8Array(n)
	while (n--) {
		u8arr[n] = bstr.charCodeAt(n)
	}
	return new File([u8arr], filename, { type: mime }) //转成了jpeg格式
}

压缩图片

/common/compressImage/compressorjs.js

import Compressor from 'compressorjs' // npm 下载包

/**
 * @param image 图片
 * @param backType 需要返回的类型blob,file
 * @param quality 图片压缩比 0-1,数字越小,图片压缩越小
 * @returns
 */
export default function ImageCompressor(image, backType, quality) {
	return new Promise((resolve, reject) => {
		new Compressor(image, {
			quality: quality || 0.6,
			success(result) {
				let file = new File([result], image.name, { type: image.type })

				if (!backType || backType === 'blob') {
					resolve(result)
				} else if (backType === 'file') {
					resolve(file)
				} else {
					resolve(file)
				}
			},
			error(err) {
				console.log('图片压缩失败---->>>>>', err)
				reject(err)
			},
		})
	})
}

使用

使用1:封装方法

async getUrl(file) {
  this.isShowLoading = true;
  for (let i = 0; i < file.length; i++) {
    let img = file[i];

    const fileType = img.name.substring(img.name.indexOf(".") + 1);
    // 判断文件是不是jpeg 不是jpeg的都转成jpeg
    if (!["jpeg", "jpg"].includes(fileType)) {
      img = await ConvertImage(img); //转陈jpeg格式的file
    }
    let newImg = await ImageCompressor(img, "file", 0.6); //图片压缩
    // newImg 压缩后文件 File
  }
},

以上来源

使用2:不封装方法,直接用

<script>
// ...
import ImageCompressor from "../../common/compressImage/compressorjs.js";
import ConvertImage from "../../common/compressImage/convertImage";

export default {
  name: "addCar",
  methods: {
    jszxszUpload(type) {
      uni.chooseImage({
        success: async (imageRes) => {
          let bool = true;
          if (imageRes.tempFiles[0].type) {
            if (
              !["image/jpeg", "image/jpg", "image/png", "image/heic"].includes(
                imageRes.tempFiles[0].type
              )
            ) {
              bool = false;
            }
          } else {
            const imgTypeStr = "jpeg, jpg, png, heic";
            const type = imageRes.tempFilePaths[0].split(".")[1];
            if (imgTypeStr.indexOf(type.toLowerCase()) < 0) {
              bool = false;
            }
          }
          if (!bool) {
            uni.showLoading({
              title: "请上传 jpeg、jpg、png、heic 格式图片",
              icon: "none",
            });
            setTimeout(function () {
              uni.hideLoading();
            }, 2000);
            return;
          }

          let fileBase64 = "";
          //#ifdef H5
          /** ** 图片压缩 start ****/
          let img = imageRes.tempFiles[0];
          const fileType = img.name.substring(img.name.indexOf(".") + 1);
          if (!["jpeg", "jpg"].includes(fileType)) {
            img = await ConvertImage(img); // 转为 jpeg 格式的 file
          }
          let newImg = await ImageCompressor(img, "file", 0.6); //图片压缩
          /** ** 图片压缩 end ****/
          fileBase64 = await this.toBase64(newImg);
          //#endif

          //#ifdef MP-WEIXIN
          /** ** 图片压缩 start ****/
          let imgBlob = imageRes.tempFilePaths[0];
          const fileTypeBlob = imgBlob.name.substring(
            imgBlob.name.indexOf(".") + 1
          );
          if (!["jpeg", "jpg"].includes(fileTypeBlob)) {
            imgBlob = await ConvertImage(imgBlob); // 转为 jpeg 格式的 file
          }
          let newImgBlob = await ImageCompressor(imgBlob, "blob", 0.6); //图片压缩
          /** ** 图片压缩 end ****/
          fileBase64 = await this.downloadAndConvert(newImgBlob);
          //#endif

          // ... 以 base64 格式上传图片 fileBase64
        },
      });
    },
    // 文件转base64
    toBase64(file) {
      return new Promise((resolve, reject) => {
        const fileReader = new FileReader();
        fileReader.onload = (e) => {
          resolve(e.target.result);
        };
        fileReader.readAsDataURL(file);
        fileReader.onerror = () => {
          reject(new Error("文件流异常"));
        };
      });
    },
  },
};
</script>

http://lihuaxi.xjx100.cn/news/1615905.html

相关文章

【Leetcode刷题(数据结构)】:三路划分与三数随机取中的思想实现快速排序的再优化

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中 的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右 子序列中所有元素均…

M1Mac开启x86_64命令行archlinux虚拟机的最佳实践(qemu)

categories: [Tips] tags: Linux MacOS 写在前面 UTM 虚拟机可以卸载了, 命令行才是永远滴神, M1 MacBook Air 又能再战了! 之前一直用 UTM 的虚拟化开启 x86_64 的 Linux 虚拟机的, 但是我发现 UTM 好像不是必须的, 只要有qemu 就可以了, 下面就看看如何不通过图形界面前端…

ubuntu20.04 vins-fusion 运行记录

过程记录 环境&#xff1a; ubuntu20.04 opencv4.2.0(此次使用) 3.3.1(其他程序在使用) vins-fusion vision_opencv 1.下载VINS-Fusion和cv_bridge&#xff0c;并进行修改&#xff0c;方便使用opencv4.2.0和对应的cv_bridge。 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src…

机器人命令表设计

演算命令 CLEAR 将数据 1 上被指定的编号以后的变数的内容&#xff0c;以及数据 2 上仅被指定的个数都清除至 0。 INC 在被指定的变数内容上加上 1。 DEC 在被指定的变数内容上减掉 1。 SET 在数据 1 上设定数据 2。 ADD 将数据 1 和数据 2 相加&#xff0c;得出的结果保存在数…

【Power BI】Power BI 入门指南:版本、下载和报表创建的步骤

文章目录 一、前言二、了解 Power BI 版本三、下载 Power BI Desktop四、如何开始使用 Power BI Desktop五、在 Power BI Desktop 中创建报表六、文末总结 一、前言 Power BI 是微软于 2013 年推出的产品&#xff0c;为一款商业智能与数据可视化工具。它通过引人注目的视觉效果…

BAT学习——计算当前路径下指定格式文件的MD5值,将文件名与MD5值写入文本

将以下内容粘贴到bat脚本中&#xff0c;双击运行&#xff0c;生成MD5.txt文件&#xff0c;需要其他格式&#xff0c;修改循环中的.rar 多个格式使用or分开 *.rar or *.bat脚本内容 echo off setlocal enabledelayedexpansionrem 设置输出文件名 set "outputFileMD5.txt&…

SLAM从入门到精通(camera数据读取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 实际ros开发的时候&#xff0c;现场有很多特征都可以用来进行采集和标定。比如说地面&#xff0c;对于外资企业或者管理比较规范的企业来说&#x…

OpenCV项目开发实战--详细介绍如何进行图像平移和旋转含原理讲解+实现源码

如今,图像编辑变得越来越流行,因为手机具有这种内置功能,可以让您对图像进行裁剪、旋转和执行更多操作。在这篇博文中,我们将使用 OpenCV 探索图像转换和图像旋转。 基本图像转换操作 图像平移和旋转是图像编辑中最基本的操作之一。两者都属于更广泛的仿射变换类别。因此…