Skip to content

node-3d/image-raub

Repository files navigation

Image for Node.js

This is a part of Node3D project.

NPM ESLint Test Cpplint

npm i -s image-raub

Node.js N-API addon implementing the HTMLImageElement. It is useful for other Node.js addons that operate on decoded images.

Note: this addon uses N-API, and therefore is ABI-compatible across different Node.js versions. Addon binaries are precompiled and there is no compilation step during the npm i command.

Load images from:

  • Local file.
  • Data URI.
  • Http(s) URL.
  • Node.js Blob URL.
  • Raw RGBA pixel data

FreeImage is used as back-end.

Additional features:

  • save - saves the image to a local file.
  • drawImage - is similar to drawImage.

Image

const Image = require('image-raub');

See TypeScript defenitions for more details.

Set window icon

Compatible with glfw-raub window.icon property.

const icon = new Image();
icon.src = __dirname + '/icons/logo.png';
icon.on('load', () => { window.icon = icon; });

Load an OpenGL texture

Here Image is used to load a texture. The constructed object receives src property, then the file is read and 'load' event is emitted. After that, image.data is available as a Buffer, containing the whole pixel data, and image.width/image.height contain the dimensions.

const Image = require('image-raub');
const image = new Image();
// Web-style onload
image.onload = () => {
	gl.bindTexture(gl.TEXTURE_2D, texture);
	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
	gl.generateMipmap(gl.TEXTURE_2D);
	gl.bindTexture(gl.TEXTURE_2D, null);
};

image.src = `${__dirname}/texture.jpg`;

Make an OpenGL snapshot

Image can save its current content to the filesystem. It can also load from raw pixel values using static fromPixels() method.

const memSize = screen.w * screen.h * 4; // estimated number of bytes
const storage = { data: Buffer.allocUnsafeSlow(memSize) };

gl.readPixels(
	0, 0,
	screen.w, screen.h,
	gl.RGBA,
	gl.UNSIGNED_BYTE,
	storage
);

const img = Image.fromPixels(screen.w, screen.h, 32, storage.data);

img.save(`${Date.now()}.jpg`);