Gathering detailed insights and metrics for spritesmith
Gathering detailed insights and metrics for spritesmith
Gathering detailed insights and metrics for spritesmith
Gathering detailed insights and metrics for spritesmith
Utility that takes sprites and converts them into a stylesheet and its coordinates
npm install spritesmith
Module System
Min. Node Version
Typescript Support
Node Version
NPM Version
917 Stars
580 Commits
56 Forks
43 Watching
4 Branches
7 Contributors
Updated on 26 Nov 2024
JavaScript (100%)
Cumulative downloads
Total Downloads
Last day
-3.3%
11,414
Compared to previous day
Last week
-2.3%
57,690
Compared to previous week
Last month
13.3%
281,688
Compared to previous month
Last year
-39.5%
3,205,472
Compared to previous year
Convert images into spritesheets and coordinate maps.
spritesmith
is also available as:
A folder of icons processed by spritesmith
:
generates a spritesheet:
and a coordinate map:
1{ 2 "/home/todd/github/spritesmith/docs/fork.png": { 3 "x": 0, 4 "y": 0, 5 "width": 32, 6 "height": 32 7 }, 8 "/home/todd/github/spritesmith/docs/github.png": { 9 "x": 32, 10 "y": 0, 11 "width": 32, 12 "height": 32 13 }, 14 // ... 15}
spritesmith
?Support us via donations or spread word on Twitter
We have moved from result.image
being a binary string to it being a Buffer
. This is to use more canonical conventions in Node.js.
We have moved from spritesmith-engine-spec@1.1.0 to spritesmith-engine-spec@2.0.0. This means if you use an custom engine (e.g. gmsmith
, canvassmith
), then you will need to upgrade it.
1npm install my-engine-smith@latest --save-dev
By upgrading the engine, we added support for Vinyl objects via src
as well as future-proof ourselves for forwarding streaming outputs.
We have updated our API to return streams for images. This required moving to a constructor
and splitting apart image creation and processing.
We have maintained legacy support for spritesmith
via Spritesmith.run
which has an identical API to the spritesmith
function in spritesmith<3.0.0
.
1// Before 2var spritesmith = require('spritesmith'); 3spritesmith({src: sprites}, function handleResult (err, result) { /* ... */ }); 4 5// After 6var Spritesmith = require('spritesmith'); 7Spritesmith.run({src: sprites}, function handleResult (err, result) { /* ... */ });
spritesmith
can be installed via npm: npm install spritesmith
1// Load in dependencies 2var Spritesmith = require('spritesmith'); 3 4// Generate our spritesheet 5var sprites = ['fork.png', 'github.png', 'twitter.png']; 6Spritesmith.run({src: sprites}, function handleResult (err, result) { 7 result.image; // Buffer representation of image 8 result.coordinates; // Object mapping filename to {x, y, width, height} of image 9 result.properties; // Object with metadata about spritesheet {width, height} 10});
We support streaming output by breaking down run
into 2 parts:
1// Load in dependencies 2var Spritesmith = require('spritesmith'); 3 4// Create a new spritesmith and process our images 5var sprites = ['fork.png', 'github.png', 'twitter.png']; 6var spritesmith = new Spritesmith(); 7spritesmith.createImages(sprites, function handleImages (err, images) { 8 images[0].width; // Width of image 9 images[0].height; // Height of image 10 11 // Create our result 12 var result = spritesmith.processImages(images); 13 result.image; // Readable stream outputting image 14 result.coordinates; // Object mapping filename to {x, y, width, height} of image 15 result.properties; // Object with metadata about spritesheet {width, height} 16});
spritesmith
exports a Spritesmith
constructor as its module.exports
.
If you would like a faster build time or need to support an obscure image format, see params.engine
.
If you would like to adjust how images are laid out, see params.algorithm
and params.algorithmOpts
.
Spritesmith.run(params, callback)
Helper function that initializes a new Spritesmith
instance, creates images, and processes them into a spritesheet
Object
- Container for parameters
String[]|Object[]
- Same as src
for spritesmith.createImages
new Spritesmith
or processImages
should be passed in here (e.g. engine
, algorithm
)Function
- Error-first function that receives compiled spritesheet and information
callback
should have signature function (err, result)
Error|null
- If an error occurred, this will be itObject
- Container for result items
spritesmith.processImages
(i.e. {image, coordinates, properties}
)Buffer
- In-memory representation of imageObject
- Same as coordinates
returned by spritesmith.processImages
Object
- Same as properties
returned by spritesmith.processImages
new Spritesmith(params)
Constructor for a new Spritesmith
instance
Object
- Container for parameters
String|Object
- Optional engine override to use
pixelsmith
, a node-based spritesmith
engineengine
can be found in the Examples sectionObject
- Options to pass through to engine for settings
phantomjssmith
accepts timeout
via {engineOpts: {timeout: 10000}}
spritesmith.createImages(src, callback)
Interpret images via the spritesmith
engine
String[]|Object[]
- Array of filepaths for images to include in spritesheet
String
is provided, then it's used as the image's filepathObject
is provided, then it should be a Vinyl object pointing to the source image
gmsmith
uses filepaths only)Function
- Error-first function that receives compiled spritesheet and map
callback
should have signature function (err, images)
Error|null
- If an error occurred, this will be itObject[]
- Array of processed images
image
will be a proprietary object for the engineimage
will line up with the specification from spritesmith-engine-specObject
- Metadata container about corresponding input image at same index
Number
- Height in pixels of corresponding input image at same indexNumber
- Width in pixels of corresponding input image at same indexspritesheet.processImages(images, options)
Place interpretted images on a canvas and export spritesheet
Object[]
- Images generated via spritesmith.createImages
Object
- Container for options
Number
- Padding to use between images
2
is provided, then there will be a 2px
gap to the right and bottom between each imagepadding
can be found in the Examples sectionMixed
- Options to pass through to engine for export
gmsmith
supports quality
via {exportOpts: {quality: 75}}
String
- Optional algorithm to pack images with
binary-tree
which packs images as efficiently as possiblealgorithm
can be found in the Examples sectionObject
- Optional algorithm options to pass through to algorithm for layout
top-down
supports ignoring sorting via {algorithmOpts: {sort: false}}
Returns:
Object
- Container for result information
ReadableStream
- Readable stream outputting generated image contentsObject
- Map from filepath to coordinate information between original sprite and spritesheet
filepath
will be the same as provided in params.src
Object
- Container for coordinate information
result.coordinates[filepath]
Number
- Horizontal position of top-left corner of original sprite on spritesheetNumber
- Vertical position of top-left corner of original sprite on spritesheetNumber
- Width of original spriteNumber
- Height of original spriteObject
- Container for information about spritesheet
Number
- Width of the spritesheetNumber
- Height of the spritesheetImages can be laid out in different fashions depending on the algorithm. We use layout
to provide you as many options as possible. At the time of writing, here are your options for params.algorithm
:
top-down | left-right | diagonal | alt-diagonal | binary-tree |
---|---|---|---|---|
More information can be found in the layout
documentation:
https://github.com/twolfson/layout
An engine can greatly improve the speed of your build (e.g. canvassmith
) or support obscure image formats (e.g. gmsmith
).
All spritesmith
engines adhere to a common specification:
https://github.com/twolfson/spritesmith-engine-spec
This repository adheres to specification version: 2.0.0
Below is a list of known engines with their tradeoffs:
pixelsmith
is a node
based engine that runs on top of get-pixels
and save-pixels
.
Key differences: Doesn't support uncommon image formats (e.g. tiff
) and not as fast as a compiled library (e.g. canvassmith
).
phantomjssmith
is a phantomjs based engine. It was originally built to provide cross-platform compatibility but has since been succeeded by pixelsmith
.
Requirements: phantomjs must be installed on your machine and on your PATH
environment variable. Visit the phantomjs website for installation instructions.
Key differences: phantomjs
is cross-platform and supports all image formats.
canvassmith
is a node-canvas based engine that runs on top of Cairo.
Requirements: Cairo and [node-gyp][] must be installed on your machine.
Instructions on how to install Cairo are provided in the [node-canvas wiki][].
[node-gyp][] should be installed via npm
:
1npm install -g node-gyp
Key differences: canvas
has the best performance (useful for over 100 sprites). However, it is UNIX
only.
[node-canvas wiki]: (https://github.com/LearnBoost/node-canvas/wiki/_pages [node-gyp]: https://github.com/TooTallNate/node-gyp/
gmsmith
is a gm
based engine that runs on top of either Graphics Magick or Image Magick.
Requirements: Either Graphics Magick or Image Magick must be installed on your machine.
For the best results, install from the site rather than through a package manager (e.g. apt-get
). This avoids potential transparency issues which have been reported.
Image Magick is implicitly discovered. However, you can explicitly use it via engineOpts
1{ 2 engineOpts: { 3 imagemagick: true 4 } 5}
Key differences: gmsmith
allows for configuring image quality whereas others do not.
This is an example of using a custom layout via the alt-diagonal
algorithm.
1// Load in dependencies 2var fs = require('fs'); 3var Spritesmith = require('spritesmith'); 4 5// Generate our spritesheet 6Spritesmith.run({ 7 src: [ 8 __dirname + '/fork.png', 9 __dirname + '/github.png', 10 __dirname + '/twitter.png' 11 ], 12 algorithm: 'alt-diagonal' 13}, function handleResult (err, result) { 14 // If there was an error, throw it 15 if (err) { 16 throw err; 17 } 18 19 // Output the image 20 fs.writeFileSync(__dirname + '/alt-diagonal.png', result.image); 21 result.coordinates, result.properties; // Coordinates and properties 22});
Result:
This is an example of using a custom engine (canvassmith
in this case).
1// Inside package.json 2{ 3 "dependencies": { 4 "canvassmith": "~0.2.4" 5 } 6}
1// In our script 2// Load in dependencies 3var fs = require('fs'); 4var Spritesmith = require('spritesmith'); 5 6// Generate our spritesheet 7Spritesmith.run({ 8 src: [ 9 __dirname + '/fork.png', 10 __dirname + '/github.png', 11 __dirname + '/twitter.png' 12 ], 13 engine: require('canvassmith') 14}, function handleResult (err, result) { 15 // If there was an error, throw it 16 if (err) { 17 throw err; 18 } 19 20 // Output the image 21 fs.writeFileSync(__dirname + '/canvassmith.png', result.image); 22 result.coordinates, result.properties; // Coordinates and properties 23});
Result:
This is an example of adding padding between images.
1// Load in dependencies 2var fs = require('fs'); 3var Spritesmith = require('spritesmith'); 4 5// Generate our spritesheet 6Spritesmith.run({ 7 src: [ 8 __dirname + '/fork.png', 9 __dirname + '/github.png', 10 __dirname + '/twitter.png' 11 ], 12 padding: 20 // Exaggerated for visibility, normally 1 or 2 13}, function handleResult (err, result) { 14 // If there was an error, throw it 15 if (err) { 16 throw err; 17 } 18 19 // Output the image 20 fs.writeFileSync(__dirname + '/padding.png', result.image); 21 result.coordinates, result.properties; // Coordinates and properties 22});
Result:
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint via npm run lint
and test via npm test
.
GitHub and Twitter icons were taken from Alex Peattie's JustVector Social Icons.
Fork designed by P.J. Onori from The Noun Project
Plus and Equals icons were built using the Ubuntu Light typeface.
Copyright (c) 2012 Todd Wolfson
Licensed under the MIT license.
No vulnerabilities found.
Reason
no binaries found in the repo
Reason
0 existing vulnerabilities detected
Reason
license file detected
Details
Reason
5 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 5
Reason
Found 3/30 approved changesets -- score normalized to 1
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
security policy file not detected
Details
Reason
project is not fuzzed
Details
Reason
branch protection not enabled on development/release branches
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Score
Last Scanned on 2024-11-18
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More