添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
@font-face{ font-family: huxiaobo-gdh; src: url(http://xxxx/huxiaobo-gdh.woff) format('woff');
` 科普一下image生成base64, img.crossOrigin = 'Anonymous'; 这句话加上可跨域。当然图片本身最好设置了跨域。
          let canvas = document.createElement('canvas');
                let img = new Image()
                img.crossOrigin = 'Anonymous';
                let ctx = canvas.getContext('2d');
                img.src = src;
                img.onload = function () {
                    canvas.width = img.width;
                    canvas.height = img.height;
                    ctx.drawImage(img, 0, 0);
                    let url =canvas.toDataURL();
 

纯前端实现方式

html2canvas

或许这个是前端生成方式中最火的一个,很多公司网站都用这个插件进行截图。一开始他是不支持svg的,在0.5版本之后加入了svg的支持功能。 0.5之前的版本需要使用借助第三方一下组件canvg 或者是 faricjs。 虽然他支持了但是效果并不理想,一些含有字体样式的svg,生成不出来正确的svg,例 如 https://jsfiddle.net/AndreLovichi/571t86u4/ 试过其他的插件方法,我知道我不能放弃html2canvas,终于试验中找到了解决办法。参考 https://jsfiddle.net/571t86u4/93/ 原理就是讲字体转成dataURI放到svg里面。

const request = new XMLHttpRequest(); request.open("get", './xxx/demo.woff'); request.responseType = "blob"; request.onloadend = () => { let svgStyle = ` @font-face { font-family: "${item.name}"; src: url(${reader.result}) format('woff'); // 插入到svg内 let svg = `<svg> <style> ${svgStyle} </style> ....此处省略一万字 </svg>` html2canvas($('.preview')[0]).then(function(canvas) { let url = canvas.toDataURL();

缺点:假如svg含有多个字体。每个都转baseURI,老慢了。。并且在微信小程序上直接卡掉。吼吼吼。。。。。。

简单粗暴的方式

   `data:image/svg+xml;base64,'+ btoa(unescape(encodeURIComponent(${svg}))) `
   `DOMURL.createObjectURL(${svg})`
 

然后利用canvas,渲染生成base64,事实证明不好使。含有特殊字体生成图片不显示。

svg-to-image 字体不出现,适合简单需求

字体转svg

text-to-svg const textToSVG = TextToSVG.loadSync('/fonts/Noto-Sans.otf'); const svg = textToSVG.getSVG('hello'); 就像上面写的这样,需要load一下字体,把你想转的字体转成path,然后根据样式,再插入到svg里面,置于插入回到svg,最后生成你想要的格式和结果,需要你慢慢研究,相当复杂的计算。然后配合前端html2canvas 等任何插件或者后端都可以实现svg转png了。

缺点:不简单,虽然我们也在使用这种方式,需要花点时间把生成好的path放回到svg里面,到时候你可以用snap类似的插件

后端NODEJS实现方式

node端整体分为phantomjschromium headless这两大分支。 大家都知道phantomjs 已经没人维护了,性能比chromium headless差个等级,我个人建议用后者。

phantomjs 类插件

svg2png https://github.com/domenic/svg2png

缺点:无法使用独立字体,可以配合上面的text-to-svg使用。

phantom https://github.com/amir20/phantomjs-node

你妹的起个名字就叫phantom,真的会让人误解。他的优点就是node封装的phantom,可以直接调用,创造属于你的DIY let { svg, width, height } = req.body

        let html = `
            <!DOCTYPE HTML>
                    <meta charset="utf-8">
                    <title>Shell</title>
                    <link rel="stylesheet" href="./font.css">
                </head>
                <style>
                    body,html{
                        background: #333333;
                        margin: 0;
                        width: 100%;
                        height:100%;
                        padding: 0px;
                        font-weight: normal;
                        -webkit-touch-callout: none;
                        -webkit-user-select: none;
                    #Viewport {
                        position:relative;
                        width:100%;
                        height:100%;
                </style>
                    <div id="Viewport" style="display:inline-block;">
                        ${svg}
                </body>
            </html>
        const instance = await phantom.create()
        const page = await instance.createPage()
        const fileName = uuid() + '.html'
        await writeFile(fileName, html, 'utf8')
        const status = await page.open(fileName)
        let viewportSize = { width: Number(width), height: Number(height) }
         await page.evaluate(function () {
         var w = document.querySelector(".ks-canvas-container").getAttribute('width');
         var h = document.querySelector(".ks-canvas-container").getAttribute('height');
         return {
             width: Number(w),
             height: Number(h)
         }).then(function (svgInfo) {
             viewportSize = svgInfo;
         });*/
        await page
            .property('viewportSize', viewportSize)
            .then(function() {})
        await page
            .property('clipRect', { x: 0, y: 0, ...viewportSize })
            .then(function() {})
        const base64Data = await page.renderBase64('PNG')
 

chromium headless 类插件

convert-svg-to-png https://github.com/NotNinja/convert-svg/tree/master/packages/convert-svg-to-png

内部实际用的puppeteer,目前稍微有个小bug,我已经联系了作者。不过问题不大,我目前用着最好用的。

       // 将这段style插入到svg里面,不需要转baseURI 
	   // <svg><style>@fant-face {xxxxxxxxxx} ……….. …… 
	   let svgStyle = `
			@font-face { font-family: "demo";
			src: url(xxxx/www/demo.woff) format('woff');
		// 请求
		fetch('http://XXXXXX/convert',
				method: 'POST',
				headers: {
				'Accept-Charset': 'utf-8', 
				'Accept': 'application/json;charset=utf-8',
				'Content-Type': 'application/json;charset=utf-8' 
				body:JSON.stringify({
					svg: $('.preview').html()
			}).then((response) => { 
				return response.json();  
			}) .then(data => {
    // node 端
    app.post('/convert', async(req, res) => {
        const png = await convert(req.body.svg);
        res.set('Content-Type', 'image/png');
        res.send(png);
 

其他的插件我就不介绍了svg-to-img。目前试着不大好用,主要还是字体生成的原因。

svg转png真是个好傻的活,花费了很长时间,可能会有人说用java,那你才傻,java那个包旧的想拉屎。 建议纯前端生成的话用html2canvas,时间充裕讲究性能,用text-to-svg转一下。 后端用convert-svg-to-png。 我个人更建议后端生成,缺点也是很显著的,占用带宽。

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...
tag: Web; JavaScript; SVG; DOM; 动画 SVG 最近在项目中遇到了「带动画 SVG 图标」与 「image」标签结合使用的场景,使用过程中发现水还是有点深,因此整理出来,供有相似场景的童鞋以参考。 我们这里有一个的带动画 SVG 文件 这是一个水波纹效果的 SVG,动画时长是固定的,但是我们希望不同的标记动画的播放时长可以略有不同,进而产生错落交错的感觉。...
其实只是做了简单封装,可以方便进行批量换. 获取Svg对象坐标的代码请看:根据svg节点对象类型和路径值换坐标值, DrawingColor方法是进行颜色填充的. /// <summary> /// svg文件换为图片 /// </summary> /// <param name="...
要在项目中使用svg-to-img,请运行: npm install svg-to-img -S 注意:安装svg-to-img时,它将下载保证可与该库一起使用的Chromium的最新版本(〜170Mb Mac,〜282Mb Linux,〜280Mb Win)。 如果您打算在Debian上运行svg-to-img,则需要手动安装以下依赖项: #! /bin/bash apt-get update apt-get install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \ libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk
1.情景展示   闲来无事的时候,发现chrome扩展程序里面有图像,本想下载下来,却发现文件格式是svg格式,如何将svg文件改成图片格式? chrome-extension://jlgkpaicikihijadgifklkbpdajbkhjo/image/rating/1-stars.svg 2.解决方案   第一,JavaScript文件。 (function...
SVG 提供了沿任意路径绘制文本的功能,我需要在我的Chord Snip附加组件中执行此操作,但我没有任何方法可以获取生成的 SVG 并创建一个图像,Google Sheets 可以将其用作嵌入图像。 理想情况下,我想使用浏览器来呈现 SVG 而不是 canv 使用画布将svg换为png或jpg Install npm install --save git+https://github.com/anzerr/svg.to.img.git npm install --save @anzerr/svg.to.img Example const convert = require ( 'svg.to.img' ) , fs = require ( 'fs.promisify' ) ; convert ( './test/1.svg' , { width : 100 , height : 100 } ) . then ( ( res ) => { return fs . writeFile ( '1.png' , res ) ; } ) ; https://image.online-convert.com/convert-to-svg https://stackoverflow.com/questions/3975499/convert-svg-to-image-jpeg-png-etc-in-the-browser https://stackoverflo... async function svg2png(svg, png) { const image = await loadImage(svg) const canvas = createCanvas(image.width, image.height) const ctx = canvas.getContext('2d') ctx.drawImage(image, 0, 0) const buffer = canvas.toBuffer() fs.writeFileSync(png, buffer) svg2png('input.svg', 'output.png') 此代码将“input.svg”文件换为“output.png”文件。 挂过科的茴香 How to Fix Error javalangUnsatisfiedLinkError orgapachehadoopionativeioNativeIOWindows | Saturn Cloud Blog 10 月前