图片压缩 JPG压缩 PNG压缩 BMP压缩 WEBP压缩 证件照压缩 压缩指定大小 图片改尺寸 修改DPI 内存变大 图片格式转换 HEIC转JPG TIFF转JPG 图片转ICO 图片转JPG 图片转PNG 图片转BMP 图片转WEBP
{{userInfo && userInfo.isVip ? '续费会员' : '开通会员'}}
登录/注册
{{userInfo.nickname}}
普通用户
VIP会员
ID: {{userInfo.id}}
单次上传不超过12个
不限文件大小
剩余次数:{{userInfo ? userInfo.max_download : 0}}
开通会员享无限制压缩
到期时间:{{userInfo.vipDate}}
续费会员
开通会员
退出登录
图片压缩 图片编辑 图片格式转换

项目开发中竟遇到如此诡异的二维码乱码问题

搞定第三方登录和扫描二维码问题,兄弟姐妹们是不是很头疼?用Axios发HTTP请求得数据,结果却是一堆乱七八糟的二进制编码,晕头转向?下面给大家分享一下我怎么应对这些问题的,包括遇到的难题、试过哪些办法,还有最后成功的解决方案!

一、问题初现与困惑

告诉你个事儿,我刚才上网搜二维码信息,用了Axios这个软件。你猜怎么着?它给我弄出一堆我看不明白的二进制码,头都大了!特别是现在天气这么热,我感觉脑子都快炸了,一片混乱。

就是找不到问题,只好继续找原因了。方法用过好几种,看请求头查验证参数啥的,就是找不着那个烦人的东西。我还想过把那些乱七八糟的字节转成图片瞧瞧,结果还是打不开。

二、采坑记录

试了好多次都不行,索性把每次试的过程和结果记下来找找规律。

既然图片链接要Token验证,那我就不搞它了呗,直接过!

2.接着,我尝试读取远程图片文件,结果不出所料地失败了。

var url = this.domain + "app/smartqq/getQRCode";
var image = document.createElement(‘img’);
image.crossOrigin = '';
image.src = url;
document.body.appendChild(image);

随便试了试Blob回应方式,没想到竟然成功了!

Blob的确帮了忙,不过我还是试着找别的路子看看,毕竟更棒的方法可能还有。

let fr = new FileReader();
let blob = new Blob([res.data],{type:"image/png"});
fr.readAsDataURL(blob); //读取文件内容,读取完成,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容。
let getImgUrl = new Promise((resolve,reject)=>{
  fr.onload = function(){
    var  dataUrl = fr.result;  //result属性为data:URL格式,与读取方式有关
    resolve(dataUrl);
  };
});
getImgUrl.then(res=>{
  console.log(res);
});

进制转换js_js二进制流转换成图片_进制转换流程图怎么画

三、深入分析问题根源

明白乱码原因后,我就想弄清楚为什么Axios不能处理二进制图片数据?简单说,Axios只能处理application/json或者text/plain这样的格式,遇到二进制数据就抓瞎了,结果就是一堆乱七八糟的字符。

四、选择Blob响应类型获取图片数据

this.$axios({
   method: 'get',
     url: this.domain + "app/smartqq/getQRCode", // 请求地址
     data: {} , // 参数
     responseType: 'blob' // 表明返回服务器返回的数据类型
 }).then(
     (res) => {
     let blob = new Blob([res.data], {type: "image/png"});
     let fileName = Date.parse(new Date())+".png" ;
     if (window.navigator.msSaveOrOpenBlob) {
         navigator.msSaveBlob(blob, fileName);
     } else {
         var link = document.createElement('a');
         link.href = window.URL.createObjectURL(blob);
         link.download = fileName;
         link.click();
         window.URL.revokeObjectURL(link.href);
     }
 });    

搞定!现在只需要处理下思路。这次打算用Blob回应方式取图。你知道吗?Blob就是存储二进制数据的高手,超好用。调整了Axios的回应方式为Blob之后,果然成功拿到想要的图片数据!

五、Blob对象的应用与转换

搞定Blob之后,下一步就是要把它变成可在网页上看见的图片。不要怕js二进制流转换成图片,URL.createObjectURL()这个好帮手来了,它能把Blob变成临时链接,再放到图片标签的src属性里,图片就能亮相!

this.$axios.get(this.domain+'app/smartqq/getQRCode',{
  responseType: 'arraybuffer'
}).then(response => {
  return   'data:image/png;base64,' + btoa( new Uint8Array(response.data).reduce((data, byte) => data + String.fromCharCode(byte), '') )
}).then(response => {
  var img = document.createElement('img');
  img.src = response;
  document.body.appendChild(img);
}); 

六、总结与反思

这次尝试给我上了一课,要处理二进制数,得挑好对的应对办法和计算方式!还学到怎么用Blob来理解,然后展示图片文件里的那些看不见摸不着的二进制数据。这次可真是长见识了,不仅提高了自己的技术水平,也让我对项目开发中的各种小细节有了更深的了解。

this.$axios.get(this.domain+'app/smartqq/getQRCode').then(response => {
  console.log(response);
  var blob = response.data;
  var img = document.createElement("img");
  img.onload = function(e) {
    window.URL.revokeObjectURL(img.src); 
  };
  img.src = window.URL.createObjectURL(blob);
  document.body.appendChild(img);
});

七、向读者提出的问题

你有没有像我这样碰到过问题?咋解决的?教教我!咱们可以互相学习。还有,觉得这篇文章还行的话,就给个赞或者转发出去,让大家也看看呗!

为什么应该选择「i 压缩-图片压缩」?
安全可靠
我们承诺在处理文件后的一小时自动将文件从网站的服务器永久删除,100%保障你的隐私。
批量处理
批量进行图片格式转换,支持多种图片格式互转,满足您的转换需求。
快速高效
图片文件拖拽至转换区或点击添加按钮,将文件上传至平台,稍等片刻即可快速转换。
云端引擎
基于浏览器运行,整个过程依赖服务器端进行,无需额外下载安装客户端软件。
图片压缩三步完成
第1步
上传图片
在图片添加区域选择您的图片文件上传
第2步
选择参数设置
根据预期需求设置图片修改的参数,点击“开始压缩”
第3步
下载图片
点击“下载全部”按钮即可保存压缩好的图片
使用帮助
图片压缩最新内容 >>
惊!JPEG转JPG只需改个文件名,365压缩工具让你秒变图片处理高手
365压缩:让你的PNG图片瞬间瘦身,画质依旧高清
告别PPT大文件烦恼!365压缩工具教你轻松批量压缩图片,提升工作效率
PPT图片压缩大揭秘:365工具让你轻松搞定,告别文件过大烦恼
揭秘ffmpeg:如何像魔法师一样轻松将视频转换成图片?
图片压缩推荐内容 >>
惊!JPEG转JPG只需改个文件名,365压缩工具让你秒变图片处理高手
365压缩:让你的PNG图片瞬间瘦身,画质依旧高清
告别PPT大文件烦恼!365压缩工具教你轻松批量压缩图片,提升工作效率
PPT图片压缩大揭秘:365工具让你轻松搞定,告别文件过大烦恼
揭秘ffmpeg:如何像魔法师一样轻松将视频转换成图片?
图片压缩随机内容 >>
照片压缩神器365:解决电脑卡顿,轻松分享高清大图
轻松快捷,让图片“瘦”下来的利器—365压缩
别再为图片压缩烦恼!四种超实用方法轻松解决
探索在线图片编辑的魅力与发展趋势
HEIC照片格式转换难题?这些实用工具帮你轻松搞定,再也不用担心兼容性问题
{{item.title}}
{{item.price}} /张
{{item.to_long}}
限时促销
微信支付 支付宝支付
应付金额: ¥{{vipList.length ? vipList[vipSelectIndex].price : ''}}
请使用微信/支付宝扫码支付
用户139****7468 12分钟前购买了 终身会员
用户136****8012 10分钟前购买了 终身会员
用户156****9735 12分钟前购买了 终身会员
用户136****1765 9分钟前购买了 年度会员
用户159****5332 7分钟前购买了 年度会员
用户133****4888 5分钟前购买了 终身会员
购买须知
按张付费购买下载次数 永久有效
开通任一会员,会员有效期内所有功能 不限使用、不限张数
还在犹豫?先体验一下
{{activityData.title}} ¥{{activityData.price}}
不限下载次数
畅享全站功能
有效期{{activityData.to_long}}天
扫码立即开通
微信支付 支付宝支付
扫码支付
放弃机会
预览 左右滑动可查看压缩前后效果对比图
压缩前 {{previewData.original_size}}KB
压缩后 {{previewData.size}}KB