[英]javascript: SVG from file input to Blob to imageUrl returning weird results
我有一個文件輸入,其中必須將所選文件轉換為圖像 url,以便我可以將其添加到 canvas。
我已經發現 SVG 是一個異常,因此我需要先將其轉換為 Blob,然后再將其轉換為圖像 Url。將其轉換為 Blob 似乎工作正常,但將其轉換為 url 會返回意外結果。
相關代碼:
function initiate() { var canvas = $("#canvas").get(0); var context = canvas.getContext("2d"); var img = new Image(); var imageSrcUrl; img.onload = function() { URL.revokeObjectURL(imageSrcUrl), {once: true} context.drawImage( img, 0, 0, img.width, img.height, 0, 0 ); } var extension = $("#logo").get(0).files[0].name.split('.').pop().toLowerCase(); if(extension == 'svg') { var reader = new FileReader(); reader.onload = function() { console.log(reader.result); var blob = new Blob([reader.result.toString()], {type: 'image/svg+xml'}); console.log(blob); imageSrcUrl = URL.createObjectURL(blob); console.log(imageSrcUrl); img.src = imageSrcUrl; }; reader.readAsText($("#logo").get(0).files[0]); } else { img.src = URL.createObjectURL( $("#logo").get(0).files[0] ); } }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> <form id="form"> Select file here <input type="file" id="logo"> </form> <br><br> Canvas goes here <canvas width="400" height="200" id="canvas"></canvas> <br><br> <button onclick="initiate();">Get svg into canvas</button>
控制台日志:
我錯過了什么或做錯了什么嗎? 我從https://dev.to/benjaminblack/using-a-string-of-svg-as-an-image-source-8mo得到了方法
謝謝!
您已指定dx
和dy
值。 .
這些值可用於在 canvas 上渲染之前選擇像素圖像的區域。
這些 arguments 不適用於svg
圖像。
將 drawImage arguments 更改為:
context.drawImage(
img,
0,
0,
img.width,
img.height
);
function initiate() { var canvas = $("#canvas").get(0); var context = canvas.getContext("2d"); var img = new Image(); var imageSrcUrl; img.onload = function() { URL.revokeObjectURL(imageSrcUrl), {once: true} context.drawImage( img, 0, 0, img.width, img.height ); } var extension = $("#logo").get(0).files[0].name.split('.').pop().toLowerCase(); if(extension == 'svg') { var reader = new FileReader(); reader.onload = function() { console.log(reader.result); var blob = new Blob([reader.result.toString()], {type: 'image/svg+xml'}); console.log(blob); imageSrcUrl = URL.createObjectURL(blob); console.log(imageSrcUrl); img.src = imageSrcUrl; }; reader.readAsText($("#logo").get(0).files[0]); } else { img.src = URL.createObjectURL( $("#logo").get(0).files[0] ); } }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> <form id="form"> Select file here <input type="file" id="logo"> </form> <br><br> Canvas goes here <canvas width="400" height="200" id="canvas"></canvas> <br><br> <button onclick="initiate();">Get svg into canvas</button>
上面的代碼片段可能不適用於 svgs 缺少命名空間屬性xmlns
和xmlns:xlink
。
function initiate() { var canvas = $("#canvas").get(0); var context = canvas.getContext("2d"); var img = new Image(); var imageSrcUrl; img.onload = function() { URL.revokeObjectURL(imageSrcUrl), { once: true } let width = img.width; let height = img.height; //adjust canvas width and height canvas.setAttribute('width', width); canvas.setAttribute('height', height) context.drawImage( img, 0, 0, width, height ); } var extension = $("#logo").get(0).files[0].name.split('.').pop().toLowerCase(); if (extension == 'svg') { var reader = new FileReader(); reader.onload = function() { //create svg fragment for sanitizing let svgCode = reader.result; let tmpSvgWrap = document.createElement('div'); let fragment = document.createRange().createContextualFragment(svgCode); tmpSvgWrap.appendChild(fragment); let svg = tmpSvgWrap.querySelector('svg'); //add xml namespace attributes svg.setAttribute("xmlns", "http://www.w3.org/2000/svg"); svg.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); var blob = new Blob([tmpSvgWrap.innerHTML], { type: 'image/svg+xml' }); //add delay for safari setTimeout(function() { imageSrcUrl = URL.createObjectURL(blob); img.src = imageSrcUrl; console.log('imageSrcUrl', imageSrcUrl) }, 100) }; reader.readAsText($("#logo").get(0).files[0]); } else { img.src = URL.createObjectURL( $("#logo").get(0).files[0] ); } }
canvas { max-height: 200px; border: 1px solid #ccc; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> <form id="form"> Select file here <input type="file" id="logo" onchange="initiate();"> <;-- <button type="button" onclick="initiate();">Get svg into canvas</button> --> </form> <p>Canvas goes here</p> <canvas width="400" height="200" id="canvas"></canvas>
上面的代碼片段通過Range.createContextualFragment()
方法創建片段來添加缺少的命名空間屬性
//create svg fragment for sanitizing
let svgCode = reader.result;
let tmpSvgWrap = document.createElement('div');
let fragment = document.createRange().createContextualFragment(svgCode);
tmpSvgWrap.appendChild(fragment);
let svg = tmpSvgWrap.querySelector('svg');
//add xml namespace attributes
svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
svg.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.