如何在html画布中绘制较细但较锐利的线条?

邪恶守护者

我有以下javascript代码来绘制图形表。但是问题是当我打印输出时,细线看起来不清晰。缩放html页面时,该问题可见。我希望线条更加清晰。但是宽度应该相同。是否有可能?请帮忙。

function drawBkg(canvasElem, squareSize, minorLineWidthStr, lineColStr)
{
    var nLinesDone = 0;
    var i, curX, curY;
    var ctx = canvasElem.getContext('2d');
    ctx.clearRect(0,0,canvasElem.width,canvasElem.height);

    // draw the vertical lines
    curX=0;
    ctx.strokeStyle = lineColStr;
while (curX < canvasElem.width)
{

    if (nLinesDone % 5 == 0)
        ctx.lineWidth = 0.7;
    else
        ctx.lineWidth = minorLineWidthStr;

    ctx.beginPath();
    ctx.moveTo(curX, 0);
    ctx.lineTo(curX, canvasElem.height);
    ctx.stroke();

    curX += squareSize;
    nLinesDone++;
}

    // draw the horizontal lines
    curY=0;
    nLinesDone = 0;
    while (curY < canvasElem.height)
    {
        if (nLinesDone % 5 == 0)
            ctx.lineWidth = 0.7;
    else
        ctx.lineWidth = minorLineWidthStr;
    ctx.beginPath();
    ctx.moveTo(0, curY);
    ctx.lineTo(canvasElem.width, curY);
    ctx.stroke();

    curY += squareSize;
    nLinesDone++;
}
}

drawBkg(byId('canvas'), 3.78, "0.35", "green");
海道

您正在体验的是屏幕的PPI和打印机的DPI之间的差异

画布输出是光栅图像,如果将其大小设置为96px,则分辨率为96ppi的监视器会将其输出为一英寸的大图像,而具有300ppi的打印机会将其输出为3.125英寸的图像。
这样做时,打印操作将降低图像的采样率,以使其适合此新尺寸。(每个像素都会相乘,因此覆盖更大的区域)。

但是canvas context2d有一个scale()方法,因此,如果所有图形都是基于矢量1,则可以:

  • 在打印之前创建一个更大的画布,
  • 将其上下文的比例设置为所需的因子,
  • 调用与较小画布上相同的图形
  • 如果你是直接从浏览器的打印“打印网页”,设置更大的画布style.widthstyle.height性质的widthheight中较小的一个特性,
  • 用较大的canvas节点替换较小的canvas节点,
  • 打印,
  • 用原来的帆布代替更大的帆布

为此,您将需要重新编写一些函数,以便它不将传递的画布的宽度/高度作为值,而是您选择的值。

function drawBkg(ctx, width, height, squareSize, minorLineWidthStr, lineColStr) {
  var nLinesDone = 0;
  var i, curX, curY;
  ctx.clearRect(0, 0, width, height);

  // draw the vertical lines
  curX = 0;
  ctx.strokeStyle = lineColStr;
  while (curX < width) {
    if (nLinesDone % 5 == 0)
      ctx.lineWidth = 0.7;
    else
      ctx.lineWidth = minorLineWidthStr;
    ctx.beginPath();
    ctx.moveTo(curX, 0);
    ctx.lineTo(curX, height);
    ctx.stroke();
    curX += squareSize;
    nLinesDone++;
  }

  // draw the horizontal lines
  curY = 0;
  nLinesDone = 0;
  while (curY < height) {
    if (nLinesDone % 5 == 0)
      ctx.lineWidth = 0.7;
    else
      ctx.lineWidth = minorLineWidthStr;
    ctx.beginPath();
    ctx.moveTo(0, curY);
    ctx.lineTo(width, curY);
    ctx.stroke();

    curY += squareSize;
    nLinesDone++;
  }
}


// your drawings
var smallCanvas = document.getElementById('smallCanvas');
var smallCtx = smallCanvas.getContext('2d');
drawBkg(smallCtx, smallCanvas.width, smallCanvas.height, 3.78, "0.35", "green");


// a function to get the screen's ppi
function getPPI() {
  var test = document.createElement('div');
  test.style.width = "1in";
  test.style.height = 0;
  document.body.appendChild(test);
  var dpi = devicePixelRatio || 1;
  var ppi = parseInt(getComputedStyle(test).width) * dpi;
  document.body.removeChild(test);
  return ppi;
}

function scaleAndPrint(outputDPI) {
  var factor = outputDPI / getPPI();
  var bigCanvas = smallCanvas.cloneNode();
  // set the required size of our "printer version" canvas
  bigCanvas.width = smallCanvas.width * factor;
  bigCanvas.height = smallCanvas.height * factor;
  // set the display size the same as the original one to don't brake the page's layout
  var rect = smallCanvas.getBoundingClientRect();
  bigCanvas.style.width = rect.width + 'px';
  bigCanvas.style.height = rect.height + 'px';
  var bigCtx = bigCanvas.getContext('2d');

  // change the scale of our big context
  bigCtx.scale(factor, factor);

  // tell the function we want the height and width of the small canvas
  drawBkg(bigCtx, smallCanvas.width, smallCanvas.height, 3.78, "0.35", "green");
  // replace our original canvas with the bigger one
  smallCanvas.parentNode.replaceChild(bigCanvas, smallCanvas);
  // call the printer
  print();
  // set the original one back
  bigCanvas.parentNode.replaceChild(smallCanvas, bigCanvas);
}

btn_o.onclick = function() { print(); };
btn_s.onclick = function() { scaleAndPrint(300);};
<button id="btn_o">print without scaling</button>
<button id="btn_s">print with scaling</button>
<br>
<canvas id="smallCanvas" width="250" height="500"></canvas>

1.除drawImage()之外画布上的所有绘图操作都是基于矢量的putImageData()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

HTML Canvas - 如何绘制非常细的线条?

来自分类Dev

如何在XAML画布中绘制随机/不规则线条?

来自分类Dev

继续在HTML画布中绘制线条

来自分类Dev

如何在Javafx中提高画布上线条的绘制速度

来自分类Dev

如何在Firefox 3.6中运行较旧的加载项?

来自分类Dev

如何在较旧的Java版本中运行程序?

来自分类Dev

如何在回声中传递较旧的日期?

来自分类Dev

在Ag-Grid中为列设置较细的宽度不起作用

来自分类Dev

在html5画布中绘制动画的贝塞尔曲线时如何保持平滑的线条

来自分类Dev

Delphi在画布上的PlotGrid中绘制线条

来自分类Dev

在ggplot2中绘制较亮的点和较暗的点时合并图例

来自分类Dev

如何在较旧版本的Excel中测试在Excel 2016中制作的折线图

来自分类Dev

画布中的HTML / Javascript绘制弧不起作用-矩形/线条很好

来自分类Dev

如何在Python的plt中获取最新绘制的线条的颜色

来自分类Dev

如何在Core Plot CPTScatterPlot中绘制不同的线条颜色

来自分类Dev

如何在Qt中绘制能够改变颜色的线条?

来自分类Dev

如何在Core Plot CPTScatterPlot中绘制不同的线条颜色

来自分类Dev

如何在Eclipse中安装较旧的Android SDK平台工具23.0.1?

来自分类Dev

如何在svg中对齐多边形外边缘上的点以获得较粗的边框?

来自分类Dev

如何在画布上给线条上色?

来自分类Dev

RXJS在HTML5画布上绘制线条

来自分类Dev

循环遍历坐标数组以在 html 画布上绘制线条

来自分类Dev

如何在两个以上的画布中绘制HTML和JS

来自分类Dev

如何在较新的Rails上用readonly替换find?

来自分类Dev

如何在R中生成较旧的pmml版本

来自分类Dev

如何在CentOS上安装较旧的R版本

来自分类Dev

如何在pypi上查看较新的软件包

来自分类Dev

如何在Ubuntu上安装较旧的Arangodb版本

来自分类Dev

在 Tkinter 画布中绘制的线条的饱和度

Related 相关文章

  1. 1

    HTML Canvas - 如何绘制非常细的线条?

  2. 2

    如何在XAML画布中绘制随机/不规则线条?

  3. 3

    继续在HTML画布中绘制线条

  4. 4

    如何在Javafx中提高画布上线条的绘制速度

  5. 5

    如何在Firefox 3.6中运行较旧的加载项?

  6. 6

    如何在较旧的Java版本中运行程序?

  7. 7

    如何在回声中传递较旧的日期?

  8. 8

    在Ag-Grid中为列设置较细的宽度不起作用

  9. 9

    在html5画布中绘制动画的贝塞尔曲线时如何保持平滑的线条

  10. 10

    Delphi在画布上的PlotGrid中绘制线条

  11. 11

    在ggplot2中绘制较亮的点和较暗的点时合并图例

  12. 12

    如何在较旧版本的Excel中测试在Excel 2016中制作的折线图

  13. 13

    画布中的HTML / Javascript绘制弧不起作用-矩形/线条很好

  14. 14

    如何在Python的plt中获取最新绘制的线条的颜色

  15. 15

    如何在Core Plot CPTScatterPlot中绘制不同的线条颜色

  16. 16

    如何在Qt中绘制能够改变颜色的线条?

  17. 17

    如何在Core Plot CPTScatterPlot中绘制不同的线条颜色

  18. 18

    如何在Eclipse中安装较旧的Android SDK平台工具23.0.1?

  19. 19

    如何在svg中对齐多边形外边缘上的点以获得较粗的边框?

  20. 20

    如何在画布上给线条上色?

  21. 21

    RXJS在HTML5画布上绘制线条

  22. 22

    循环遍历坐标数组以在 html 画布上绘制线条

  23. 23

    如何在两个以上的画布中绘制HTML和JS

  24. 24

    如何在较新的Rails上用readonly替换find?

  25. 25

    如何在R中生成较旧的pmml版本

  26. 26

    如何在CentOS上安装较旧的R版本

  27. 27

    如何在pypi上查看较新的软件包

  28. 28

    如何在Ubuntu上安装较旧的Arangodb版本

  29. 29

    在 Tkinter 画布中绘制的线条的饱和度

热门标签

归档