Canvas setTransform() 剪切图像
Canvas setTransform() cuts image
我正在制作一个数字绘图工具,它使用 setTransform()
函数来 distort/skewer 用户绘制的给定数字并下载它们。目前,在 canvas.
上绘制新图像之前,图像似乎还没有被清除出框架。
这是我的意思的一个例子:
目标:
下面是处理图片和下载图片的相关代码:
function save(number) {
for(let i = -0.2; i <= 0.2; i += 0.05) {
for(let j = -0.2; j <= 0.2; j += 0.05) {
for(let k = 0.9; k <= 1.05; k += 0.05){
for(let l = 0.9; l <= 1.05; l += 0.05){
temp2canvas.getContext('2d').setTransform(k, i, j, l, 0, 0);
temp2canvas.getContext('2d').clearRect(0, 0, temp2canvas.width, temp2canvas.height);
tempcanvas.getContext('2d').clearRect(0, 0, tempcanvas.width, tempcanvas.height);
document.getElementById("canvasimg").style.border = "2px solid";
temp2canvas.getContext('2d').drawImage(canvas, 0, 0, canvas.width, canvas.height, 10, 10, 102, 102);
tempcanvas.getContext('2d').drawImage(temp2canvas, 0, 0, temp2canvas.width, temp2canvas.height, 0, 0, 28, 28);
var dataURL = tempcanvas.toDataURL();
document.getElementById("canvasimg").src = dataURL;
zip.file(number + "\" + count + ".png", document.getElementById("canvasimg").src.replace(/^data:image\/(png|jpg);base64,/, ""), {base64: true});
count++;
}
}
}
}
}
function done() {
zip.generateAsync({type:"blob"})
.then(function(blob) {
saveAs(blob, "data.zip");
});
}
我使用 JSZip and FileSaver.js 库将文件保存为 zip 文件并下载。
怎么了?
当您调用 clearRect()
时转换仍然有效,因此清除矩形本身已被转换并且可能不会覆盖 canvas 的整个区域。
在清除 canvas:
之前,只需将变换矩阵重置为单位矩阵
function save(number) {
const ctx = temp2canvas.getContext('2d');
ctx.font = "20px sans-serif";
for(let i = -0.2; i <= 0.2; i += 0.05) {
for(let j = -0.2; j <= 0.2; j += 0.05) {
for(let k = 0.9; k <= 1.05; k += 0.05){
for(let l = 0.9; l <= 1.05; l += 0.05){
// reset to identity matrix
ctx.setTransform(1, 0, 0, 1, 0, 0);
// clear everything
ctx.clearRect(0, 0, temp2canvas.width, temp2canvas.height);
// now set the new matrix
ctx.setTransform(k, i, j, l, 0, 0);
ctx.fillText( number, 20, 20 );
temp2canvas.toBlob((blob) => {
document.body.appendChild(new Image())
.src = URL.createObjectURL( blob );
});
}
}
}
}
}
save(1);
<canvas id="temp2canvas" width="50" height="50"></canvas><br>
我正在制作一个数字绘图工具,它使用 setTransform()
函数来 distort/skewer 用户绘制的给定数字并下载它们。目前,在 canvas.
这是我的意思的一个例子:
目标:
下面是处理图片和下载图片的相关代码:
function save(number) {
for(let i = -0.2; i <= 0.2; i += 0.05) {
for(let j = -0.2; j <= 0.2; j += 0.05) {
for(let k = 0.9; k <= 1.05; k += 0.05){
for(let l = 0.9; l <= 1.05; l += 0.05){
temp2canvas.getContext('2d').setTransform(k, i, j, l, 0, 0);
temp2canvas.getContext('2d').clearRect(0, 0, temp2canvas.width, temp2canvas.height);
tempcanvas.getContext('2d').clearRect(0, 0, tempcanvas.width, tempcanvas.height);
document.getElementById("canvasimg").style.border = "2px solid";
temp2canvas.getContext('2d').drawImage(canvas, 0, 0, canvas.width, canvas.height, 10, 10, 102, 102);
tempcanvas.getContext('2d').drawImage(temp2canvas, 0, 0, temp2canvas.width, temp2canvas.height, 0, 0, 28, 28);
var dataURL = tempcanvas.toDataURL();
document.getElementById("canvasimg").src = dataURL;
zip.file(number + "\" + count + ".png", document.getElementById("canvasimg").src.replace(/^data:image\/(png|jpg);base64,/, ""), {base64: true});
count++;
}
}
}
}
}
function done() {
zip.generateAsync({type:"blob"})
.then(function(blob) {
saveAs(blob, "data.zip");
});
}
我使用 JSZip and FileSaver.js 库将文件保存为 zip 文件并下载。
怎么了?
当您调用 clearRect()
时转换仍然有效,因此清除矩形本身已被转换并且可能不会覆盖 canvas 的整个区域。
在清除 canvas:
之前,只需将变换矩阵重置为单位矩阵function save(number) {
const ctx = temp2canvas.getContext('2d');
ctx.font = "20px sans-serif";
for(let i = -0.2; i <= 0.2; i += 0.05) {
for(let j = -0.2; j <= 0.2; j += 0.05) {
for(let k = 0.9; k <= 1.05; k += 0.05){
for(let l = 0.9; l <= 1.05; l += 0.05){
// reset to identity matrix
ctx.setTransform(1, 0, 0, 1, 0, 0);
// clear everything
ctx.clearRect(0, 0, temp2canvas.width, temp2canvas.height);
// now set the new matrix
ctx.setTransform(k, i, j, l, 0, 0);
ctx.fillText( number, 20, 20 );
temp2canvas.toBlob((blob) => {
document.body.appendChild(new Image())
.src = URL.createObjectURL( blob );
});
}
}
}
}
}
save(1);
<canvas id="temp2canvas" width="50" height="50"></canvas><br>