【问题标题】:Why saving canvas as jpeg or pdf result black image?为什么将画布保存为 jpeg 或 pdf 结果黑色图像?
【发布时间】:2015-05-04 20:45:30
【问题描述】:

我有以下代码:

var imgData;
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
var imageObj = new Image();

imageObj.onload = function() {
    context.drawImage(imageObj, 0, 0);
};
imgData = canvas.toDataURL("image/jpeg", 1.0);
imageObj.src = 'http://images.visitcanberra.com.au/images/canberra_hero_image.jpg';

当用户点击下载 JPG 或 PDF 文件时。 JPG下载代码如下:

function saveAsJPG(){
    var pom = document.createElement('a');
    pom.setAttribute('href', imgData);
    pom.setAttribute('download', 'img.jpg');

    if (document.createEvent) {
        var event = document.createEvent('MouseEvents');
        event.initEvent('click', true, true);
        pom.dispatchEvent(event);
    } else {
        pom.click();
    }
}

以下 PDF 代码:

function saveAsPDF(){
          var pdf = new jsPDF();        
          pdf.addImage(imgData, 'JPEG', 0, 0);
          pdf.save("download.pdf");
      }

代码工作“正确”预期问题是它不下载图像但黑屏。有工作的 JSFiddle 示例:https://jsfiddle.net/1c1o8wjx/

您能否帮助我了解它无法按预期工作的可能原因?

【问题讨论】:

    标签: javascript pdf canvas html5-canvas


    【解决方案1】:

    在调用canvas.toDataURL("image/jpeg", 1.0); 之前,您必须等待图像加载。请尝试以下操作:

    var imgData;
    var canvas = document.getElementById('myCanvas');
    var context = canvas.getContext('2d');
    var imageObj = new Image();
    
    imageObj.onload = function() {
        context.drawImage(imageObj, 0, 0);
        imgData = canvas.toDataURL("image/jpeg", 1.0);
    };
    imageObj.src = 'http://images.visitcanberra.com.au/images/canberra_hero_image.jpg';
    

    由于安全错误(图像属于不同的域),它无法正常工作。在您的网页中尝试一下。

    【讨论】:

      【解决方案2】:

      您正在从与网页域不同的域加载气球城市图像。出于安全原因,这种“跨域”图像绘制将导致浏览器“污染”画布。受污染的画布不允许使用.toDataURL 导出其内容。

      这种对画布的“跨域”绘图是您获得全黑文件的原因...#myCanvas 实际上并未创建您的 dataURL,因为浏览器不允许这样做。

      解决方法是将图片托管在与网页相同的域中。然后浏览器将允许canvas.toDataURL,并且您的图像将按原样显示。

      示例代码和演示:

      var canvas=document.getElementById("canvas");
      var ctx=canvas.getContext("2d");
      var cw=canvas.width;
      var ch=canvas.height;
      
      var imgData;
      var img=new Image();
      img.crossOrigin='anonymous';
      img.onload=start;
      img.src="https://dl.dropboxusercontent.com/u/139992952/multple/canberra_hero_image.jpg";
      function start(){
        canvas.width=img.width;
        canvas.height=img.height;
        ctx.drawImage(img,0,0);
        imgData=canvas.toDataURL('image/jpeg',1.0);
        $('#printJPG').on('click',saveAsJPG);
      }
      
      function saveAsJPG(){
        var pom = document.createElement('a');
        pom.setAttribute('href', imgData);
        pom.setAttribute('download', 'img.jpg');
      
        if (document.createEvent) {
          var event = document.createEvent('MouseEvents');
          event.initEvent('click', true, true);
          pom.dispatchEvent(event);
        } else {
          pom.click();
        }
      }
      body{ background-color: ivory; }
      #canvas{border:1px solid red;}
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
      <ul>
        <li><a href="#" id="printJPG">Print as JPG</a></li>
      </ul>    
      <canvas id="canvas" width=300 height=300></canvas>

      另请注意,Internet Explorer 当前不支持“下载”属性。

      【讨论】:

        猜你喜欢
        • 2017-05-28
        • 1970-01-01
        • 2016-01-28
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 2018-06-01
        • 1970-01-01
        • 2011-11-12
        相关资源
        最近更新 更多