rv1126 web端下载截图保存的图片格式不对分析
1.现象描述
rv1126通过mpp编码保存jpg格式图片,但是通过web前端下载之后,虽然扩展名仍然是.jpg,但是其实图片数据已经是png格式了,原来保存的图片jpg格式的是200KB左右,下载之后,将近2M,并且数据发生变化:
1.截图保存的图片数据头:
2.web前端下载的图片数据头:
目前测试发现,360浏览器和google浏览器会出现图片数据变化的情况,但是火狐浏览器不会。而图片数据发生变化之后,也就是扩展名是jpg,但是数据是png的时候,windows的图片工具仍然可以打开,linux的图片工具会进行检测,提示数据格式不匹配,修改扩展名为png之后倒是可以打开。
2.原因分析
说到问题原因,首先来看下图片下载部分,代码中是分了三种情况的,一种是ie核浏览器,一种是Chrome核浏览器,最后一种分到其他里面,比如火狐浏览器。针对这三种情况,网页的处理也是不一样,第三种其他的用的是普通的浏览器的download的功能进行下载,这种方式目前测试默认情况下也是正常,不会出现图片数据变化的情况,而第一种和第二种处理就会出现问题,所谓的问题就是下载的时候,虽然原始图片是jpg格式,.jpg扩展名,但是下载之后,数据是png格式,扩展名仍然是.jpg格式,起初这个问题没发现,因为没看文件大小,windows上也都能打开,但是Linux上的时候却打不开了,现象如下:
提示扩展名是jpg,但是数据头来看却是png的,从上面的原始数据截图也能看出,linux的图片查看工具比较严格,才发现问题。
具体的问题原因,从下面代码看一下(第一种和第二种都用到了canvas.toDataURL,转base64,问题也正是出在这个地方):
getBase64(url: string, fileType: string, callback: Function) {
const Img = new Image();
let dataURL = '';
Img.src = url;
Img.setAttribute('crossOrigin', 'Anonymous');
Img.onload = () => {
const canvas = document.createElement('canvas');
canvas.width = Img.width,
canvas.height = Img.height;
canvas.getContext('2d').drawImage(Img, 0, 0, Img.width, Img.height);
console.log("getBase64 fileType:",fileType);
dataURL = canvas.toDataURL('image/' + fileType, 1.0);
console.log("dataURL:",dataURL);
callback ? callback(dataURL) : null;
};
}
下面是ie浏览器和google浏览器测试过程中控制台的log:
<ie浏览器 console log>
downloadPic4IE fileType: jpg
getBase64 fileType: jpg
dataURL: data:image/png;base64,.........
<google浏览器 console log>
downloadEvent-->downloadPic4Chrome
main-es2015.dcba4423e943133f53b8.js:1 getBase64Test fileType: jpg
main-es2015.dcba4423e943133f53b8.js:1 getBase64Test dataURL: data:image/png;base64,........
从log来看,我的图片保存的是.jpg扩展名,也就是图片格式被代码认为是jpg格式,结果toDataURL的时候,返回的结果却是image/png,这是因为jpg格式不支持,没识别出来,而canvas的toDataURL默认就是image/png,所以格式不支持的时候,就用了默认的png的,而文件的扩展名是文件名一部分不会修改,所以就出现了.jpg的扩展名,但内容是png的情况,然后我人为修改为jpeg就识别了,log如下:
<ie浏览器 console log>
downloadPic4IE fileType: jpg
getBase64 1fileType: jpg
getBase64 2fileType: jpeg
dataURL: data:image/jpeg;base64,.........
<google浏览器 console log>
downloadEvent-->downloadPic4Chrome
main-es2015.307604d97dd4df664651.js:1 getBase64Test 1fileType: jpg
main-es2015.307604d97dd4df664651.js:1 getBase64Test 2fileType: jpeg
main-es2015.307604d97dd4df664651.js:1 getBase64Test dataURL: data:image/jpeg;base64,........
3.解决方法
都采用第三种方式,不用base64的方式,但是这样的话ie浏览器上有问题,原因没细究。另一个解决方法就是设备端保存图片的时候不用.jpg的扩展名,用.jpeg的扩展名,程序就会识别为jpeg类型,canvas的toDataURL就支持了。
4.扩展知识
canvas的toDataURL都支持哪些类型呢,我们用一个js的测试代码来看:
const canvas = document.createElement('canvas');
//图片导出为 png 格式
var typePng = 'png';
var imgDataPng = canvas.toDataURL(typePng);
console.log("type:png,imgDataPng:",imgDataPng);
var typeJpeg = 'image/jpeg';
var imgDataJpeg = canvas.toDataURL(typeJpeg,1.0);
console.log("type:jpeg,imgDataJpeg:",imgDataJpeg);
var typeJpg = 'image/jpg';
var imgDataJpg = canvas.toDataURL(typeJpg,1.0);
console.log("type:jpg,imgDataJpg:",imgDataJpg);
var typeWebp = 'image/webp';
var imgDataWebp = canvas.toDataURL(typeWebp,1.0);
console.log("type:webp,imgDataWebp:",imgDataJpeg);
上面的代码,我们直接用在线js测试工具跑下结果,在线测试工具连接如下:
https://www.sojson.com/runjs.html
测试结果如下:
> "type:png,imgDataPng:" "data:image/png;base64,..........
> "type:jpeg,imgDataJpeg:" "data:image/jpeg;base64,..........
> "type:jpg,imgDataJpg:" "data:image/png;base64,..........
> "type:webp,imgDataWebp:" "data:image/jpeg;base64,..........
前面的type的是输入的类型,后面是输出的类型,很容易看出支持的类型为:png,jpeg,webp
- 分享
- 举报
-
浏览量:749次2024-09-29 19:03:11
-
浏览量:1357次2023-08-29 15:52:13
-
浏览量:4123次2021-06-18 16:05:42
-
浏览量:1464次2023-11-13 17:48:03
-
浏览量:1512次2023-12-25 14:19:43
-
浏览量:2093次2024-05-24 17:53:56
-
浏览量:1610次2024-05-24 18:51:13
-
浏览量:2643次2023-11-29 08:59:50
-
浏览量:3339次2024-01-03 10:06:09
-
浏览量:4308次2022-10-31 15:07:27
-
浏览量:1989次2024-01-18 18:05:38
-
浏览量:1099次2023-08-30 18:37:06
-
浏览量:843次2024-01-02 09:46:50
-
浏览量:1783次2023-12-29 17:51:55
-
浏览量:1611次2024-01-05 16:46:11
-
2024-01-22 16:35:19
-
浏览量:3466次2022-11-07 15:13:05
-
浏览量:1388次2023-12-07 00:53:19
-
浏览量:1407次2023-08-31 16:23:55
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
林
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明