【问题标题】:Append div in canvas and create DataURL not working在画布中附加 div 并创建 DataURL 不起作用
【发布时间】:2016-11-24 14:55:42
【问题描述】:

我需要显示一个图像,在这个图像上方我需要放置 2 个 div,一个 div 包含图像,另一个 div 包含文本,并且需要将所有这三个组合以创建最终图像并将最终图像存储在数据库/服务器,我正在使用画布来实现这一点,我的项目在 Ionic/AngularJS 中,我无法在没有 div 的情况下直接使用 img 和 text,因为我还需要拖放并调整此 img 和文本的大小,而这在不使用 div 的情况下是无法实现的。

这是我的 html 代码。

<div class="item item-image" ng-repeat="picture in product.images" id="mainwall">
     <img ng-src="{{wallMainImage}}" ng-init="setInitSrc(picture.src)" width="330" height="400" crossOrigin="Anonymous" id="preview1" class="wall-image"/>
     <div id="wall-design" draggable style="position: absolute;">
        <img ng-src="{{walldesign}}" />
     </div>
     <div id="wall-text" draggable>
        <p>{{wallText}}</p>
     </div>
</div>

我在最后定义了画布元素

<canvas id="tempCanvas" style="position: relative;"></canvas>

在保存按钮单击的控制器中,我正在调用一个具有以下内容的函数。

var canvas = document.getElementById('tempCanvas');
var context = canvas.getContext('2d');    
var source =  document.getElementById("preview1");
var width = source.naturalWidth; 
var height = source.naturalHeight; 
canvas.width = width;
canvas.height = height;              
var canvasDiv = document.getElementById('wall-design');
canvas.appendChild(canvasDiv);
console.log("canvas", canvas)
context.drawImage(source,0,0, width, height);    
var dataURL = canvas.toDataURL("image/png");
$timeout( function(){
   $scope.wallMainImage = dataURL;
   if ($scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest') {
       $scope.$apply();
   }
}, 200);

我得到了一个我想要的精确画布控制台,如下所示

<canvas id="tempCanvas" style="position: relative;" width="700" height="519">
   <div id="wall-design" draggable="" style="position: absolute; height: 153px; width: 54px; left: 128px; top: 105px;" class="ui-draggable ui-draggable-handle ui-resizable">
        <img ng-src="images/designs/3.jpg" src="images/designs/3.jpg">
        <div class="ui-resizable-handle ui-resizable-e" style="z-index: 90;"></div>
        <div class="ui-resizable-handle ui-resizable-s" style="z-index: 90;"></div>
        <div class="ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se" style="z-index: 90;"></div>
   </div></canvas>

我还得到了一个非常长的编码字母的 datURL,最后我得到了一个只有起始图像和其他需要在此图像上方显示的图像没有显示的图像

请告诉我..我做错了什么

提前谢谢..

【问题讨论】:

  • 你不能在画布元素中附加任何东西,你可以在上面画画。有一些库可以解析 html 并将其转换为画布绘图,最著名的是 html2canvas。
  • 嗨@Kaiido,我检查了html2canvas,发现它用于拍摄网页的“截图”,但这不是我的要求,因为我们可以使用画布的上下文进行drawImage或fillText,我只是想要类似的东西,可以在画布上附加div,请提出一些建议
  • 仔细阅读项目主页,它不截图,而是解析html并使用canvas方法绘制。您不能使用 drawImage 绘制 html 元素,只能使用视觉媒体。唯一高度受限的其他方法是将您的 html 附加到 svg 中(外部资源需要编码为 dataURI)并绘制此 svg。但这真的很hacky,根本不稳定,会使大多数浏览器污染您的画布,而且,这不是一个好主意。所以坚持现有的,只需在你的容器上调用 html2Canvas 就可以了。

标签: html angularjs canvas ionic-framework todataurl


【解决方案1】:

我在这里给出解决方案,这在我的情况下有效

html2canvas(angular.element('#wallimageid'), {
      onrendered: function(canvas) {
         var img = canvas.toDataURL("image/png")
         console.log("img", img);
         $scope.savedGalleryImage = img;
      }, 
      useCORS:true
})

我正在使用 angularjs 指令,如果有人想使用 jquery 执行此操作,只需将 angular.element 替换为 $

我使用 useCORS 来使用我们本地存储中不可用的图像 src,而不是来自某个站点。

用户还需要下载 html2canvas,我已经使用这个命令通过 git clone 下载了这个

git clone --recursive git://github.com/niklasvh/html2canvas.git

并在html文件中指定

<script src="js/lib/html2canvas/dist/html2canvas.js"></script>

这里使用你自己的路径

谢谢

【讨论】:

  • useCORS: true 对此赞不绝口!!!即使启用了 CORS 并且画布没有被污染,我也有一个没有图像的 PDF 加载。所有bcoz这个标志都不见了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2014-04-16
相关资源
最近更新 更多