添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
小胡子的牛腩  ·  SVG避开空白处·  2 年前    · 
慷慨的蚂蚁  ·  06 ...·  2 年前    · 
直爽的领结  ·  java ...·  2 年前    · 

svg转base64

昨天研究水印生产,其中使用到svg转base64,要用到 btoa 时,但是发现调用 btoa 之前都会再执行一个转码的api (注:有个跟它相反的** atob ,两者功能正好相反)

window.btoa(unescape(encodeURIComponent(svgStr)))

我测试了一个例子,发现 unescape(encodeURIComponent(svgStr)) 貌似会对字符串里面的中文进行转码,后面查了一下 btoa 发现它接收的参数必须ASCII 码,如果里面有中文或者特殊字符会报错

btoa('我') 
// Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

如果是普通的字符串转base64,直接调用 encodeURIComponent 即可,但是像转svg这种就不能用这个方法,因为这样就无法显示图片了,所以需要对svg字符串里面的特殊字符转 ASCII 码,注意是只针对特殊字符
encodeURIComponent 针对非ASCII码返回的是utf-8 转义序列与%拼接的字符串,ASCII码则返回%与16进制数字,在编码ASCII时encodeURIComponentescape 返回是一样的
escape 编码非ASCII码时,返回的 %u与16进制的数据,这是它跟 encodeURIComponent 最大的区别。当前二者编码范围也不一样:
encodeURIComponent 不编码范围 A-Z a-z 0-9 - _ . ! ~ * ’ ( )
escape 不编码范围 A-Z a-z 0-9 @*_±./

encodeURIComponent('<') === escape('<') === '%3c'
encodeURIComponent('我') //  "%E6%88%91",由此可以看出utf-8编码中一个汉字占了三个字节(有些汉字占4个字节)
escape('我') // '%u6211'

看了上面编码的对比以及svg里面的字符串的格式(svg标签以及标签内的属性都是ASCII码)。现在只需要解决非ASCII码的编码问题,最简单的方式:

unescape(encodeURIComponent(svgStr))

通过正则的方式:

// 过滤ASCII码外的字符,并转成浏览器可识别的转义序列,16进制的转义序列前缀是 &#x
// ASCII编码范围是 0-255,用16进制表示就是 00-ff
// 16进制转10进制 parseInt('ff', 16) // 255
 function filterUnicodeToAscii(string) {
     return string.replace(/[^\x00-\xff]/g, function (str) {
       return '&#x' + str.charCodeAt().toString(16) + ';'
 filterUnicodeToAscii(svgStr)

以上就是全部内容了,其实关于字符串还有很多知识,但是文章有点乱,就不补充了。ps:本篇文章断断续续写了一周

以下是常用的字符串转码方法:

中文字符转Unicode码

function toUnicode(str){
    return str.replace(/[^\u0000-\u00FF]/g,function($0){
        return escape($0).replace(/(%u)(\w{4})/gi,"\\u$2");
    });
//escape 已经从标准中删除,但是Unicode主要是获取字符的16进制,可以用 charCodeAt().toString(16) 来获取
//'我'.charCodeAt().toString(16) // 6211
//如果获取的16进制小于4位,则需要补0,下面这种情况就要补0
//'?'.charCodeAt().toString(16) // 3f
// 下面是完整的代码
function toUnicode(str){
	if(!str && typeof str === string) {
		throw('请传入长度大于1的字符串')
	const prefixed = '\u';
	const codes = '';
    for(let s of str) {
    	codes += prefixed + s.charCodeAt().toString(16).padStart(4, '0');
    return codes;

10进制与16进制互转

// 数字转16进制
const n = 233;
n.toString(16) // e9
// 16进制转数字
const s = 'e9'
parseInt(s, 16) // 233

回忆一下encodeURIComponent 和 encodeURI

encodeURIComponentencodeURI 区别在于前者会额外对特殊字符进行编码,比如下面这种情况就只能用encodeURIComponent,如果没有对这部分进行编码,则查询的时候后面的部分就无法查询到

const value = 'test&a=1'
'http://www.baidu.com/s?word=' + encodeURIComponent(value)
encodeURIComponent(value) // "test%26a%3D1"
encodeURI(value) // "test&a=1"
                    昨天研究 btoa 时,发现调用之前都会再执行一个转码的api  (注:btoa 是转 base64 时用的,还有个跟它相反的 atob)window.btoa(unescape(encodeURIComponent(svgStr)))我测试了一个例子,发现 unescape(encodeURIComponent(svgStr)) 貌似会对字符串里面的中文进行转码中文字符转Unicode码function toUnicode(str){    return str.replace(/[^\u00
我们需要获取目标SVG: 
 var svg = document . querySelector ( 'svg' ) ;
 比我们必须创建宽度和高度完全像我们要换的svg的画布: 
 var canvas = document . createElement ( 'canvas' ) ;
canvas . width = svg . getBoundingClientRect ( ) . width ;
canvas . height = svg . getBoundingClientRect ( ) . height ;
body . appendChild ( canvas ) ;
 ...魔术来了:
 XMLSerializer.serializeToSt
				
文章目录SVG 简介什么是SVGSVG有哪些优势SVG在小程序中的使用获取SVG资源获取对应SVG代码将SVG代码码为Base64编码格式在具体代码中引用SVG展示效果 SVG 简介 什么是SVG SVG 意为可缩放矢量图形(Scalable Vector Graphics)。 SVG 使用 XML 格式定义图像。 它是可以用于描述静态图、动画,以及用户界面的一种图形格式。1999年由万维网联盟发布。于2013年成为W3C推荐标准。 SVG有哪些优势 SVG 可被非常多的工具读取和修改 SVG 与JPE
created() { this.title = this.readFile("../../../static/images/雷达.svg"); console.log(this.title,"svg文件读取"); var newSvg=this.title.replace(/#(?:[0-9a-fA-F]{6})/, "#f1f1f1"); console.lo...
今天遇到一个项目中使用纯色图标的问题,用字体麻烦用图片low,所以就想直接用svg,毕竟只有一两个图标。 第一想法是用 DataURI,然后想到了之前 CSS-tricks 的文章,翻了下做下汇总: 不建议把 svg base64 来用 base64 本身浏览器解码也会消耗一定的资源 svg base64 后反而会变大 解决方案: 压缩 svg 文件,使用 SVGO 或者 SV...
需要将端上传过来的svg文件解析为字符串,然后再生成jpeg格式图片,再将图片Base64格式进行使用首先引入如下以来。版本一定按照这个来,高版本会出现各种类丢失的问题。 再就是工具类代码 可以看到生成了base64字符串 进行化后能够复原出图片
换链接:https://www.sojson.com/image2base64.html 2、使用两者区别 (1)使用一个63.8k的svg与使用base64之后的两个文件 a、使用svg b、使用base64 (2)使用一个225k的svg与使用base64之后的两个文件 a、使用svg b、使用base64 3、svgbase64有什么好处吗? (1)减少http
EasyQRCodeJS-NodeJS EasyQRCodeJS-NodeJS is a NodeJS server side javascript QRCode image(PNG/JPEG/SVG/Base64 data url) generator. Support setting Dot style, Logo, Background image, Colorful, Title and more. Support binary(hex) data mode. EasyQRCodeJS-NodeJS 是一个 NodeJS 环境下的服务端 JavaScript QRCode 图片(PNG/JPEG/SVG/Base64 data url)生成模块。支持点状风格,Logo,背景图片,规则色彩控制,标题等设置。支持二进制数据模式。 Table of contents EasyQRCode
随时随地将SVG换为base64 如果像我一样,在开发时使用了大量的SVG,则可能已经到了需要将SVG用作背景图像或嵌入到javascript文件中的地步。 唯一的方法是将SVG文件换为base64字符串,然后在需要时使用它。 该软件包正是这样做的-将SVG换为base64。 该软件包可在浏览器和Node环境中使用。 请继续阅读以了解操作方法。 npm i svg64 yarn add svg64 只需下载此存储库并使用dist文件夹中的文件 或从unpkg.com取消设置 < script src =" https://unpkg.com/svg64 " > </ script > 在浏览器中: // This is your SVG DOM element const svg = document . getElementByI // 找到页面上面的svg元素 const svg = document.getElementById('svg'); // 将整个 document 对象序列化为一个 XML 字符串 const s = new XMLSerializer().serializeToString(svg); // 通过window.btoa() 方法用于创建一个 base-64 编码字符串 function getBase64Image(img,width,height) { var canvas = document.createElement("canvas"); canvas.width = width ? width : img.width; canvas.h... 1. 安装SVG-Blob:`npm install svg-blob` 2. 在你的代码中引入SVG-Blob:`import { SVGBlob } from 'svg-blob'` 3. 使用SVGBlob类的toBlob()方法将SVG字符串换为Blob对象: const svgString = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"><rect x="10" y="10" width="100" height="100" fill="red"/></svg>'; const blob = new SVGBlob(svgString); const blobUrl = URL.createObjectURL(blob); 4. 最后,你可以使用HTML5的`download`属性下载Blob对象作为.svg图片: const link = document.createElement('a'); link.download = 'my-image.svg'; link.href = blobUrl; link.click(); 这样,你就可以将SVG字符串保存为.svg图片了。 ![烧烤](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmc+CiAgPHRpdGxlPmJhYmllLXN2ZzwvdGl0bGU+CiAgPHBhdGggZD0iTTUxLDE0LjJDNTEuNSwxMy42IDUxLjUsMTAuNCA1MSwxMC40QzUxLDkuMiA1MSw4LjUgNTUsOC41QzUxLDcuMiA1MSw3LjQgNTEsNy40QzUxLDYuOCA1MSw2LjIgNTUsNi4yQzUxLDUuMiA1MSw1LjUgNTEsNS41QzUxLDUuNSA1MSw1LjIgNTUsNS4yQzUxLDUuMiA1MSw1LjEgNTIsNS4yQzUxLDUuNSA1MSw1LjUgNTMsNi4yQzUxLDYuOCA1MSw3LjQgNTIsOC41QzUxLDguNSA1MSw5LjIgNTEsMTAuNApNMTAuNCw0NS4zQzEwLjQsNDIuNSAxMC40LDQwLjIgMTAuNCw0MC4yQzEwLjQsMzkuNyAxMC40LDM4LjggMTAuNCwzOC44QzEwLjQsMzcuNiAxMC40LDM3LjMgMTAuNCwzNy4xQzEwLjQsMzYuNiAxMC40LDM2LjcgMTAuNCwzNi4yQzEwLjQsMzUuNiAxMC40LDM1LjQgMTAuNCwzNS4yQzEwLjQsMzQuNyAxMC40LDM0LjcgMTAuNCwzNC4zQzEwLjQsMzMuMiAxMC40LDMzLjEgMTAuNCwzMi4yQzEwLjQsMzIuMiAxMC40LDMxLjkgMTAuNCwzMS45QzEwLjQsMzEuNiAxMC40LDMxLjMgMTAuNCwzMC44QzEwLjQsMzAuMiAxMC40LDI5LjggMTAuNCwyOS4zQzEwLjQsMjguNiAxMC40LDI4LjIgMTAuNCwyNy45QzEwLjQsMjYuNiAxMC40LDI2LjcgMTAuNCwyNi4yQzEwL
从svg转base64 再到字符串编码 不正经的kimol君: 放弃不难,但坚持一定很酷!