javascript - 使用 safari 在 Canvas 中绘制包含 html 的 svg

标签 javascript canvas svg safari

我正在尝试为网站创建一些动态创建页面的缩略图,我找到了一个解决方案,方法是在 svg 中添加 html,然后我在 Canvas 内的图像上绘制图像,然后在绘制图像后调整大小.

此解决方案适用于 firefox 和 chrome,但不适用于 safari,svg 似乎没有绘制我只是得到一个空白页面。即使我 try catch 并且我在网上找不到解决方案,我也没有收到任何错误。

我的html只是一个带有 Canvas 的基本测试页面,我试图在头部添加一个meta标签

<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />

但是也没用。

这是我写的代码:

var canvas = document.getElementById('canvasTest'),
            context = canvas.getContext('2d');

            var data = "<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'>" +
                 "<foreignObject width='100%' height='100%'>" +
                   "<div xmlns='http://www.w3.org/1999/xhtml' style='font-size:40px'>" +
                     "<div>TEST<span>TEST</span></div>" +
                   "</div>" +
                 "</foreignObject>" +
               "</svg>"
            ;

            var DOMURL = self.URL || self.webkitURL || self;
            var img = new Image();                                                                              

            try {
                var svg = new Blob([data], {type: "image/svg+xml;charset=utf-8"});                      
            } catch(e) {                    
                window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
                console.log(window.BlobBuilder);

                if(e.name == 'TypeError' && window.BlobBuilder){
                    var bb = new BlobBuilder();
                    bb.append(data);
                    var svg = bb.getBlob("image/svg+xml;charset=utf-8");
                } else if(e.name == "InvalidStateError") {                      
                    var svg = new Blob(data, {type : "image/svg+xml;charset=utf-8"});
                } else {

                }
            }               

            var url = DOMURL.createObjectURL(svg);              

            img.onload = function() {                   
                    context.drawImage(img, 100, 100);                                       
            };

            img.src = url;
            DOMURL.revokeObjectURL(url);

            context.translate(canvas.width / 2, canvas.height / 2);
            context.scale(0.4, 0.4);

Safari 可以使用 Blob 构造函数,因此它不会陷入困境。似乎问题出在我传递 svg 引用 (img.src = url) 时,但我不知道该怎么做,如果有人有一些想法或解决方案,那就太好了。

编辑:safari 的控制台输出

Blob:Blob {size=232, type="image/svg+xml;charset=utf-8", webkitSlice}

网址:blob:http://myPage.com/96fb502f-46bb-492b-af35-5313bb39bd31

最佳答案

基本上解决方案是将 mime 类型(data:image/svg+xml) 放在包含 svg 的变量中,这样你就不需要再使用 blob,然后用 svg 设置 img src在将其绘制到 Canvas 之前。

var canvas = document.getElementById('canvasTest'),
            context = canvas.getContext('2d');

            var data = "data:image/svg+xml,"+"<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'>" +
                 "<foreignObject width='100%' height='100%'>" +
                   "<div xmlns='http://www.w3.org/1999/xhtml' style='font-size:40px'>" +
                     "<div xmlns='http://www.w3.org/1999/xhtml'>aaaa<span>aaaa</span></div>" +
                   "</div>" +
                 "</foreignObject>" +
               "</svg>"
            ;

            var img = new Image();

            img.src = data;

            img.onload = function() {
                context.drawImage(img, 100, 100);                   
            };

            context.translate(canvas.width / 2, canvas.height / 2);
            context.scale(0.4, 0.4);

关于javascript - 使用 safari 在 Canvas 中绘制包含 html 的 svg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21049179/

相关文章:

javascript - Angular : Add ngClick from js

html - 绝对定位的 DIV 内部的 SVG 绘图区域缩小

windows - Google Maps api v3 + canvas + chrome 导致 youtube 视频和 map 元素出现黑框

Javascript:计算平均速度或速度

javascript - Fabric Js Canvas 中剪辑部分中的多个对象

html - 我将如何在 SVG 中使用内联 HTML 元素?

css - SVG 从中心重新缩放圆

javascript - *ng如果 Angular 没有绑​​定正确的值

javascript - 动态调用 JS 文件加载到经典的 ASP 应用程序中 - 我们的开发人员想要实现什么目标?

javascript - 根据区域调用javascript函数