前端转换图片格式 前端将png格式图片转成jpg格式 前端用使用canvas转换图片格式

导读:本篇文章讲解 前端转换图片格式 前端将png格式图片转成jpg格式 前端用使用canvas转换图片格式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在开发中,遇到这样一个需求。由于我们的照片是要下发到设备上,而我们的设备只支持jpg格式的图片。那么我们不能限制用户只选择jpg图片进行上传,这样用户体验极差。

解决方案:用canvas转换图片的格式

1、把转换的方法单独放在imgTypeChange.js中

imgTypeChange.js文件

// 把image 转换为 canvas对象
function imgToCanvas(image) {
  let canvas = document.createElement("canvas");
  canvas.width = image.width;
  canvas.height = image.height;
  canvas.getContext("2d").drawImage(image, 0, 0);
  return canvas;
}

//canvas转换为image
function canvasToImg(canvas, type='jpeg') {
    return new Promise((resolve, reject) => {
    canvas.toBlob( (image)=> {
      resolve(image)
    }, `image/${type}`)
  })
}


//获取图片信息
function getImg(fn, file) {
  return new Promise((resolve => {
    const imgFile = new FileReader()
    // 使用FileReader来把文件读入内存,并且读取文件中的数据。 readAsDataURL方法可以在浏览器主线程中异步访问文件系统,读取文件中的数据,且读取后 result 为 DataURL, DataURL 可直接 赋值给 img.src
    imgFile.readAsDataURL(file);
    imgFile.onload = function (e) {
      const image = new Image()
      image.src = e.target.result; //base64数据
      image.onload = async function () {
        resolve(await fn(image))
      }
    }
  }))
}
// 该方法最后拿到的结果是一个File类型的文件
 async function imgTypeChange(file) {
  //获取图片信息
   return await getImg(async function(image) {
    let imgName = file.name.split('.')[0]
    // 把image 转换为 canvas对象
    const can = imgToCanvas(image)
    //canvas转换为Bolb 类型image
    const blobImg = await canvasToImg(can, 'jpeg')
    return new Promise((resolve) => {
      resolve(new File([blobImg], `${imgName}.jpg`, { type: blobImg.type }))
    })
  }, file)
}
export default imgTypeChange

2、在需要的地方引入即可,下面给出我使用的案例

// 导入该方法
import imgTypeChange from '../util/imgTpyeChange'
//* 封装post请求
export async function post(url, data = {}, config = { showLoading: true }, timeout) {
  // url 单独处理上传统一转图片类型
  if(url.includes(`putOneFile`)) {
    //  单张上传图片处理
    let file = data.get('file')
    // 针对不是jpg格式的文件处理为jpg格式的文件
    if(!file.type.includes('image/jpeg')) {
      let myFile = await imgTypeChange(file)
      const formData = new FormData()
      formData.append('file', myFile)
      data = formData
    }
  }else if(url.includes(`put-file`)) {
    //  批量上传图片处理
    const formData = new FormData()
    let arr = data.getAll('file')
    for(let i = 0; i < arr.length; i++) {
      if(!arr[i].type.includes('image/jpeg')) {
        let myFile = await imgTypeChange(arr[i])
        formData.append('file', myFile)
      }else {
        formData.append('file', arr[i])
      }
    }
    data = formData
  }
  return new Promise((resolve, reject) => {
    axios({
            url,
            method: 'post',
            data,
            timeout: timeout ? timeout : 0,
    config
}).then(
    res => {
      console.log('res',res)
      resolve(res.data)
},
  err => {
    reject(err)
  }
)
})
}

原生JS可直接预览版(直接复制保存html文件即可预览转换简易版)

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <input type="file" id="inputimg">
  <select id="myselect">
    <option value="1">jpeg格式</option>
    <option value="2">webp格式</option>
    <option value="3">png格式</option>
  </select>
  <button id="start">开始转换</button>
  <p>预览:</p>
  <img id="imgShow" src="" alt="">
</body>

<script>
  /*事件*/
  document.getElementById('start').addEventListener('click', function () {
    getImg(function (image) {
      let can = imgToCanvas(image)
      imgshow = document.getElementById("imgShow");
      imgshow.setAttribute('src', canvasToImg(can));
    });
  });
  // 把image 转换为 canvas对象
  function imgToCanvas(image) {
    let canvas = document.createElement("canvas");
    canvas.width = image.width;
    canvas.height = image.height;
    canvas.getContext("2d").drawImage(image, 0, 0);
    return canvas;
  }
  //canvas转换为image
  function canvasToImg(canvas) {
    let array = ["image/jpeg", "image/webp", "image/png"]
    type = document.getElementById('myselect').value - 1;
    console.log(canvas);
    let src = canvas.toDataURL(array[type]);
    // console.log(src);
    return src;
  }
  //获取图片信息
  function getImg(fn) {
    let imgFile = new FileReader();
 	 try {
      // 使用FileReader来把文件读入内存,并且读取文件中的数据。 readAsDataURL方法可以在浏览器主线程中异步访问文件系统,读取文件中的数据,且读取后 result 为 DataURL, DataURL 可直接 赋值给 img.src
      imgFile.readAsDataURL(document.getElementById('inputimg').files[0]);
      imgFile.onload = function (e) {
        let image = new Image();
        image.src = e.target.result; //base64数据
        image.onload = function () {
          fn(image);
        }
      }

    } catch (e) {
      console.log("请上传图片!" + e);
    }
  }
</script>
</html>

1、该工具目前仅支持转换为webp、jpeg、png的格式。如果是gif动态图片转换后不保留动态效果。
2、请使用高版本浏览器,推荐使用Chrome。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/64761.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!