获取 HTML 并使用 rasterizehtml 在画布中生成图像 - 动态源图像

Posted

技术标签:

【中文标题】获取 HTML 并使用 rasterizehtml 在画布中生成图像 - 动态源图像【英文标题】:get HTML and generate an IMAGE in canvas with rasterizehtml - dynamic source image 【发布时间】:2021-06-22 16:31:41 【问题描述】:

我尝试为画布/图像生成多层 html 内容

    底层是图片 顶层其他内容

这是我的 JS 小提琴: https://jsfiddle.net/rako87/b3qhLm5u/7/

我的问题是,当我更改底层图像源时,它不会反映在渲染的画布上(始终渲染原始 HTML 值)

当我用反映在渲染的 IMG 上的 JS 更改 img src 时,我怎么能做到这一点??

谢谢!

JS:

// IMG dropdown select
var selectBox = document.getElementById('selectBox');
var theImg = document.getElementById('theImg');

selectBox.addEventListener('change', function() 
  theImg.src = this.options[this.selectedIndex].value
, false);

// Generate IMG to canvas with button click
var canvas = document.getElementById("canvas"),
  context = canvas.getContext('2d'),
  html_container = document.getElementById("thehtml"),
  html = html_container.innerHTML;

$(function()  
        $("#btnGEN").click(function()  
            rasterizeHTML.drawHTML(html).then(function (renderResult) 
                context.drawImage(renderResult.image, 0, 0);
            );
        );
    ); 

【问题讨论】:

为什么? html2canvas.hertzen.com 不正是你想要的吗? 为了回答您的问题,可能有几种方法可以做您想做的事情...考虑创建一个“新上下文”,然后将所有内容重新绘制到该新上下文中 - 如果我理解问题。这意味着您会将 var canvas = ..., context = ..., html_container = ..., html = ... 移动到 jquery .click 事件侦听器中。 奇怪的 rasterizeHTML 没有在你的脚本中定义,在 jfiddle 中工作,但是当我尝试在 SO 中添加一个可运行的代码 sn-p 时,它说它没有定义。 我在 jsFiddle 的“资源”下添加了 rasterizehtml.js。 【参考方案1】:

我不知道下面的代码 sn-p 是怎么回事(错误:rasterizeHTML.allinone.js:11 Uncaught (in promise) TypeError: Cannot read property 'open' of null),但是当我在你的 jsfiddle 中使用代码的 javascript 部分时,我认为它完成了你想要的。

// IMG dropdown select
var selectBox = document.getElementById('selectBox');
var theImg = document.getElementById('theImg');

selectBox.addEventListener('change', function() 
  theImg.src = this.options[this.selectedIndex].value
, false);


$(function() 
        $("#btnGEN").click(function() 
          // Generate IMG to canvas with button click
            var canvas = document.getElementById("canvas"),
            context = canvas.getContext('2d'),
            html_container = document.getElementById("thehtml"),
            html = html_container.innerHTML;
            rasterizeHTML.drawHTML(html).then(function (renderResult) 
                context.drawImage(renderResult.image, 0, 0);
            );
        );
    ); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rasterizehtml/1.3.0/rasterizeHTML.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rasterizehtml/1.3.0/rasterizeHTML.allinone.js"></script>
<table style="width:100%">
  <tr>
    <th >HTML</th>
    <th >Rendered IMG</th> 
  </tr>
  <tr>
    <td>
    
    <p>1.Select source img: </p>
    <select id="selectBox">
        <option value="https://dummyimage.com/200x200/1d83b3/ffffff.jpg&text=+">Blue</option>
        <option value="https://dummyimage.com/200x200/1f995a/ffffff.jpg&text=+">Green</option>
    </select>   <br/><br/>
    
    <p>2.Click Button to Generate img to canvas: </p>
    <button type="button" id="btnGEN" >Generate</button><br/>

    <br/>
    

   <div id="thehtml" style="position:relative;">
      <style>
          .test 
            font-size: 22px;    
          
      </style>
    
   
      <div style="z-index:0; position:absolute;">
        <img id="theImg" src="https://dummyimage.com/200x200/1d83b3/ffffff.jpg&text=+">
      </div>
      
      <div style="z-index:1; position:absolute;">
        <h2> TEST TEXT </h2>
      </div>
      
    </div>

  
    </td>
    <td><canvas id="canvas"   style="border: 1px solid black;"></canvas></td>
  </tr>
</table>

【讨论】:

以上是关于获取 HTML 并使用 rasterizehtml 在画布中生成图像 - 动态源图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 将 @html.raw div HTML 保存并获取到数据库中并获取

单击 HTML 表格并获取行号(使用 Javascript,而不是 jQuery)

使用 PHP 获取图像文件路径并以 HTML 显示

循环遍历每个 HTML 表列并使用 jQuery 获取数据

将数据从 javascript 发送到 html 并使用 php 获取

(绝对有用)iOS获取UUID,并使用keychain存储