图片小于 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);
        });
    }
});
  1. 当我这样做时 imagem.onload... 我希望,如果图像像素大于 600 和 400,他会发出警报并停在那里,但即使如此图像也会出现在 canvas 上。
  2. 在同一个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").changeimagem.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>