npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

png-js-palettized

v1.2.1

Published

A PNG decoder that supports palette manipulation.

Downloads

6

Readme

png-js

This is a modified version of png.js that is intended to be used for palette swapping within the browser.

NOTE: Only supports indexed PNGs for obvious reasons. All others will cause IndexedPNG to throw during construction.

Usage

The following shows the process of loading a PNG file and rendering it to a canvas with its palette data reversed.

import { IndexedPNG }   from '@kettek/png-js/src'
import { readFile   }   from 'fs'

readFile("my_png.png", (err, data) => {
    if (err) throw err
    
    // Create an IndexedPNG object from our data.
    let png = new IndexedPNG(data)
    
    // Preemptively decode PNG data (optional).
    png.decode()
    
    // Convert our PNG data into an ImageData, usable by a Canvas. Passed options provide a reversed palette and a clipping.
    png.toImageData({
      palette: png.decodePalette().reverse(),
      clip: {
        x: 16,
        y: 16,
        w: 32,
        h: 32
      }
    })
    .then(imageData => {
      // This presumes at least one canvas element exists on the page.
      document.getElementsByTagName('canvas')[0]
      .getContext('2d')
      .putImageData(imageData, 0, 0)
    })
    .catch(err => {
        throw err
    })
})

Types

IndexedPNG

IndexedPNG(Buffer) : processes PNG data but does not decode it.

async decodePixels() : Decodes the PNG pixel data and returns it.

decodePalette() : Decodes the PNG palette and returns it as a Palette.

async decode() : Decodes the palette and the pixel data of the PNG data passed into the constructor. Calls decodePixels() and decodePalette().

ImageData async toImageData(ImageDataOptions) : Returns ImageData. Calls toPNGData(options).

PNGData async toPNGData(ImageDataOptions) : Returns PNGData. Calls decode() automatically if PNG has not been decoded.

ImageDataOptions

Object containing options to apply during toImageData().

| Property | Type | Description |----------|---------------------|--------------- | palette | Palette | Palette data to use for decoding. | clip | Clip | Clipping options to use for decoding.

Palette

A Buffer or Array containing the palette RGBA palette data.

let palette = [
    255, 0  ,  0  , 255, // Index 0
    0  , 255,  0  , 255, // Index 1
    0  , 0  ,  255, 255, // Index 2
    ...
]

Clip

Options to clip pixel data.

| Property | Type | Defaults | Description |----------|--------|--------------|------------- | x | Number | 0 | Starting X coordinate. | y | Number | 0 | Starting Y coordinate. | w | Number | width - x | Width of clip. | h | Number | height - y | Height of clip.

let clip = {
    x: 16,
    y: 16,
    w: 32,
    h: 32,
}

PNGData

Object containing the pixel data and row width.

| Property | Type
|----------|------------ | pixels | Uint8ClampedArray | RGBA pixel data. | width | Number | Width of each row of pixel data.