如何将图像完全放入HTML5画布中
How to fit an image fully into HTML5 canvas?
我有一个滑动益智游戏的代码。当我使用500x500像素的图像时,一切都很好,但当我插入一个大图像时,只有图像的左上角是可见的,只有这一部分被划分为16个拼图部分。如何将整个图像放在画布上?
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<style>
.picture {
border: 1px solid black;
}
</style>
</head>
<body>
<div id="title">
<h2>Sliding Puzzle</h2>
</div>
<div id="slider">
<form>
<label>Easy</label>
<input type="range" id="scale" value="4" min="3" max="5" step="1">
<label>Hard</label>
</form>
<br>
</div>
<div id="main" class="main">
<canvas id="puzzle" width="500px" height="500px"></canvas>
</div>
<script>
var context = document.getElementById('puzzle').getContext('2d');
var img = new Image();
img.src = 'http://www.antilimit.com/nature/i/37.jpg';
img.addEventListener('load', drawTiles, false);
var boardSize = document.getElementById('puzzle').width;
var tileCount = 4
var tileSize = boardSize / tileCount;
var clickLoc = new Object;
clickLoc.x = 0;
clickLoc.y = 0;
var emptyLoc = new Object;
emptyLoc.x = 0;
emptyLoc.y = 0;
var solved = false;
var boardParts;
setBoard();
document.getElementById('scale').onchange = function() {
tileCount = this.value;
tileSize = boardSize / tileCount;
setBoard();
drawTiles();
};
document.getElementById('puzzle').onclick = function(e) {
clickLoc.x = Math.floor((e.pageX - this.offsetLeft) / tileSize);
clickLoc.y = Math.floor((e.pageY - this.offsetTop) / tileSize);
if (distance(clickLoc.x, clickLoc.y, emptyLoc.x, emptyLoc.y) == 1) {
slideTile(emptyLoc, clickLoc);
drawTiles();
}
if (solved) {
setTimeout(function() {alert("You solved it!");}, 500);
}
};
function setBoard() {
boardParts = new Array(tileCount);
for (var i = 0; i < tileCount; ++i) {
boardParts[i] = new Array(tileCount);
for (var j = 0; j < tileCount; ++j) {
boardParts[i][j] = new Object;
boardParts[i][j].x = (tileCount - 1) - i;
boardParts[i][j].y = (tileCount - 1) - j;
}
}
emptyLoc.x = boardParts[tileCount - 1][tileCount - 1].x;
emptyLoc.y = boardParts[tileCount - 1][tileCount - 1].y;
solved = false;
}
function drawTiles() {
context.clearRect ( 0 , 0 , boardSize , boardSize );
for (var i = 0; i < tileCount; ++i) {
for (var j = 0; j < tileCount; ++j) {
var x = boardParts[i][j].x;
var y = boardParts[i][j].y;
if(i != emptyLoc.x || j != emptyLoc.y || solved == true) {
context.drawImage(img, x * tileSize, y * tileSize, tileSize, tileSize,
i * tileSize, j * tileSize, tileSize, tileSize);
}
}
}
}
function distance(x1, y1, x2, y2) {
return Math.abs(x1 - x2) + Math.abs(y1 - y2);
}
function slideTile(toLoc, fromLoc) {
if (!solved) {
boardParts[toLoc.x][toLoc.y].x = boardParts[fromLoc.x][fromLoc.y].x;
boardParts[toLoc.x][toLoc.y].y = boardParts[fromLoc.x][fromLoc.y].y;
boardParts[fromLoc.x][fromLoc.y].x = tileCount - 1;
boardParts[fromLoc.x][fromLoc.y].y = tileCount - 1;
toLoc.x = fromLoc.x;
toLoc.y = fromLoc.y;
checkSolved();
}
}
function checkSolved() {
var flag = true;
for (var i = 0; i < tileCount; ++i) {
for (var j = 0; j < tileCount; ++j) {
if (boardParts[i][j].x != i || boardParts[i][j].y != j) {
flag = false;
}
}
}
solved = flag;
}
</script>
</body></html>
您在示例中使用的图像是1000px乘1000px,因此将其划分为16个瓦片需要将每个图像分割为16个部分,其中每个部分将是250px乘250px。目前,您使用的是16个部分,每个部分都是125像素乘125像素,因此您只复制图像的左上角四分之一。
拍摄宽度为W、高度为H的矩形图像,然后从左上角开始,如果W<H或imgSize=H,如果H
您可以找到缩放因子imgScale=imgSize/500
在您的示例中,imgSize=1000,因此imgScale=2,因此您希望复制两倍于平铺宽度和高度的部分
将drawTiles功能更改为
function drawTiles() {
var imgSize=Math.min(img.width,img.height);
var imgScale=imgSize/500;
context.clearRect ( 0 , 0 , boardSize , boardSize );
for (var i = 0; i < tileCount; ++i) {
for (var j = 0; j < tileCount; ++j) {
var x = boardParts[i][j].x;
var y = boardParts[i][j].y;
if(i != emptyLoc.x || j != emptyLoc.y || solved == true) {
context.drawImage(img, x * tileSize*imgScale, y * tileSize*imgScale, tileSize*imgScale, tileSize*imgScale,
i * tileSize, j * tileSize, tileSize, tileSize);
}
}
}
}
这是一个jsfiddle
相关文章:
- html5视频中的Youtube类型注释
- 如何在运行时在HTML5画布中绘制正方形
- 正在检测html5手机中的抖动
- Unicode字符未在HTML5画布中正确呈现
- 通过phonegap中的电子邮件发送存储在html5 localStorage中的信息
- 如何在html5画布中绘制圆形作为单独的画布
- 重定向到具有轨道的html5模式中的正确角度路线
- html5画布中的套索工具
- 什么'是在HTML5画布中创建关键事件的最佳方式
- HTML5模式中的$location需要<基本>
- 在HTML5画布中,是否可以围绕旋转对象旋转对象
- 如何将自定义字体轻松地放入HTML5画布中
- 如何在MVC5中运行时在HTML5 Canvas中显示图像
- 如何在HTML5视频中获得寻找事件的起点
- 在Javascript HTML5+Canvas中处理精灵鼠标点击的最佳方式
- 使用模式在 HTML5/JS 中绘制图像
- 如何在HTML5 / javascript中查找十六进制值的特定位或数字
- 如何在html5/JS中只预加载音频文件的一部分
- HTML5游戏中最有效的视差方式
- 存储在HTML5存储中的引导崩溃的当前状态