Как из строки сгенерировать png?

89
27 августа 2021, 04:00

Есть класс, который генерирует svg (строка). Дальше эту строку я вставляю в html. Потом генерирую png:

new Vue({ 
  el: '#app', 
  vuetify: new Vuetify(), 
  data() { 
    return { 
      expand: false, 
      svg: '', 
      result: [], 
      svgs: [ 
        '<svg width="400" height="400" viewBox="-30 -40 336.6666666666667 283.3333333333333" id="maker-svg" style="padding : 10px; display: none;" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"><g id="svgGroup" stroke-linecap="round" fill-rule="evenodd" font-size="13.333333333333334" stroke="#03a9f4" stroke-width="0.5mm" fill="rgba(3, 169, 244, 0.1)" style="stroke:#03a9f4;stroke-width:0.5mm;fill:rgba(3, 169, 244, 0.1)"><path d="M 23.333 223.333 L 73.333 23.333 L 173.333 23.333 L 223.333 223.333 L 23.333 223.333 Z" vector-effect="non-scaling-stroke"/><path d="M 173.333 23.333 L 173.333 13.333 L 223.333 13.333 L 223.333 223.333 L 223.333 233.333 L 23.333 233.333 L 23.333 223.333 L 23.333 13.333 L 73.333 13.333 L 73.333 23.333 L 13.333 23.333 L 13.333 223.333 L 23.333 223.333 L 23.333 13.333" id="gray" stroke="gray" style="stroke:gray" vector-effect="non-scaling-stroke"/><g id="captions"><text alignment-baseline="middle" text-anchor="middle" transform="rotate(0,123.333,246.667)" x="123.333" y="246.667">L: 200</text><text alignment-baseline="middle" text-anchor="middle" transform="rotate(0,198.333,0)" x="198.333" y="0">L1: 50</text><text alignment-baseline="middle" text-anchor="middle" transform="rotate(0,48.333,0)" x="48.333" y="0">L2: 50</text><text alignment-baseline="middle" text-anchor="middle" transform="rotate(270,0,123.333)" x="0" y="123.333">H: 200</text></g></g></svg>', 
        '<svg width="400" height="400" viewBox="-72.35 -10 694.6166666666667 1495.6166666666666" id="maker-svg" style="padding : 10px;" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"><g id="svgGroup" stroke-linecap="round" fill-rule="evenodd" font-size="83.13333333333333" stroke="#03a9f4" stroke-width="0.5mm" fill="rgba(3, 169, 244, 0.1)" style="stroke:#03a9f4;stroke-width:0.5mm;fill:rgba(3, 169, 244, 0.1)"><path d="M 145.483 1247 L 591.483 1247 L 591.483 0 L 145.483 0 L 145.483 1247 Z" vector-effect="non-scaling-stroke"/><path d="M 145.483 0 L 83.133 0 L 83.133 1247 L 145.483 1247 L 145.483 1309.35 L 591.483 1309.35 L 591.483 1247" id="gray" stroke="gray" style="stroke:gray" vector-effect="non-scaling-stroke"/><g id="captions"><text alignment-baseline="middle" text-anchor="middle" transform="rotate(0,368.483,1392.483)" x="368.483" y="1392.483">L: 446</text><text alignment-baseline="middle" text-anchor="middle" transform="rotate(270,0,623.5)" x="0" y="623.5">H: 1247</text></g></g></svg>', 
                '<svg width="400" height="400" viewBox="-30 -40 336.6666666666667 283.3333333333333" id="maker-svg" style="padding : 10px; display: none;" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"><g id="svgGroup" stroke-linecap="round" fill-rule="evenodd" font-size="13.333333333333334" stroke="#03a9f4" stroke-width="0.5mm" fill="rgba(3, 169, 244, 0.1)" style="stroke:#03a9f4;stroke-width:0.5mm;fill:rgba(3, 169, 244, 0.1)"><path d="M 23.333 223.333 L 73.333 23.333 L 173.333 23.333 L 223.333 223.333 L 23.333 223.333 Z" vector-effect="non-scaling-stroke"/><path d="M 173.333 23.333 L 173.333 13.333 L 223.333 13.333 L 223.333 223.333 L 223.333 233.333 L 23.333 233.333 L 23.333 223.333 L 23.333 13.333 L 73.333 13.333 L 73.333 23.333 L 13.333 23.333 L 13.333 223.333 L 23.333 223.333 L 23.333 13.333" id="gray" stroke="gray" style="stroke:gray" vector-effect="non-scaling-stroke"/><g id="captions"><text alignment-baseline="middle" text-anchor="middle" transform="rotate(0,123.333,246.667)" x="123.333" y="246.667">L: 200</text><text alignment-baseline="middle" text-anchor="middle" transform="rotate(0,198.333,0)" x="198.333" y="0">L1: 50</text><text alignment-baseline="middle" text-anchor="middle" transform="rotate(0,48.333,0)" x="48.333" y="0">L2: 50</text><text alignment-baseline="middle" text-anchor="middle" transform="rotate(270,0,123.333)" x="0" y="123.333">H: 200</text></g></g></svg>', 
      ], 
    } 
  }, 
 
  methods: { 
    generate() { 
       
      for (let i = 0; i < this.svgs.length; i++) { 
      setTimeout(() => { 
        this.svg = this.svgs[i]; 
        const doctype = '<?xml version="1.0" standalone="no"?>'; 
        const source = (new XMLSerializer()).serializeToString(d3.select('#svg-container svg').node()); 
        const blob = new Blob([doctype + source], { 
          type: 'image/svg+xml;charset=utf-8' 
        }); 
        const url = window.URL.createObjectURL(blob); 
        const img = d3.select(document.createElement('div')).append('img') 
          .attr('width', 400) 
          .attr('height', 400) 
          .node(); 
 
        img.onload = () => { 
          // Now that the image has loaded, put the image into a canvas element. 
          var canvas = d3.select(document.createElement('div')).append('canvas').node(); 
          canvas.width = 400; 
          canvas.height = 400; 
          var ctx = canvas.getContext('2d'); 
          ctx.drawImage(img, 0, 0); 
          var canvasUrl = canvas.toDataURL("image/png"); 
           
          console.log(canvasUrl); 
           
          this.result.push(canvasUrl); 
        } 
        img.src = url; 
        }, 0); 
      } 
       
      console.log(this.result); 
    }, 
  }, 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script> 
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet"> 
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet"> 
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet"> 
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script> 
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script> 
<div id="app"> 
  <template> 
    <v-app> 
      <v-content> 
        <v-btn 
          @click="generate" 
        > 
          Generate PNG 
        </v-btn> 
        <div id="svg-container" v-html="svg"> 
           
        </div> 
      </v-content> 
    </v-app> 
  </template> 
</div>

Результат без цикла:

Никак не получается сгенерировать в цикле. Подскажите, может необходим другой метод для генерации изображения из svg в png?

READ ALSO
Вернуть объект с измененным свойством - JS

Вернуть объект с измененным свойством - JS

Мне нужно найти элемент в объекте у которого есть определенное свойство , я это уже сделал вот таким кодом - result = thisstate

119
Два вопроса по редактору DraftJS

Два вопроса по редактору DraftJS

В react приложении сделан редактор DraftJSЕсть два вопроса:

117
Посоветуйте плагин выбора даты въезда и выезда из отеля на jquery

Посоветуйте плагин выбора даты въезда и выезда из отеля на jquery

Верстаю сайт отеля и нужно добавить плагин с выбором даты заезда и выезда, скажите пожалуйста, что это за плагин?

179