【发布时间】:2016-05-15 00:02:47
【问题描述】:
我需要在没有任何抗锯齿或 ClearType 的情况下将字体渲染到画布上。然后我需要将它们放大到另一个画布上一个整数因子,没有任何平滑。
从小画布缩放到大画布可以正常工作(通过在 2d 上下文中设置 imageSmoorthingEnabled = false),但是我无法弄清楚如何在不为整个浏览器和操作系统禁用的情况下禁用抗锯齿 / ClearType .
如果我没有在操作系统中禁用 ClearType,并在 Chrome 中禁用 DirectWrite (chrome://flags#disable-direct-write),我会得到下面第一张图片的结果。两者都被禁用,我得到了想要的效果 - 请参阅第二个链接。
DirectWrite / ClearType 开启
DirectWrite / ClearType 关闭
虽然我有一个解决方法,但我真的在寻找一种方法来仅在画布级别禁用这些功能,这样我们就不需要要求我们的用户更改他们的操作系统和浏览器设置。
我不需要跨浏览器解决方案,Chrome 首选。
我的测试开发环境是 Windows 7 64 + Chrome 版本 49.0.2623.28 beta-m (64-bit)
** 编辑:添加了一个示例,说明为什么第一个答案不能解决问题:
示例位图字体为 21 像素。请注意,如果我们以该尺寸渲染它,然后放大 10 倍,您仍然可以看到平滑/抗锯齿效果。
@font-face {
font-family: "vcr-osd-mono";
src: url("https://dl.dropboxusercontent.com/s/hsdwvz761xqphhb/pixel.ttf");
}
canvas {
font-family: vcr-osd-mono
-webkit-font-smoothing: none;
}
<body onload="
var ctx = canvas.getContext('2d');
ctx.font = '21px vcr-osd-mono';
ctx.textBaseline = 'top';
ctx.fillText(' ', 0, 0);
">
<button onclick="
var ctx = canvas.getContext('2d');
ctx.font = '21px vcr-osd-mono';
ctx.textBaseline = 'top';
ctx.fillText('TESTING', 0, 0);
var ctx2 = canvas2.getContext('2d');
ctx2.imageSmoothingEnabled = false;
ctx2.scale(10,10);
ctx2.drawImage(canvas, 0, 0);
">Click</button><br/>
<canvas id="canvas" width="100" height="30"></canvas><br/>
<canvas id="canvas2" width="1000" height="300"></canvas><br/>
</body>
【问题讨论】:
-
您现在找到解决方案了吗?
标签: html google-chrome canvas