A spritesheet image object that contains sprites...
var spritesheet = new Image(); spritesheet.src ="foo.png";
I would like to be able to get a sub image from that spritesheet variable with the desired x, y, width, and height. And then assign a variable that is the sub image of the spritesheet.
How do I do that?
Using a div
with backgroundPosition makes this easy since it will auto-clip for us without having to use overflow
.
For example, here is the texture atlas from the popular Cookie Clicker idle game.
Using a negative offset for x and y we can select a sub-sprite from the texture atlas:
// Inputs -- change this based on your art var tw = 48; // Texture Atlas Tile Width (pixels) var th = 48; // Texture Atlas Tile Height (pixels) var tx = 3; // tile index x (relative) (column) var ty = 2; // tile index y (relative) (row) var src = 'http://orteil.dashnet.org/cookieclicker/img/icons.png'; // Calculations -- common code to sub-image of texture atlas var div = document.getElementById('clip'); var x = (tx*tw); // tile offset x position (absolute) var y = (ty*th); // tile offset y position (absolute) div.style.width = tw + 'px'; div.style.height = th + 'px'; div.style.backgroundImage = "url('" + src + "')"; div.style.backgroundPosition = '-' + x + 'px -' + y + 'px'; // You don't need the remaining parts. They are only to // show the sub-sprite in relation to the texture atlas div.style.border = "1px solid blue"; // only for demo purposes // highlight where in the original texture the sub sprite is var rect = document.getElementById('sprites').parentNode.getBoundingClientRect(); var hi = document.getElementById('highlight'); hi.style.zIndex = 999; // force to be on top hi.style.position = "absolute"; hi.style.width = tw + 'px'; hi.style.height = th + 'px'; hi.style.left = (rect.left + x) + 'px'; hi.style.top = (rect.top + th + y) + 'px'; // skip sub-sprite height hi.style.border = '1px solid red';
<div id="clip"></div> <img id="sprites" src="http://orteil.dashnet.org/cookieclicker/img/icons.png"> <div id="highlight"></div>
Here's one way:
Create an in-memory canvas to clip the subsprite pixels from the spritesheet and draw those clipped pixels on that canvas
Create a new subsprite image from that canvas's dataURL.
Example code (not tested--may need tweeking):
var spritesheet = new Image();
spritesheet.onload=function(){
// specify desired x,y,width,height
// to be clipped from the spritesheet
var x=0;
var y=0;
var w=10;
var h=10;
// create an in-memory canvas
var canvas=document.createElement('canvas');
var ctx=canvas.getContext('2d');
// size the canvas to the desired sub-sprite size
canvas.width=w;
canvas.height=h;
// clip the sub-sprite from x,y,w,h on the spritesheet image
// and draw the clipped sub-sprite on the canvas at 0,0
ctx.drawImage(spritesheet, x,y,w,h, 0,0,w,y);
// convert the canvas to an image
var subsprite=new Image();
subsprite.onload=function(){ doCallback(subsprite); };
subsprite.src=canvas.toDataURL();
}
spritesheet.src ="foo.png";
function doCallback(img){
// do something with the new subsprite image
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.