在画布中附加div并创建DataURL不起作用

时间:2016-07-21 06:55:37

标签: html angularjs canvas ionic-framework todataurl

我需要显示图像,在此图像上方我需要放置2个div,一个包含图像的div和另一个div包含文本,并且需要将所有这三个组合起来创建最终图像并将此最终图像存储在数据库/服务器,我使用canvas实现这一点,我的项目是在Ionic / AngularJS,我没有div直接使用img和文本,因为我还需要拖放和调整这个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,最后我得到的图像只有起始图像和其他需要在图像上方显示的图像未显示

请通知我..我在哪里做错了

提前致谢..

1 个答案:

答案 0 :(得分: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>

这里使用您自己的路径

由于