原生 js 使用 canvas 实现图片格式 webp/png/jpeg 在线转换

本贴最后更新于 1773 天前,其中的信息可能已经沧海桑田

功能需求:

我们在网页中上传一张图片,选择不同的格式,将该图片转换为对应的格式。

实现思路:

实现这样的功能,使用后端语言【php,java 等】可以很容易的完成。但是如果只在前端如何完成呢?

  1. 通过 input 上传图片,使用 FileReader 将文件读取到内存中。
  2. 将图片转换为 canvas,canvas.toDataURL()方法设置为我们需要的格式,如:"image/webp","image/jpeg","image/png"。
  3. 最后将 canvas 转换为图片,显示在网页中。点击右键保存,就得到了不同格式的图片了。

toDataURL 说明:

方法返回一个包含图片展示的 data URI 。可以使用 type 参数其类型,默认为 PNG 格式。图片的分辨率为 96dpi。

语法:

canvas.toDataURL(type, encoderOptions);.toDataURL(type, encoderOptions);(type, encoderOptions);type, encoderOptions);, encoderOptions);encoderOptions););

type【可选】 图片格式,默认为 image/png,可选格式:"image/webp","image/jpeg","image/png"。

encoderOptions【可选】在指定图片格式为 image/jpeg 或 image/webp 的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。

注意点:

  1. 如果画布的高度或宽度是 0,那么会返回字符串“data:,”。
  2. 其中 webkit 内核浏览器支持“image/webp”类型 。 建议使用 Chrome 浏览器。

代码例子:

html:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图片在线webp/png/jpeg格式转换工具</title> <meta name="description" content="图片在线转换工具:可以选择.webp .png .jpeg格式图片转换器" /> <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"> <meta name="format-detection" content="telephone=no" /> <meta http-equiv="Cache-Control" content="no-transform,no-siteapp"> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <link href="res/style.css" type="text/css" rel="stylesheet"/> <style> *{ outline: none; } .center{ min-width:1100px; } .center h2{ text-align: center;height: 60px;line-height: 60px;border-bottom: 1px solid #ddd; } .fli{ color:#666;font-size: 16px;margin: 10px auto;width: 1100px; } .fli .name{ font-size: 16px;margin: 10px auto;color:#1FBCB6; } .fli img{ max-width: 400px; } button{ border: 0;background: #1FBCB6;color:#fff;padding: 8px 15px;cursor: pointer; } textarea{ width: 100%;max-width: 100%;max-height: 500px; } button:hover{ background: #1B6D85; } .sdiv{ margin: 20px auto; } select{ height: 26px;line-height: 26px;border: 1px solid #888; } </style> </head> <body><div class="center"> <div id="ad_line" style="text-align: center;"></div> <h2>图片在线webp/png/jpeg格式转换工具</h2> <div class="fli"> <span>选择图片:</span><input type="file" id="inputimg"> <div class="sdiv"> <span>选择格式:</span> <select id="myselect"> <option value="1">webp格式</option> <option value="2">jpeg格式</option> <option value="3">png格式</option> </select> </div> <button id="start">开始转换</button> </div> <div class="fli"> <p>预览:</p> <img id="imgShow" src="" alt=""> </div> <div class="fli"> <h3>备注:</h3> <p>1、转换后的图片请选择右键保存!</p> <p>2、该工具目前仅支持转换为webp、jpeg、png的格式。如果是gif动态图片转换后不保留动态效果。</p> <p>3、请使用高版本浏览器,推荐使用Chrome。</p> </div> </div></body> <script> /*事件*/ document.getElementById('start').addEventListener('click', function(){ getImg(function(image){ var can=imgToCanvas(image), imgshow=document.getElementById("imgShow"); imgshow.setAttribute('src',canvasToImg(can)); }); }); // 把image 转换为 canvas对象 function imgToCanvas(image) { var 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) { var array=["image/webp","image/jpeg","image/png"], type=document.getElementById('myselect').value-1; var src = canvas.toDataURL(array[type]); return src; } //获取图片信息 function getImg(fn){ var imgFile = new FileReader(); try{ imgFile.onload = function(e) { var image = new Image(); image.src= e.target.result; //base64数据 image.onload=function(){ fn(image); } } imgFile.readAsDataURL(document.getElementById('inputimg').files[0]); }catch(e){ console.log("请上传图片!"+e); } } </script> </html>

演示链接 img.format.cool

原文链接

  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1282 回帖 • 5 关注
1 操作
724555508 在 2020-08-17 21:04:19 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...