我目前正在构建一个 HTML5 网络应用程序/Phonegap 本机应用程序,但我似乎无法弄清楚如何使用 canvas.toDataURL()
将我的画布保存为图像。有人可以帮帮我吗?
这是代码,它有什么问题?
//我的画布被命名为“canvasSignature”
JavaScript:
function putImage()
{
var canvas1 = document.getElementById("canvasSignature");
if (canvas1.getContext) {
var ctx = canvas1.getContext("2d");
var myImage = canvas1.toDataURL("image/png");
}
var imageElement = document.getElementById("MyPix");
imageElement.src = myImage;
}
HTML5:
<div id="createPNGButton">
<button onclick="putImage()">Save as Image</button>
</div>
.toDataURL()
捕获数据,然后使用window.location 将浏览器指向appname://[data url]
。在应用程序端,UIWebView 有一个委托方法,说明它是否应该加载页面。我监听 appname://
并在它进入时将其分解,拒绝页面加载并在本机字符串中捕获数据 url...您对实际 iOS/Objective C 代码的熟悉程度如何?
这是一些代码。没有任何错误。
var image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"); // here is the most important part because if you dont replace you will get a DOM 18 exception.
window.location.href=image; // it will save locally
此解决方案允许您更改下载文件的名称:
HTML:
<a id="link"></a>
JAVASCRIPT:
var link = document.getElementById('link');
link.setAttribute('download', 'MintyPaper.png');
link.setAttribute('href', canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"));
link.click();
你可以试试这个;创建一个虚拟的 HTML 锚点,然后从那里下载图像......
// Convert canvas to image
document.getElementById('btn-download').addEventListener("click", function(e) {
var canvas = document.querySelector('#my-canvas');
var dataURL = canvas.toDataURL("image/jpeg", 1.0);
downloadImage(dataURL, 'my-canvas.jpeg');
});
// Save | Download image
function downloadImage(data, filename = 'untitled.jpeg') {
var a = document.createElement('a');
a.href = data;
a.download = filename;
document.body.appendChild(a);
a.click();
}
您可以使用 canvas2image 提示下载。
我遇到了同样的问题,这是一个简单的示例,它既将图像添加到页面并强制浏览器下载它:
<html>
<head>
<script src="http://hongru.github.io/proj/canvas2image/canvas2image.js"></script>
<script>
function draw(){
var canvas = document.getElementById("thecanvas");
var ctx = canvas.getContext("2d");
ctx.fillStyle = "rgba(125, 46, 138, 0.5)";
ctx.fillRect(25,25,100,100);
ctx.fillStyle = "rgba( 0, 146, 38, 0.5)";
ctx.fillRect(58, 74, 125, 100);
}
function to_image(){
var canvas = document.getElementById("thecanvas");
document.getElementById("theimage").src = canvas.toDataURL();
Canvas2Image.saveAsPNG(canvas);
}
</script>
</head>
<body onload="draw()">
<canvas width=200 height=200 id="thecanvas"></canvas>
<div><button onclick="to_image()">Draw to Image</button></div>
<image id="theimage"></image>
</body>
</html>
我创建了一个小型库来执行此操作(以及其他一些方便的转换)。它称为 reimg,使用起来非常简单。
ReImg.fromCanvas(yourCanvasElement).toPng()
与 1000Bugy's answer 类似,但更简单,因为您不必即时制作锚点并手动发送点击事件(加上 IE 修复)。
如果您将下载按钮设置为锚点,则可以在运行默认锚点功能之前对其进行劫持。因此onAnchorClick
,您可以将锚点 href 设置为画布 base64 图像,并将锚点下载属性设置为您想要为图像命名的任何内容。
这在(当前)IE 中不起作用,因为它没有实现下载属性并阻止数据 uri 的下载。但这可以通过使用 window.navigator.msSaveBlob
来解决。
因此,您的锚点点击事件处理程序将如下所示(其中 anchor
、canvas
和 fileName
是范围查找):
function onClickAnchor(e) {
if (window.navigator.msSaveBlob) {
window.navigator.msSaveBlob(canvas.msToBlob(), fileName);
e.preventDefault();
} else {
anchor.setAttribute('download', fileName);
anchor.setAttribute('href', canvas.toDataURL());
}
}
这是a fiddle
这对我有用:(仅限谷歌浏览器)
<html>
<head>
<script>
function draw(){
var canvas = document.getElementById("thecanvas");
var ctx = canvas.getContext("2d");
ctx.fillStyle = "rgba(125, 46, 138, 0.5)";
ctx.fillRect(25,25,100,100);
ctx.fillStyle = "rgba( 0, 146, 38, 0.5)";
ctx.fillRect(58, 74, 125, 100);
}
function downloadImage()
{
var canvas = document.getElementById("thecanvas");
var image = canvas.toDataURL();
var aLink = document.createElement('a');
var evt = document.createEvent("HTMLEvents");
evt.initEvent("click");
aLink.download = 'image.png';
aLink.href = image;
aLink.dispatchEvent(evt);
}
</script>
</head>
<body onload="draw()">
<canvas width=200 height=200 id="thecanvas"></canvas>
<div><button onclick="downloadImage()">Download</button></div>
<image id="theimage"></image>
</body>
</html>
您应该使用 window.location = myImage;
而不是 imageElement.src = myImage;
即使在那之后,浏览器也会显示图像本身。您可以右键单击并使用“保存链接”来下载图像。
查看 this link 了解更多信息。
在 Cordova 中运行时,您不能使用前面提到的方法下载图像。您将需要使用 Cordova 文件插件。这将允许您选择保存位置并利用不同的持久性设置。此处的详细信息:https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/
或者,您可以将图像转换为 base64,然后将字符串存储在 localStorage 中,但如果您有许多图像或高分辨率,这将很快填满您的配额。
我为此目的创建了简单的打字稿函数,只需删除要与 javascript 一起使用的类型。
//ImagePath == canvas.toDataUrl()
private saveImage(imagePath: string, imageName: string ){
const link = document.createElement('a');
link.style.display = 'none';
document.body.appendChild(link)
link.setAttribute('download', imageName + '.png');
link.setAttribute('href', imagePath.replace("image/png", "image/octet-stream"));
link.click();
}
//function call
saveImage(canvas.toDataURL(), "myName")
也可以使用元素引用下载图像:
HTML:
<a download style="display:none" ref="imageDownloadRef"></a>
JAVASCRIPT:
this.$refs['imageDownloadRef'].href = this.canvas.toDataURL({
format: 'jpeg',
quality: 1.0,
})
const imageDownloadLink = this.$refs.imageDownloadRef as HTMLElement
imageDownloadLink.click()
@Wardenclyffe 和@SColvin,你们都在尝试使用画布保存图像,而不是使用画布的上下文。你都应该尝试 ctx.toDataURL();尝试这个:
var canvas1 = document.getElementById("yourCanvasId"); <br>
var ctx = canvas1.getContext("2d");<br>
var img = new Image();<br>
img.src = ctx.toDataURL('image/png');<br>
ctx.drawImage(img,200,150);<br>
您也可以参考以下链接:
http://tutorials.jenkov.com/html5-canvas/todataurl.html
http://www.w3.org/TR/2012/WD-html5-author-20120329/the-canvas-element.html#the-canvas-element
toDataURL
函数:developer.mozilla.org/en-US/docs/Web/API/…。您想在画布元素上调用 toDataURL
:developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/…
不定期副业成功案例分享