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

ajpng-x

v0.2.0

Published

Library for rendering APNG and AJPNG files in browsers with canvas support

Downloads

5

Readme

ajpng v0.1.0

Library to display APNG (Wikipedia, specification) and AJPNG in a browser using canvas.

Based in large parts on apng-canvas.

AJPNG

AJPNG is an animated image file format similar to APNG, allowing the use of JPEG encoded animation frames with optional PNG encoded alpha channel. This makes it possible to create true color Cinemagraphs with an optional 8 bit alpha channel, using lossy compression to keep file size small.

Demo

http://madeinhaus.github.io/ajpng/

Build instructions

Clone and install dependencies:

git clone https://github.com/MadeInHaus/ajpng.git
cd ajpng
npm install

Create minified build (./build/ajpng.min.js):

gulp prod

Create development build with source maps (./build/ajpng.js):

gulp

Or use with Browserify:

npm install ajpng --save

Usage example

var images = document.querySelectorAll(".ajpng-image");
for (var i = 0; i < images.length; i++) {
    AJPNG.animateImage(images[i]);
}

API

The library creates a global object AJPNG.

You can also use ajpng with popular module loaders (AMD, CommonJS) and packagers (Browserify).

Most methods work asynchronously and return the ES6 Promise object. Most browsers have built-in support for it. For others browsers, the library uses a polyfill (included in the library).

High-level methods:

AJPNG.ifNeeded([ignoreNativeAPNG boolean])

Checks whether there is a need to use the library.

Note: AJPNG always needs the library because that format is not (and probably never will be) supported by any browser.

Fulfilled (no value): The browser supports everything for the technology to work, but it does not support AJPNG. Usually the library should only be used in this case.

If optional argument ignoreNativeAPNG is true, then native APNG support isn't tested.

Rejected (no value): The browser has native support for APNG (if ignoreNativeAPNG not used) or does not support all the necessary technologies for it to work.

AJPNG.animateImage(img HTMLImageElement)

Creates a canvas element where the AJPNG animation plays. The img element is removed from the DOM and replaced by canvas. The img element attributes are preserved during replacement.

Fulfilled (no value): The img element is an AJPNG image.

Rejected (no value): The img element is not an AJPNG image, or there was an error when processing it. In this case the element is not replaced with canvas.

AJPNG.releaseCanvas(canvas HTMLCanvasElement)

Detaches canvas from animation loop. May be useful for dynamic created AJPNG-images. This is a synchronous method, it does not return a result.

Low-level methods:

AJPNG.checkNativeFeatures()

Checks which technologies are supported by the browser.

Fulfilled (Features): Returns the Features object with the following fields:

{
    TypedArrays:           boolean
    BlobURLs:              boolean
    requestAnimationFrame: boolean
    pageProtocol:          boolean
    canvas:                boolean
    APNG:                  boolean
}

Each field has the value true or false. true means the browser has built-in support for the relevant technology. The pageProtocol field has the value true if the page is loaded over the http or https protocol (the library does not work on pages downloaded over other protocols).

The library can work if all fields except APNG have the value true.

Rejected: N/A.

AJPNG.parseBuffer(data ArrayBuffer)

Parses binary data from the AJPNG-file.

Fulfilled (Animation): If the transmitted data are valid AJPNG, then the Animation object is returned with the following fields:

{
    // Properties
    
    width:      int // image width
    height:     int // image height
    numPlays:   int // number of times to loop this animation.  0 indicates infinite looping.
    playTime:   int // time of full animation cycle in millisecond
    frames: [       // animation frames
        {
            width:  int // frame image width
            height: int // frame image height
            left:   int // frame image horizontal offset 
            top:    int // frame image vertical offset
            delay:  int // frame delay in millisecond
            disposeOp:  int // frame area disposal mode (see spec.)
            blendOp:    int // frame area blend mode (see spec.)
            img:    HTMLImageElement // frame image                   
        }
    ]
    
    // Methods
    
    isPlayed(): boolean     // is animation playing now?  
    isFinished(): boolean   // is animation finished (if numPlays <> 0)? 
    play()                  // play animation (if not playing and not finished)
    rewind()                // rewind animation to initial state and stop it
    addContext(CanvasRenderingContext2D)    // play animation on this canvas context 
                                            // (one animation may be played on many contexts)
    removeContext(CanvasRenderingContext2D) // remove context from animation
}

Rejected (string): The file is not valid AJPNG, or there was a parsing error. Returns a string with an error message.

AJPNG.parseURL(url string)

Downloads an image from the supplied URL and parses it.

Fulfilled (Animation): If the downloaded data are valid AJPNG, then the Animation object is returned (see AJPNG.parseBuffer). The same Animation object is returned for the same URL.

Rejected (mixed): There was an error when downloading or parsing.

AJPNG.animateContext(url string, CanvasRenderingContext2D context)

Downloads an image from the supplied URL, parses it, and plays it in the given canvas environment.

Fulfilled (Animation): Similar to output of AJPNG.parseURL.

Rejected (mixed): There was an error when downloading or parsing.

Limitations

The library requires the following technologies in order to run:

These technologies are supported in all modern browsers and IE starting with version 10.

Some browsers (Firefox and Safari 8) have native support for APNG. This library is not required for these browsers.

XMLHttpRequest

Images are loaded using XMLHttpRequest, therefore, the HTML page and AJPNG image must be located on the same domain or the correct CORS header should be provided (for example, Access-Control-Allow-Origin: *). For the same reason, the library will not work on a local machine (using the protocol file://).

Proxies

Compression proxies (turbo mode in Opera, "reduce data usage" mode in mobile Chrome, etc), doesn't know about AJPNG format. These proxies transforms AJPNGs into static images. To prevent this for your images, they need to be served with Cache-Control: no-transform HTTP header (see big article about such proxies), or via HTTPS.

License

MIT