HTML画布正在拉伸内容[重复]

Posted

技术标签:

【中文标题】HTML画布正在拉伸内容[重复]【英文标题】:HTML canvas is stretching content [duplicate] 【发布时间】:2015-10-16 09:40:09 【问题描述】:

我正在尝试从图块集中加载精灵,并将它们加载到 html5 画布中。

问题是坐标不等于图像的大小(它被拉伸了)

我所有的图片都是 64x64 像素。 (1080p 分辨率预览:)如您所见,画布正在拉伸这些 64x64 图像。

所有代码: HTML:

<html>
<head>
    <link rel="stylesheet" href="css/reset.css" />
    <link rel="stylesheet" href="css/board.css" />

    <script src="js/ext/jquery.js"></script>
    <script src="js/game.js"></script>
</head>
<body>
    <canvas id="GameBoard"></canvas>
</body>
</html>

CSS:

#GameBoard 
    width: 100vw;
    height: 100vh;
    border: 1px solid white;

javascript

$(document).ready(function()

    createWorld();
); 
function createWorld()

    var TileSets = loadTiles();
    drawWorld(TileSets);

var chunks = 
[
    [[0],[0],[0],[0],[0]],
    [[0],[1],[0],[1],[0]],
    [[0],[1],[0],[1],[0]],
    [[0],[1],[0],[1],[0]],
    [[0],[0],[0],[0],[0]]
];
var tiles = 
[
     tileid: 0, tileset: 1, tilerow: 0, tilecolumn: 0,
     tileid: 1, tileset: 1, tilerow: 0, tilecolumn: 1
]
var tilesets =
[
     tilesetid: 0, tilesrc: "static/tiles/tileset0.png", description:"OLD" ,
     tilesetid: 1, tilesrc: "static/tiles/tileset1.png", description:"New TEST" 
]

function loadTiles()

    var tiless = [];
    for(var i = 0; i < tilesets.length; i++)
    
        var img = new Image();
        img.src = tilesets[i].tilesrc;
        tiless.push(img);
    
    return tiless;


function drawWorld(TileSets)

    var WorldData = chunks;
    var canvas = document.getElementById("GameBoard");

    var counter = 0;

    for(var i = 0; i < WorldData.length; i++)
    
        for(var j = 0; j < WorldData[i].length; j++)
        
            counter++;

            var ctx = canvas.getContext("2d");
            var tileid = WorldData[i][j];
            var tilerow = tiles[tileid].tilerow;
            var tilecolumn = tiles[tileid].tilecolumn;

            console.log("DRAWN: " + counter + " FROM SET: " + tilerow + "x" + tilecolumn + " AT: " + i + "x" + j);

            ctx.drawImage(TileSets[1], 64 * tilecolumn , 64 * tilerow, 64, 64, 64 * j, 64 * i, 64, 64);
        
    

那么有什么方法,JavaScript、CSS 或其他方法可以使画布的网格大小为 64 x 64,以便图像以自己的比例放置在彼此相邻的位置。

【问题讨论】:

【参考方案1】:
<canvas id="GameBoard"></canvas>

您必须按像素值指定widthheight 属性。这些值是画布的虚拟大小。当你画一些东西时使用这个尺寸。

CSS

css 中的大小将画布缩放到指定大小,但不更改其虚拟大小。您正在看到这种缩放。

您必须通过仅指定一个维度来保持 css 中的比例。如果这不是解决方案,请提供有关您需要的虚拟大小的更多信息,我会尝试通过更具体的 css 提供帮助。

【讨论】:

【参考方案2】:

画布元素的属性/属性与画布元素样式有很大不同。前者代表画布上的实际像素数(您可以操作的实际像素等),而后者是画布的 DOM 表示。它对于拉伸和缩放很有用,但通常是我的错误,就像你的情况一样。

两种解决方案:

设置画布元素的高度和宽度以匹配元素的样式 (CSS) 使样式 (CSS) 的宽度和高度与实际画布的宽度和高度相同(在您的情况下为 64x64)

看看这里的区别:

var img = document.getElementById('img');
var c1 = document.getElementById('c1');
var c2 = document.getElementById('c2');
var c3 = document.getElementById('c3');

c1.width = 150;
c1.height = 150;

c2.width = 150;
c2.height = 150;

c3.width = 200;
c3.height = 150;

img.onload = function() 
  c1.getContext('2d').drawImage(img, 0, 0);
  c2.getContext('2d').drawImage(img, 0, 0);
  c3.getContext('2d').drawImage(img, 0, 0);
canvas border: 1px solid #aaa; width: 150px; height: 150px
#c2 width: 200px
img visibility: hidden; position: absolute
<img src="http://mario.nintendo.com/img/mario_logo.png" id="img" />
<canvas id="c1"></canvas>
<canvas id="c2"></canvas>
<canvas id="c3"></canvas>
<p>The first one is correct - CSS resolution matching the element resolution</p>
<p>The second one tries to resize by changing the element style (CSS) only</p>
<p>The third one tried to resize by changing the element width only</p>

【讨论】:

【参考方案3】:

问题是您在 vwvh 中设置画布大小,并且在外部 css 文件中也是如此。要让canvas 正常工作,请尝试类似

<canvas id='Ganeboard' width='800px' height='400px'></canvas>

或使用内联样式,但我想canvas 的大小必须设置为固定,您必须使用代码自己处理调整大小

【讨论】:

1.没有px 的属性,只是一个数字。 2. 属性复制到样式(优先级低),但样式不影响虚拟大小。

以上是关于HTML画布正在拉伸内容[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - 旋转画布导致拉伸[重复]

HTML / CSS如何垂直拉伸DIV [重复]

Flex项目正在拉伸[重复]

如何将 HTML5 画布保存为 png [重复]

使cloneNode克隆子画布内容[重复]

关于html背景图片往下拉伸问题