openjpegjs
This JavaScript/WebAssembly build of OpenJPEG is made possible by Emscripten and Chris Hafey.
Table of Contents
...
Features
Installing
Using npm:
$ npm install @cornerstonejs/codec-openjpeg
Using pnpm:
$ pnpm add @cornerstonejs/codec-openjpeg
Using unpkg CDN:
<script src="https://unpkg.com/@cornerstonejs/codec-openjpeg"></script>
Try It Out!
Try it in your browser here
openjpegjs API
Creating an instance
// JS / WASM promises resolve the library
const openjpegwasm = await OpenJPEGWASM;
const openjpegjs = await OpenJPEGJS;
// Decoder
const J2KDecoder = new openjpegjs.J2KDecoder();
// Encoder
const J2KEncoder = new openjpegjs.J2KEncoder();
Decoder instance methods
J2KDecoder#getEncodedBuffer([encodedBitStreamLength: int]): ArrayBufferJ2KDecoder#getDecodedBuffer(): ArrayBufferJ2KDecoder#readHeader(): ?J2KDecoder#calculateSizeAtDecompositionLevel(decodeLevel: int): voidJ2KDecoder#decode(): voidJ2KDecoder#decodeSubResolution(decodeLevel: int, decodeLayer: int)J2KDecoder#getFrameInfo(): FrameInfoJ2KDecoder#getNumDecomposition(): intJ2KDecoder#getIsReversible(): boolJ2KDecoder#getProgressionOrder(): intJ2KDecoder#getImageOffset(): PointJ2KDecoder#getTileSize(): SizeJ2KDecoder#getTileOffset(): PointJ2KDecoder#getBlockDimensions(): SizeJ2KDecoder#getNumLayers(): intJ2KDecoder#getColorSpace(): int
// ~ Setup
// const encodedArrayBuffer = ...;
const fullEncodedBitStream = new Uint8Array(encodedArrayBuffer);
const numBytes = 0;
const encodedBitStream = new Uint8Array(encodedArrayBuffer, 0, fullEncodedBitStream.length -numBytes);
// ~ DECODE
const encodedBuffer = decoder.getEncodedBuffer(encodedBitStream.length);
encodedBuffer.set(encodedBitStream);
decoder.decode(); // or .decodeSubResolution() to go by layer or level
// ~ Display (see example index.html file)
const decodedBuffer = decoder.getDecodedBuffer();
const frameInfo = decoder.getFrameInfo(); // width/height will be wrong if using decodeSubResolution
const interleaveMode = 2;
// In example index.html file
display(frameInfo, decodedBuffer, interleaveMode)
Encoder instance methods
J2KEncoder#getDecodedBufferJ2KEncoder#getEncodedBufferJ2KEncoder#encodeJ2KEncoder#setDecompositionsJ2KEncoder#setQualityJ2KEncoder#setProgressionOrderJ2KEncoder#setDownSampleJ2KEncoder#setImageOffsetJ2KEncoder#setTileSizeJ2KEncoder#setTileOffsetJ2KEncoder#setBlockDimensionsJ2KEncoder#setNumPrecinctsJ2KEncoder#setPrecinctJ2KEncoder#setCompressionRatio
Contributing
It can be difficult to contribute if your environment is not setup correctly. I highly recommend trying out VS Code's "Dev Containers" that make it easier to share and use a consistent development environment.
Dev Containers
Requirements
- VS Code and Docker Desktop
- Remote-Containers extension
- Command Pallete -->
Remote-Containers: Open Folder in Container
How to Run
- Run
pnpm installin the main codecs folder - Run
git submodule update --init --recursivein the main codecs folder to initiate submodules - Go to packages/openjpeg folder
- Run
pnpm run build
Testing
pnpm run build # compile wasm into dist/
pnpm run test # run vitest against dist/
Tests skip cleanly when dist/ is absent.