图片小于 canvas 上的原始图片以制作 drawImage()
image smaller than the original on canvas to make drawImage()
我正在用 html5 canvas 开发一个图像过滤系统,但是,因为我刚开始,所以我出现了一些疑问和错误。
这是我到目前为止开发的内容:
$(document).ready(function() {
$("#uploadImagem").change(function(e) {
var _URL = window.URL || window.webkitURL,
arquivo = e.target.files[0],
tipoImagem = /image.*/,
reader,
imagem;
if(!arquivo.type.match(tipoImagem)) {
alert("Somente imagens são aceitas!");
return;
}
imagem = new Image();
imagem.onload = function() {
if(this.width > 600 || this.height > 400) {
alert("Somente imagens com largura máxima de 600px e altura máxima de 400px");
return;
} else {
$("#filtrarImagem").width(this.width).height(this.height);
}
};
imagem.src = _URL.createObjectURL(arquivo);
reader = new FileReader();
reader.onload = fileOnload;
reader.readAsDataURL(arquivo);
});
function fileOnload(e) {
var $img = $("<img>", {src: e.target.result}),
canvas = $("#filtrarImagem")[0],
context = canvas.getContext("2d");
$img.load(function() {
context.drawImage(this, 0, 0);
});
}
});
- 当我这样做时
imagem.onload...
我希望,如果图像像素大于 600 和 400,他会发出警报并停在那里,但即使如此图像也会出现在 canvas 上。
- 在同一个
imagem.onload...
函数中,如果图片像素对应的canvas要求(id="filtrarImagem")是图片的大小,但是图片要canvas变得比原来上传的小了,她要占满canvas,得到原来的大小。
如何继续?
jQuery width()
和 height()
函数使用 CSS 改变 canvas which does not do what you would expect it to do 的大小。直接更改canvas元素的宽高属性。
之所以检查大小不会阻止绘制图像,是因为您的检查是在 $("#uploadImagem").change
中 imagem.onload
的处理程序中,而绘图发生在 [=14] 中=] 从 reader.onload
分配。这两个事件是独立处理的。其中一个人提前返回并不妨碍另一个人被处决
您有两个单独的图像加载处理程序。不需要设置两个相同URL的图片源,只需要重复使用一张图片来检查大小和设置canvas大小,然后将其绘制到canvas.
我建议执行以下步骤(您用 jQuery 标记了问题,但我强烈建议您在处理非 DOM 导向元素时使用香草 JavaScript,例如canvas).
例子
if (typeof window.URL === "undefined") window.URL = window.webkitURL;
$("input")[0].onchange = function(e) {
var arquivo = e.target.files[0],
imagem = new Image();
if (!arquivo.type.match(/image.*/)) {
alert("Somente imagens são aceitas!");
return;
}
// STEP 1: load as image
imagem.onload = doSetup;
imagem.src = URL.createObjectURL(arquivo)
};
// STEP 2: now that we have the image loaded we can check size and setup canvas
function doSetup() {
URL.revokeObjectURL(this.src); // clean up memory for object-URL
if (this.width > 600 || this.height > 400) {
alert("Too big!");
return; // exit!
}
// image OK, setup canvas
var c = $("canvas")[0]; // work with the element itself, not the jQuery object
c.width = this.width; // important: use canvas.width, not style or css
c.height = this.height;
// draw in image
var ctx = c.getContext("2d");
ctx.drawImage(this, 0, 0);
// NEXT: ... from here, invoke filter etc.
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file"><br><canvas></canvas>
我正在用 html5 canvas 开发一个图像过滤系统,但是,因为我刚开始,所以我出现了一些疑问和错误。
这是我到目前为止开发的内容:
$(document).ready(function() {
$("#uploadImagem").change(function(e) {
var _URL = window.URL || window.webkitURL,
arquivo = e.target.files[0],
tipoImagem = /image.*/,
reader,
imagem;
if(!arquivo.type.match(tipoImagem)) {
alert("Somente imagens são aceitas!");
return;
}
imagem = new Image();
imagem.onload = function() {
if(this.width > 600 || this.height > 400) {
alert("Somente imagens com largura máxima de 600px e altura máxima de 400px");
return;
} else {
$("#filtrarImagem").width(this.width).height(this.height);
}
};
imagem.src = _URL.createObjectURL(arquivo);
reader = new FileReader();
reader.onload = fileOnload;
reader.readAsDataURL(arquivo);
});
function fileOnload(e) {
var $img = $("<img>", {src: e.target.result}),
canvas = $("#filtrarImagem")[0],
context = canvas.getContext("2d");
$img.load(function() {
context.drawImage(this, 0, 0);
});
}
});
- 当我这样做时
imagem.onload...
我希望,如果图像像素大于 600 和 400,他会发出警报并停在那里,但即使如此图像也会出现在 canvas 上。 - 在同一个
imagem.onload...
函数中,如果图片像素对应的canvas要求(id="filtrarImagem")是图片的大小,但是图片要canvas变得比原来上传的小了,她要占满canvas,得到原来的大小。
如何继续?
jQuery width()
和 height()
函数使用 CSS 改变 canvas which does not do what you would expect it to do 的大小。直接更改canvas元素的宽高属性。
之所以检查大小不会阻止绘制图像,是因为您的检查是在 $("#uploadImagem").change
中 imagem.onload
的处理程序中,而绘图发生在 [=14] 中=] 从 reader.onload
分配。这两个事件是独立处理的。其中一个人提前返回并不妨碍另一个人被处决
您有两个单独的图像加载处理程序。不需要设置两个相同URL的图片源,只需要重复使用一张图片来检查大小和设置canvas大小,然后将其绘制到canvas.
我建议执行以下步骤(您用 jQuery 标记了问题,但我强烈建议您在处理非 DOM 导向元素时使用香草 JavaScript,例如canvas).
例子
if (typeof window.URL === "undefined") window.URL = window.webkitURL;
$("input")[0].onchange = function(e) {
var arquivo = e.target.files[0],
imagem = new Image();
if (!arquivo.type.match(/image.*/)) {
alert("Somente imagens são aceitas!");
return;
}
// STEP 1: load as image
imagem.onload = doSetup;
imagem.src = URL.createObjectURL(arquivo)
};
// STEP 2: now that we have the image loaded we can check size and setup canvas
function doSetup() {
URL.revokeObjectURL(this.src); // clean up memory for object-URL
if (this.width > 600 || this.height > 400) {
alert("Too big!");
return; // exit!
}
// image OK, setup canvas
var c = $("canvas")[0]; // work with the element itself, not the jQuery object
c.width = this.width; // important: use canvas.width, not style or css
c.height = this.height;
// draw in image
var ctx = c.getContext("2d");
ctx.drawImage(this, 0, 0);
// NEXT: ... from here, invoke filter etc.
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file"><br><canvas></canvas>