javascript - Canvas drawImage - firefox/opera/ie(非 chrome)中瓷砖的可见边缘

标签 javascript html html5-canvas

我正在将游戏 map 绘制到 Canvas 中。地面由瓷砖制成 - 简单的 64x64 png 图像。

当我在 Chrome 中绘制它时,它看起来不错(左),但是当我在 Firefox/Opera/IE 中绘制它时(右),我看到了可见的边缘: enter image description here

当我使用四舍五入的数字时问题就消失了:

ctx.drawImage(img, parseInt(x), parseInt(y), w, h);

但是当我使用缩放时这没有帮助:

ctx.scale(scale); // anything from 0.1 to 2.0

我也试过这些,但没有改变:

  1. ctx.drawImage(img, 5, 5, 50, 50, x, y, w, h);//所以不是夹紧问题
  2. ctx.imageSmoothingEnabled = false;
  3. 图像渲染:-moz-crisp-edges; (css)

有什么方法可以让它在 ff/op/ie 中工作吗?


编辑:找到部分解决方案

在宽度/高度上增加 1 个像素并按比例补偿(宽度+1/比例)似乎有帮助:

ctx.drawImage(props.img, 0, 0, width + 1/scale, height + 1/scale);

它会产生一些瑕疵,但我认为这是可以接受的。在此图像上,您可以看到没有边缘的绿色瓷砖和未补偿但仍具有可见边缘的蓝色窗口:

fixed

最佳答案

最简单的解决方案(我认为最有效)是在绘制游戏的背景图 block 时使用具有 1 像素重叠(1x1 或 2x2 更大)的图 block 。

没什么特别的,只是比平时多画一点。这避免了将额外的转换引入组合的复杂性和性能考虑。

例如:

var img = new Image();
img.onload = function () {
    for (var x = 0.3; x < 200; x += 15) {
        for (var y = 0.3; y < 200; y += 15) {
            ctx.drawImage(img, 0, 0, 15, 15, x, y, 15, 15);
            // If we merely use 16x16 tiles instead,
            // this will never happen:
            //ctx.drawImage(img, 0, 0, 16, 16, x, y, 16, 16);
        }
    }
}
img.src = "http://upload.wikimedia.org/wikipedia/en/thumb/0/06/Neptune.jpg/100px-Neptune.jpg";

之前:http://jsfiddle.net/d9MSV

之后:http://jsfiddle.net/d9MSV/1/


注意 正如提问者所指出的,额外的像素需要考虑缩放,因此更正确的解决方案是他的修改:http://jsfiddle.net/d9MSV/3/

关于javascript - Canvas drawImage - firefox/opera/ie(非 chrome)中瓷砖的可见边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17725840/

相关文章:

javascript - 如何在 JavaScript 中清空(重置)输入类型电子邮件后用空格填充(in.value =""不起作用)

javascript - 如何让单个按钮充当 JavaScript 中的开始和停止按钮?

javascript - Jquery html() 方法获取 <li> html

javascript - 如何获取单元格的相对标题?

javascript - 导入的 React 组件具有不需要的宽度 : 0 div at root and is stopping the component fill the parents CSS grid area

jquery - AngularJs:如何将表格滚动到当前的 ng-init 日期?

javascript - Fabric .js : Get text bounding box width and height

javascript - 如何在 Javascript 中 trim 图像

javascript - 如何将默认图像添加到 Canvas ,同时让用户加载自己的图像

javascript - jquery如何在我的表单中填写选择选项