转换为 Base64 的图像未显示在 bootstrap 模态 canvas 上

Image converted to Base64 not showing on bootstrap modal's canvas

我正在从用户那里获取图像,执行裁剪操作,将其转换为 base64,然后在 canvas 上绘制。对于裁剪,我正在使用 jcrop 库。

$(document).on("change","#photograph",function() {
   $("#picCrop").modal('show'); 
   $("#views").empty(); 

   image = null;
   canvas = null;
   alert("canvas"+(canvas==null)+" Image"+ (image==null));

   loadImage(this);
   $(this).replaceWith('<input id="photograph" type="file"    class="form-control">');
});

这里我遇到了这个问题,如果没有 alert("canvas"+(canvas==null)+" Image"+ (image==null));,图像在 canvas 上不可见,如果是大图像,只有在我等待一段时间后才会出现渲染框按钮。

fiddle link: https://jsfiddle.net/govi20/spmc7ymp/5/ (注释掉 alert 行以检查结果)

这里的问题是 firefox 的图像加载通常需要在继续下一步之前已经具有正确的大小。并且模态需要存在才能附加到 canvas。

https://jsfiddle.net/a0e5dt98/

$(document).on("change", "#photograph", function() {
  $(this).replaceWith('<input id="photograph" type="file" class="form-control">');
  $("#picCrop").modal('show');
  loadImage(this);
});

$('#picCrop').on('shown.bs.modal', function(e) {
  validateImage();
})

然后它从图像的选择中调用loadImage。然后在模态加载时验证该图像,模态会将其附加到现在存在的 div。这确实假设 imageLoad 比模态加载花费的时间更少。理论上,您可以在本地加载足够大的图像,但它无法验证卸载的图像。

然后div重新整理验证和词缀,以便 firefox 可以正确获取大小。

function validateImage() {
  console.log("validateimage.")
  if (canvas != null) {
    image = new Image();
    image.onload = affixJcrop;
    image.src = canvas.toDataURL('image/png');
  } else affixJcrop();
}

function affixJcrop() {
  console.log("affixJcrop")
  if (jcrop_api != null) {
    jcrop_api.destroy();
  }
  $("#views").empty();
  $("#views").append("<canvas id=\"canvas\">");
  canvas = $("#canvas")[0];
  context = canvas.getContext("2d");
  console.log(image.width);
  console.log(image.height);
  canvas.width = image.width;
  canvas.height = image.height;
  context.drawImage(image, 0, 0);
  $("#canvas").Jcrop({
    onSelect: selectcanvas,
    onRelease: clearcanvas,
    boxWidth: crop_max_width,
    boxHeight: crop_max_height,
    minSize: [100, 100],
    setSelect: [0, 0, 100, 100]
  }, function() {
    jcrop_api = this;
  });
  clearcanvas();
}