本文系统梳理了JavaScript中将图片转换为Base64格式的三种核心场景:用户本地文件上传、项目内部静态资源处理以及跨域网络图片获取。通过FileReader与Canvas API两种技术路径,结合文件大小校验与字符串截取等拓展技巧,提供完整的代码实现与注意事项,帮助开发者解决前端图片处理中的常见需求。
JavaScript图片转Base64场景概览
本文详细解析了JavaScript中实现图片转换为Base64格式的多种实际应用案例,旨在为开发者提供清晰的参考指南。
网络上关于JS将图片转为Base64的文章众多,但往往缺乏系统性。有的仅介绍本地图片转码,有的只涉及网络资源转化,缺乏全面覆盖。因此,本文将系统性地梳理并介绍各种典型场景下的实现方案。
本地文件上传处理
场景一:处理用户本地上传的资源。即当用户通过浏览器点击文件上传控件时,前端将选中的图片资源即时转换为Base64格式。
<input type="file" id="image"><br/>
var reader = new FileReader();
var AllowImgFileSize = 2100000; //上传图片最大值(单位字节)( 2 M = 2097152 B )超过2M上传失败
var file = $("#image")[0].files[0];
var imgUrlBase64;
if (file) {
//将文件以Data URL形式读入页面
imgUrlBase64 = reader.readAsDataURL(file);
reader.onload = function (e) {
//var ImgFileSize = reader.result.substring(reader.result.indexOf(",") + 1).length;//截取base64码部分(可选可不选,需要与后台沟通)
if (AllowImgFileSize != 0 && AllowImgFileSize < reader.result.length) {
alert( '上传失败,请上传不大于2M的图片!');
return;
}else{
//执行上传操作
alert(reader.result);
}
}
}
项目内部资源转换
场景二:处理本项目内部的图片资源。即将项目目录下的静态图片转换为Base64字符串。虽然此场景有时可通过场景三(使用绝对路径)间接实现,但单独处理本地资源有其特定逻辑。
function(){
var url = "static/img/js1.jpg";//这是站内的一张图片资源,采用的相对路径
convertImgToBase64(url, function(base64Img){
//转化后的base64
alert(base64Img);
});
}
//实现将项目的图片转化成base64
function convertImgToBase64(url, callback, outputFormat){
var canvas = document.createElement('CANVAS'),
ctx = canvas.getContext('2d'),
img = new Image;
img.crossOrigin = 'Anonymous';
img.onload = function(){
canvas.height = img.height;
canvas.width = img.width;
ctx.drawImage(img,0,0);
var dataURL = canvas.toDataURL(outputFormat || 'image/png');
callback.call(this, dataURL);
canvas = null;
};
img.src = url;
}
网络图片资源获取
场景三:处理网络图片资源。即将互联网上的图片链接转换为Base64格式。值得注意的是,若场景二中的资源路径改为绝对路径,理论上也可套用场景三的方法进行处理。
function(){
//这是网上的一张图片链接
var url="http://p1.pstatp.com/large/435d000085555bd8de10";
getBase64(url)
.then(function(base64){
console.log(base64);//处理成功打印在控制台
},function(err){
console.log(err);//打印异常信息
});
}
//传入图片路径,返回base64
function getBase64(img){
function getBase64Image(img,width,height) {//width、height调用时传入具体像素值,控制大小 ,不传则默认图像大小
var canvas = document.createElement("canvas");
canvas.width = width ? width : img.width;
canvas.height = height ? height : img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
var dataURL = canvas.toDataURL();
return dataURL;
}
var image = new Image();
image.crossOrigin = '';
image.src = img;
var deferred=$.Deferred();
if(img){
image.onload =function (){
deferred.resolve(getBase64Image(image));//将base64传给done上传处理
}
return deferred.promise();//问题要让onload完成后再return sessionStorage['imgTest']
}
}
拓展应用与工具推荐
至此,图片Base64转码的三种主要场景已介绍完毕。接下来,基于上述基础操作,补充一些常见的拓展应用场景。
拓展一:后端接收纯字符串数据。在某些后端接口设计中,可能需要去除Base64数据头(即去掉“data:image/png;base64,”前缀),仅保留纯字符串部分,这通常通过截取字符串实现。
reader.result.substring(reader.result.indexOf(",") + 1)
拓展二:限制Base64资源大小。为防止上传过大图片导致性能问题,可在转换后判断其大小,若超过设定阈值(如2MB)则禁止上传。
var AllowImgFileSize = 2100000; //上传图片最大值(单位字节)( 2 M = 2097152 B )
if (AllowImgFileSize != 0 && AllowImgFileSize < reader.result.length) {
alert( '上传失败,请上传不大于2M的图片!');
return;
}
其中reader.result即为完成Base64转码后的最终结果字符串。以上整理自网络资源并经实测验证,代码可用。
此外,推荐几款Base64在线工具供参考:
BASE64编码解码工具: http://tools.jb51.net/transcoding/base64
在线图片转换BASE64工具: http://tools.jb51.net/transcoding/img2base64
Base64在线编码解码 UTF-8版: http://tools.jb51.net/tools/base64_decode-utf8.php
Base64在线编码解码 gb2312版: http://tools.jb51.net/tools/base64_decode-gb2312.php
更多关于JavaScript相关内容可查看本站专题:《JavaScript加密解密技巧汇总》、《javascript编码操作技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。