Javascript 为什么将画布保存为jpeg或pdf结果黑色图像?

Javascript 为什么将画布保存为jpeg或pdf结果黑色图像?,javascript,pdf,canvas,html5-canvas,Javascript,Pdf,Canvas,Html5 Canvas,我有以下代码: 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

我有以下代码:

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");
      }
代码工作“正确”预期的问题,它不下载图像,但黑屏。有一个正在工作的JSFIDLE示例:


您能帮助我理解它不能正常工作的可能原因吗?

在调用
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';

由于安全错误(图像属于不同的域),它无法在小提琴中工作。请在您的网页中试用。

在调用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';

由于安全错误(图像属于不同的域),它无法在小提琴中工作。请在您的网页中试用。

在调用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';

由于安全错误(图像属于不同的域),它无法在小提琴中工作。请在您的网页中试用。

在调用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';

由于安全错误(图像属于不同的域),它无法在小提琴中工作。请在您的网页中试用。

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

画布上的“跨域”绘图是您获得全黑文件的原因…#myCanvas没有实际创建您的dataURL,因为浏览器不允许它。

解决方法是将图像托管在与网页相同的域上。然后,浏览器将允许使用canvas.toDataURL
,您的图像将按应有的方式显示

示例代码和演示:

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var cw=画布宽度;
var ch=画布高度;
var imgData;
var img=新图像();
img.crossOrigin='anonymous';
img.onload=启动;
img.src=”https://dl.dropboxusercontent.com/u/139992952/multple/canberra_hero_image.jpg";
函数start(){
canvas.width=img.width;
canvas.height=img.height;
ctx.drawImage(img,0,0);
imgData=canvas.toDataURL('image/jpeg',1.0);
$('printJPG')。在('click',saveAsJPG');
}
函数saveAsJPG(){
var pom=document.createElement('a');
setAttribute('href',imgData);
setAttribute('download','img.jpg');
if(document.createEvent){
var event=document.createEvent('MouseEvents');
initEvent('click',true,true);
pom.调度事件(事件);
}否则{
pom.click();
}
}
body{背景色:象牙;}
#画布{边框:1px纯红;}


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

画布上的“跨域”绘图是您获得全黑文件的原因…#myCanvas没有实际创建您的dataURL,因为浏览器不允许它。

解决方法是将图像托管在与网页相同的域上。然后,浏览器将允许使用canvas.toDataURL,您的图像将按应有的方式显示

示例代码和演示:

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var cw=画布宽度;
var ch=画布高度;
var imgData;
var img=新图像();
img.crossOrigin='anonymous';
img.onload=启动;
img.src=”https://dl.dropboxusercontent.com/u/139992952/multple/canberra_hero_image.jpg";
函数start(){
canvas.width=img.width;
canvas.height=img.height;
ctx.drawImage(img,0,0);
imgData=canvas.toDataURL('image/jpeg',1.0);
$('printJPG')。在('click',saveAsJPG');
}
函数saveAsJPG(){
var pom=document.createElement('a');
setAttribute('href',imgData);
setAttribute('download','img.jpg');
if(document.createEvent){
var event=document.createEvent('MouseEvents');
initEvent('click',true,true);
pom.调度事件(事件);
}否则{
pom.click();
}
}
body{背景色:象牙;}
#画布{边框:1px纯红;}


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

画布上的“跨域”绘图是您获得全黑文件的原因…#myCanvas没有实际创建您的dataURL,因为浏览器不允许它。

解决方法是将图像托管在与网页相同的域上。然后,浏览器将允许使用canvas.toDataURL,您的图像将按应有的方式显示

示例代码和演示:

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var cw=画布宽度;
var ch=画布高度;
var imgData;
var img=新图像();
img.crossOrigin='anonymous';
img.onload=启动;
img.src=”https://dl.dropboxusercontent.com/u/139992952/multple/canberra_hero_image.jpg";
函数start(){
canvas.width=img.width;
canvas.height=img.height;
ctx.drawImage(img,0,0);
imgData=canvas.toDataURL('image/jpeg',1.0);
$('printJPG')。在('click',saveAsJPG');
}
函数saveAsJPG(){
var pom=document.crea