用Javascript将图像分成多个部分

27

我正在创建一个简单的拼图游戏。为了做到这一点,我需要将我使用的图片切成20个块。在Javascript中有没有一种方法可以将一张图片切成20个相等的部分,并将它们保存为网页中的20个不同对象?还是我必须自己进入Photoshop并将每个图片切割出来,并在代码中调用它们?


一个画布元素可以让你“剪切”出一些东西,但具体如何做取决于您对要对这些碎片执行的操作的确切要求。 - Pointy
我希望这些拼图能够可拖动和可放置。目前我正在使用Jquery完成此任务,但由于该功能不受支持且第三方插件无法正常工作,因此我正在避免使用Jquery。如果HTML5可以实现拖放功能,我可能会转换到HTML5。无论如何,我基本上希望有20个不同的图像,我可以将它们拖放到一个框架中,以便“解决”拼图问题。 - TheChes44
3个回答

33

使用Canvas很容易实现。一般的思路是:

var image = new Image();
image.onload = cutImageUp;
image.src = 'myimage.png';

function cutImageUp() {
    var imagePieces = [];
    for(var x = 0; x < numColsToCut; ++x) {
        for(var y = 0; y < numRowsToCut; ++y) {
            var canvas = document.createElement('canvas');
            canvas.width = widthOfOnePiece;
            canvas.height = heightOfOnePiece;
            var context = canvas.getContext('2d');
            context.drawImage(image, x * widthOfOnePiece, y * heightOfOnePiece, widthOfOnePiece, heightOfOnePiece, 0, 0, canvas.width, canvas.height);
            imagePieces.push(canvas.toDataURL());
        }
    }

    // imagePieces now contains data urls of all the pieces of the image

    // load one piece onto the page
    var anImageElement = document.getElementById('myImageElementInTheDom');
    anImageElement.src = imagePieces[0];
}

2
这可能会导致SecurityError:在“HTMLCanvasElement”上执行“toDataURL”失败:污染的画布可能无法导出。 - Mert Mertce
2
因为CORS的缘故 你可以设置: img.setAttribute('crossOrigin', 'anonymous'); 参考: https://dev59.com/JGIj5IYBdhLWcg3wRjWr#20424457 - Sarat Chandra

27
你可以通过将图像设置为 div 的背景,然后设置其背景位置来实现此操作。这与使用 CSS Sprites 基本相同。
(假设每个部分都是 100 x 100 像素)
<div class="puzzle piece1"></div>
<div class="puzzle piece2"></div>

CSS:

.puzzle {
   background-image:url(/images/puzzle.jpg);
   width:100px;
   height:100px;
}

.piece1 {
   background-position:0 0
}

.piece2 {
   background-position:-100px -100px
}

1

您可以使用drawImage方法来切割源图像的部分并将它们绘制到画布上:

drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 

https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Using_images

类似这样的:

  document.getElementById("vangogh").onclick=function()
    {
    draw();
    }; 

 function draw() {
    var ctx = document.getElementById('canvas').getContext('2d');
    ctx.drawImage(document.getElementById('source'),33,45);
                 }

然后为您的新实体创建可拖动内容:

<div id="columns">
   <div class="column" draggable="true"><header>A</header></div>
   <div class="column" draggable="true"><header>B</header></div>
   <div class="column" draggable="true"><header>C</header></div>
</div>

http://www.html5rocks.com/en/tutorials/dnd/basics/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接