Convert HEIC/HEIF images to JPEG and PNG
npm install heic-convert
Convert the main image in a HEIC to JPEG
const { promisify } = require('util');
const fs = require('fs');
const convert = require('heic-convert');
(async () => {
const inputBuffer = await promisify(fs.readFile)('/path/to/my/image.heic');
const outputBuffer = await convert({
buffer: inputBuffer, // the HEIC file buffer
format: 'JPEG', // output format
quality: 1 // the jpeg compression quality, between 0 and 1
});
await promisify(fs.writeFile)('./result.jpg', outputBuffer);
})();
Convert the main image in a HEIC to PNG
const { promisify } = require('util');
const fs = require('fs');
const convert = require('heic-convert');
(async () => {
const inputBuffer = await promisify(fs.readFile)('/path/to/my/image.heic');
const outputBuffer = await convert({
buffer: inputBuffer, // the HEIC file buffer
format: 'PNG' // output format
});
await promisify(fs.writeFile)('./result.png', outputBuffer);
})();
Convert all images in a HEIC
const { promisify } = require('util');
const fs = require('fs');
const convert = require('heic-convert');
(async () => {
const inputBuffer = await promisify(fs.readFile)('/path/to/my/image.heic');
const images = await convert.all({
buffer: inputBuffer, // the HEIC file buffer
format: 'JPEG' // output format
});
for (let idx in images) {
const image = images[idx];
const outputBuffer = await image.convert();
await promisify(fs.writeFile)(`./result-${idx}.jpg`, outputBuffer);
}
})();
The work to convert an image is done when calling image.convert()
, so if you only need one of the images in a multi-image file, you can convert just that one from the images
array and skip doing any work for the remaining images.
Note that while the converter returns a Promise and is overall asynchronous, a lot of work is still done synchronously, so you should consider using a worker thread in order to not block the main thread in highly concurrent production environments.
While the NodeJS version of heic-convert
may be compiled for use in the browser with something like webpack
, not all build tools necessarily like to compile all modules well. However, what further complicates things is that this module uses pure-javascript implementations of a jpeg and png encoder. But the browser has its own native encoders! Let's just use those instead of including a ton of extra code in your bundle.
When compiling a client-side project, use:
const convert = require('heic-convert/browser');
This is currently only supported in the main thread. Support for workers may be added in the future, but if you need it sooner, please create an issue or even a PR!
- heic-cli - convert heic/heif images to jpeg or png from the command line
- heic-decode - decode heic images to raw image data
- libheif-js - libheif as a pure-javascript npm module