【问题标题】:Export image from canvas in printing size (300 DPI)以打印尺寸 (300 DPI) 从画布导出图像
【发布时间】:2016-10-23 04:03:49
【问题描述】:

我正在尝试制作一个画布应用程序并且我获得了成功。我只是停留在画布输出的打印图像中。图像尺寸太小,无法打印。

以下是申请流程:

  1. 上传图片并绘制到画布上。
  2. 在分割画布上进行缩放、移动和旋转等操作。
  3. 我已经成功地从这些分割中生成了单个图像
  4. 我已将 base64 从画布导出到打印过程。

当我从画布导出数据时,问题就在这里,它是小图像,即使我做了一些 Imagick 的事情来调整最终图像的图像质量,也无法在海报上打印。

JavaScript:

function draw() {
  var Activecanvas = document.getElementsByClassName("cf-photoframe-active");
  var canvas = Activecanvas[0];
  var ctx = canvas.getContext('2d');
  var ActiveCanvasId = canvas.getAttribute("id");
  var img = canvasDetail[ActiveCanvasId].selectedImage;
  var imageX = canvasDetail[ActiveCanvasId].imageX;
  var imageY = canvasDetail[ActiveCanvasId].imageY;
  var resize = resizeDetail[ActiveCanvasId].resize;
  var rotate = rotateDetail[ActiveCanvasId].rotate;
  //if(resize)
  $j("#resize").slider({
    value: resize,
    min: -300,
    max: 300,
    step: 1,
  });
  $j("#rotat").slider({
    value: rotate,
    min: -180,
    max: 180,
    step: 1,
  });
  if (img != '') {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.save();
    var im_width = parseInt(img.width + $j("#resize").slider('value'));
    var im_height = parseInt(img.height + $j("#resize").slider('value'));

    var maxWidth = canvas.width; // Max width for the image
    var maxHeight = canvas.height;


    var iswidthMax = 0;
    var imageOrgWidth = img.width;
    var imageOrgHeight = img.height;
    if (maxWidth < maxHeight) {
      iswidthMax = 1;
    } else if (maxWidth == maxHeight) {
      iswidthMax = 2;
    }

    if (iswidthMax == 1) {
      maxWidth = (maxHeight * imageOrgWidth) / imageOrgHeight;

    } else if (iswidthMax == 0) {
      maxHeight = (maxWidth * imageOrgHeight) / imageOrgWidth;
    } else if (iswidthMax == 2) {
      if (img.width > img.height) {
        maxWidth = (maxHeight * imageOrgWidth) / imageOrgHeight;
      } else {
        maxHeight = (maxWidth * imageOrgHeight) / imageOrgWidth;
      }
    }

    var resizeVal = $j("#resize").slider('value');
    var nw = maxWidth + resizeVal;
    var resizeValHeight = maxHeight * resizeVal / maxWidth;
    var nh = maxHeight + resizeValHeight;

    ctx.translate(imageX, imageY);
    ctx.rotate(rotate * Math.PI / 180);
    ctx.translate(-nw / 2, -nh / 2);
    ctx.drawImage(img, 0, 0, nw, nh);
    ctx.setTransform(1, 0, 0, 1, 0, 0);
    ctx.restore();
  }
}

【问题讨论】:

  • 确保在绘制之前设置好画布的大小(宽度/高度)。它应该是绘图操作之前所需的尺寸。您需要发布一些您正在使用的代码。
  • 我已经将 size(width/height) 设置为 HTML 内联属性。在这里我放了 Draw 函数
  • 不,那没用。您需要通过 JavaScript 设置宽度和高度,例如canvas.width = img.width; canvas.height = img.height; 元素的维度与内部数据的维度不同。如果您不手动设置,您将获得默认的内部尺寸。见这里,尤其是公认的答案:stackoverflow.com/questions/4938346/…
  • 如果我将图像大小分配给画布大小,那么在画布上分割图像和移动图像是行不通的。他们失败了。所以要解决这个问题,我只需将图像缩小并执行所有其他操作。
  • 这就是为什么您的数据输出中画布尺寸减小的原因。您不能缩小图像,然后再次备份并期望它看起来不错。当您从中输出数据时,画布必须是您期望的大小,否则在调整大小时它会变小且模糊。

标签: javascript printing html5-canvas imagick dpi


【解决方案1】:

如果您有较小的画布元素进行编辑,则必须将这些较小的画布元素中的数据重新组合成一个完整大小的画布元素,然后从该元素输出数据。

为简单起见,假设您已将图像切成四个象限并绘制到四个画布元素 canvas[0] - canvas[3] 以进行编辑。然后,您需要将它们重新组合成一个更大的画布,执行如下操作...

var imgData = [];
for (var i = 0; i < 4; i++) {
    var tmpCtx = canvas[i].getContext('2d');
    imgData[i] = tmpCtx.getImageData(0, 0, canvas[i].width, canvas[i].height);
}

var fullSizeCanvas = document.createElement('canvas');
fullSizeCanvas.width = img.width * 2;
fullSizeCanvas.height = img.height * 2;

var fullCtx = fullSizeCanvas.getContext('2d');
fullCtx.putImageData(imgData[0], 0, 0);
fullCtx.putImageData(imgData[1], img.width, 0);
fullCtx.putImageData(imgData[2], 0, img.height);
fullCtx.putImageData(imgData[3], img.width, img.height);

var data = fullSizeCanvas.toDataURL();

【讨论】:

  • 谢谢@ManoDestra,我关注你的第二条评论。将图像高度和宽度分配给画布,这对我有用。 stackoverflow.com/questions/4938346/…
  • 是的,完全正确。无论您需要作为数据输出的画布大小,都是您最终需要在最终操作中绘制的内容。您最初可以将图像切割成较小的画布以进行编辑,但您需要在每次缩放后或结束时画回主图像以导出。祝你好运!
猜你喜欢
  • 2018-05-02
  • 1970-01-01
  • 2015-02-25
  • 2013-11-17
  • 2012-10-08
  • 2021-05-28
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
相关资源
最近更新 更多