Skip to content
Interlaces raw pixel buffers from multiple images into one suitable for lenticular printing purposes
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
.gitignore
.npmignore
.travis.yml
package-lock.json
package.json
readme.md
tsconfig.json

readme.md

Lenticular interlacer Build Status Coverage Status

Interlaces raw pixel buffers from two or more images either horizontally or vertically for lenticular printing purposes.

╔═══════════╗     ╔═══════════╗     ╔═══════════╗
║###########║     ║///////////║     ║###########║
║###########║     ║///////////║     ║///////////║
║###########║  +  ║///////////║  =  ║###########║
║###########║     ║///////////║     ║///////////║
║###########║     ║///////////║     ║###########║
╚═══════════╝     ╚═══════════╝     ╚═══════════╝

Raw pixel buffers

A raw pixel buffer is an image's pixels as a long list of flat channel data.

   2*2 px 3 channels      
╔═════════════════════╗   
║(255,0,0) (255,255,0)║   
║(64,64,0) (255,0,255)║
║(255,0,0) (255,255,0)║   
╚═════════════════════╝
= Buffer [255,0,0,255,255,0,64,64,0,255,0,255,255,0,0,255,255,0]   

Installation

npm install lenticular-interlacer

Usage

const Interlacer = require('lenticular-interlacer');

// Construct an Interlacer instance
const interlacer = new Interlacer(
    60, // LPI - Lenses per inch
    600, // DPI - DPI in which it will be printed
    true // Orientation - horizontal/vertical: true/false
);

// Add an image to be interlaced
interlacer.push(
    myBuffer, // Raw pixel buffer
    3, // Number of channels (RGB = 3, RGBA = 4)
    200, // Image width
    100, // Image height 
);

// ...add another
interlacer.push(anotherBuffer, 3, 300, 300);

// Interlace
const {
    buffer,
    channels,
    width,
    height,
} = interlacer.interlace();

Example

const Interlacer = require('lenticular-interlacer');
const sharp = require('sharp');

// Source images:
// image1.jpg 400x400 RGB (3 channels)
// image2.png 500x500 RGBA (4 channels)

Promise.all([
    sharp('image1.jpg').raw().toBuffer(),
    sharp('image2.png').raw().toBuffer(),
])
    .then(([image1, image2]) => {
        const interlacer = new Interlacer(
            61,
            366,
            true
        );
        
        interlacer
            .push(image1, 3, 400, 400)
            .push(image2, 4, 500, 500);
        
        const { buffer, channels, width, height } = interlacer.interlace();
        
        // Produce a 400x400 RGB TIFF image in 366 DPI
        return sharp(buffer, { raw: { width, height, channels } })
            .tiff({
                // TIFF DPI is set in dots per mm
                xres: 366 / 2.54,
                yres: 366 / 2.54,
            })
            .toFile('output.tiff');
    });

License

MIT

You can’t perform that action at this time.