dedecms imagecut.php chrome浏览器不兼容,base64图片在各种浏览器的兼容性处理

IE浏览器目前最高的版本是v11,而微软放弃了IE,转向新的浏览器开发,并取名为Edge。base64图片在IE9及以后的图片均能显示没有问题,而Firefox, Chrome, Safari等非IE浏览器都能正常显示,所以显得IE浏览器比较low。那么兼容性究竟应该怎么来处理呢? 分三种情况。

(1)IE9+、Firefox、Chrome、Safari等浏览器

base64图片在HTML里的标准写法是:

javascript给img元素的src属性赋值或是给其他元素的backgroundImage属性赋值都可以正确的显示图片。

其格式为 data:{mimeType};base64,{code}

{mimeType}是指图片的格式类型,一般来说,JPG文件填写image/jpeg, GIF文件填写image/gif, PNG文件填写 image/png。

{code}是指图片二进制转换成base64的字符串。

(2)IE6、IE7浏览器

低版本的IE浏览器不支持img的src属性用data:image/jpeg这样写,但是我们可以使用mhtml调用附件资源的形式来处理图片。格式如下:

其中,bondary="imagedata"中的imagedata是指图片的标识前缀,可任意命名,所有的图片流都以这个两个减号和该前缀开头。Content-Location: showimg中的showimg是指图片的标识名称,可任意命名,IE6和IE7的CSS调方法为 .non_img_tag { *background-image: expression('mhtml:http://test.oa.com/base64.html!showimg');} 其中*background-image里*表示只有ie6 ie7ie8才能访问的CSS属性,俗称CSS hack。showimg是放在当前网页的网址加一个感叹号后面。expression是IE浏览器早期版本才支持,可用于js调用,隐患很大,其他浏览器不支持。mhtml是微软的一种网页格式,其扩展名为.mht,它会把网页中需要的图片写到单一的文件里。IE右键菜单点击另存为...会有单一文件选项。

注意:因为ie6和ie7不支持data:image/jpeg这样写,所以我们只能使用非img标签的background-image属性来操作,并且这种操作不支持javascript来改变它的值,只能使用CSS。这段注释可以放在任何地方。但是为了好调用,我把它放在文件头部。

(3)IE8浏览器

ie8浏览器分两种情况。一种是在XP下ie6升级到ie8,另一种是Win7自带的ie8。两者的区别是XP下的ie8不支持javascript直接将backgroundImage赋值为base64值。但是Win7下是可以的。

如何兼容

在代码上我们使用UserAgent里的Trident和Windows NT版本来确认ie8在何种情况使用:

A.当NT版本是NT 5.x并且Trident没现出现的时候,判定为xp下的ie6和ie7,执行第2种情况;

B.当NT版本是NT 5.x并且Trident 4.0的时候,判定为xp下的ie8,执行第2种情况;

C.当NT版本是NT 6.x时,为win7、win8、win10系统,执行第1种情况;

D.都不是时,就是非IE流览器,执行第1种情况

完整的代码如下:

base64图片兼容性测试

function setImage(obj) {

// for ie6、ie7、ie8

if (!/Trident/.test(navigator.userAgent) && /MSIE [6-8]\.0.*Windows NT 5\./.test(navigator.userAgent)) return "";

//for ie9 or later、FireFox 、chrome 、Opera

var html = document.firstChild.nodeValue;

var reg = new RegExp("--imagedata\\s*[\\r\\n]+Content-Type:\\s*(image\\/\\w+)\s*[\\r\\n\\s]+Content-Location:\\s*" + obj + "\\s*Content-Transfer-Encoding:\\s*base64\\s*[\\r\\n\\s]+([a-zA-Z0-9\\/\\+\\r\\n=]+)", "g");

var codePart = reg.exec(html);

document.getElementById(obj).style.backgroundImage = "url(data:" + codePart[1] + ";base64," + codePart[2] + ")";

}

setImage("showimg");

setImage("img2");

document.getElementById("useragent").innerHTML = navigator.userAgent;

执行效果

105485b77f5b968307ccc00664dd6ae1.png

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
const fs = require('fs'); const Jimp = require('jimp'); const sharp = require('sharp'); sharp('bg.webp') .png() .toFile('./bg.png') .then(() => { parse_bg_captcha('./bg.png', true, 'bg.jpg') .then(img => console.log('还原完成')) .catch(err => console.error(err)); }) .catch((err) => { console.error(err); }); async function parse_bg_captcha(img, im_show = false, save_path = null) { let _img; if (typeof img === 'string') { _img = await Jimp.read(img); } else if (img instanceof Buffer) { _img = await Jimp.read(img); } else { throw new Error(输入图片类型错误, 必须是<string>/<Buffer>: ${typeof img}); } // 图片还原顺序, 定值 const _Ge = [ 39, 38, 48, 49, 41, 40, 46, 47, 35, 34, 50, 51, 33, 32, 28, 29, 27, 26, 36, 37, 31, 30, 44, 45, 43, 42, 12, 13, 23, 22, 14, 15, 21, 20, 8, 9, 25, 24, 6, 7, 3, 2, 0, 1, 11, 10, 4, 5, 19, 18, 16, 17 ]; const w_sep = 10, h_sep = 80; // 还原后的背景图 const new_img = await new Jimp(260, 160, 0xFFFFFF); for (let idx = 0; idx < _Ge.length; idx++) { const x = _Ge[idx] % 26 * 12 + 1; const y = _Ge[idx] > 25 ? h_sep : 0; // 从背景图中裁剪出对应位置的小块 const img_cut = _img.clone().crop(x, y, w_sep, h_sep); // 将小块拼接到新图中 const new_x = idx % 26 * 10; const new_y = idx > 25 ? h_sep : 0; new_img.blit(img_cut, new_x, new_y); } if (save_path) { await new_img.writeAsync(save_path); } if (im_show) { await new_img.getBufferAsync(Jimp.MIME_JPEG, (err, buffer) => { if (err) { console.error(err); return; } const base64Img = Buffer.from(buffer).toString('base64'); console.log(data:image/jpeg;base64,${base64Img}); }); } return new_img; } 请帮我优化这段代码
最新发布
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值