【问题标题】:Printing HTML5 Canvas in the correct size以正确的尺寸打印 HTML5 Canvas
【发布时间】:2015-01-21 12:37:35
【问题描述】:

是否有正确的方法来指定画布元素的大小,例如以毫米为单位,这样如果我打印出来它就会有正确的大小?

我试过这个简单的例子:

<!DOCTYPE html>
<html>
<body>
<canvas id="myCanvas"
style="border:1px solid #c3c3c3; width:50mm; height:50mm;">
Your browser does not support the HTML5 canvas tag.
</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "#FF0000";
ctx.fillRect(0,0,150,75);
</script>
</body>
</html>

但在屏幕上,画布是 45 毫米而不是 50 毫米,打印时是 55 毫米 ^^

【问题讨论】:

    标签: html canvas size


    【解决方案1】:

    第 1 部分:生成 50 毫米的打印绘图需要多少画布像素?

    打印机通常以每英寸 300 像素的速度打印。

    以毫米为单位:300ppi / 25.4 mm-in = 11.81 像素/毫米。

    因此,如果您想打印 50 毫米的图纸,您可以这样计算所需的像素大小:

    50mm x 11.81ppm = 590.5 像素(591 像素)

    然后您将画布的大小调整为 591 像素(假设为正方形),如下所示:

    // resize the canvas to have enough pixels to print 50mm drawing
    c.width=591;
    c.height=591;
    

    第 2 部分:将画布导出为图像

    要打印画布,您需要将画布转换为可以使用context.toDataURL 进行的图像。

    // create an image from the canvas
    var img50mm=new Image();
    img50mm.src=canvas.toDataURL();
    

    第 3 部分:将导出的图像转换为正确的打印分辨率

    context.toDataURL 始终创建每英寸 72 像素的图像。

    打印机通常以更高的分辨率打印,可能是每英寸 300 像素。

    所以要让导出的图像在页面上正常打印,必须将导出的图像从 72ppi 转换为 300ppi。

    ImageMagick 库可以进行转换:http://www.imagemagick.org/

    它是一个服务器端工具,因此您必须将导出的图像从服务器反弹(可能使用 AJAX 来回传输您的图像)。

    ImageMagick 适用于 PHP、IIS 和其他服务器环境。

    这是一个使用 PHP 转换图像分辨率并将转换后的图像回显给调用者的示例:

    // Assume you've uploaded the exported image to
    // "uploadedImage.png" on the server
    <?php
      $magic = new Imagick();
      $magic->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
      $im->setImageResolution(300,300);
      $im->readImage("uploadedImage.png");
      $im->setImageFormat("png");
      header("Content-Type: image/png");
      echo $im;
    ?>
    

    最后部分:打印出来!

    您从服务器收到的转换后的文件将在您的 300ppi 打印机上打印一个 50 毫米的正方形图像。

    【讨论】:

    【解决方案2】:

    不要使用样式来声明宽度和高度。在元素中以像素为单位声明它,如下所示:&lt;canvas width = "500" height = "500"&gt;&lt;/canvas&gt;

    应该可以。

    【讨论】:

    • 我想以毫米或厘米为单位而不是像素来指定尺寸。
    • @Moeren 您可以以像素为单位定义画布,然后使用 CSS 以厘米为单位进行相应的缩放。顺便说一句,我建议您不要将自己限制在厘米和毫米范围内。
    • 你能给我举个例子,说明如何用 CSS 正确缩放它吗?
    • 使用画布 width="500" height = "500" style = "border:1px solid #c3c3c3; width:50mm; height:50mm;".
    • 这只会改变分辨率,它的尺寸仍然是 45 / 55 mm :(
    【解决方案3】:

    如果您决定在服务器端处理生成的 PNG,您可以set PNG pHYs chunk in pure PHP

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 2012-02-26
      相关资源
      最近更新 更多