Openhtjs
JavaScript library for decoding HT codestreams
Install / Use
/learn @sandflow/OpenhtjsREADME
openHTJS
__ ________ _______
____ ____ ___ ____ / / / /_ __/ / / ___/
/ __ \/ __ \/ _ \/ __ \/ /_/ / / /_ / /\__ \
/ /_/ / /_/ / __/ / / / __ / / / /_/ /___/ /
\____/ .___/\___/_/ /_/_/ /_/ /_/\____//____/
/_/
Introduction
openHTJS is a JavaScript library for decoding HT codestreams. HT codestreams are JPEG 2000 codestreams that use the ultra-fast block decoder specified in Rec. ITU-T T.814 | ISO/IEC 15444-15.
It is built on top of the OpenJPH library, which it compiles to JavaScript using Emscripten. It is heavily inspired by the openjphjs project.
Known issues and limitations
Bugs are tracked at https://github.com/sandflow/openhtjs/issues.
Dependencies
openHTJS does not depend on external libraries. It requires support for WebAssembly and ES6 modules.
Quick start
See src/test/site for an example that fetches a codestream and decodes into a Canvas element.
API
General
HT.js is an ES6 module that exposes a single Decoder class:
import {Decoder} from "./HT.js"
For each codestream, the overall call flow is as follows:
- a
Decoder()is instantiated - the codestream is written into the buffer returned by
Decoder::getCodestreamBuffer() - the codestream header is parsed using
Decoder::readHeader() - ...
- the codestream is decoded either:
- line by line by calling
Decoder::startDecoding()followed by multiple calls toDecoder::decodeLineAsUnsignedSamples() - directly into an RGBA 8-bit buffer using
Decoder::decodeToRGBAArray()
- line by line by calling
Constructor
Decoder(codestreamSize)
codestreamSizeis the size of the codestream in bytes that will be decoder. The codestream is not required to be complete.
A Decoder object must instantiated for each codestream to be decoded.
getCodestreamBuffer()
UInt8Array getCodestreamBuffer()
Returns a view to the codestream buffer, which the client must fill with the codestream, e.g.:
let decoder = new Decoder(j2c_bytes.length);
const decoder_buffer = decoder.getCodestreamBuffer();
decoder_buffer.set(j2c_bytes);
readHeader()
readHeader()
Parses the codestream header. Must be called before any method, other than getCodestreamBuffer() is called.
getDecodedImageSize()
Size getDecodedImageSize(int decompositionLevel)
Returns the decoded image size at decomposition level decompositionLevel. decompositionLevel = 0 means the full image resolution.
startDecoding()
Size startDecoding(int decompositionLevel, bool requestPlanar)
Starts the decoding process.
-
decompositionLevelindicates that the decomposition level to which the image is decoded.decompositionLevel = 0indicates that the full image is decoded. -
requestPlanarindicates whether successive calls todecodeLine*outputRRR..., GGG..., BBB..., RRR...,...orRGBRGBRGB..., ...(false).requestPlanarmust betrueif the encoded image contains any downsampled components, andfalseif the codestream uses a color transform.
decodeLineAsUnsignedSamples()
UInt32Array decodeLineAsUnsignedSamples()
Decodes a complete line of the image as a sequence of UInt32 values.
decodeToRGBAArray()
decodeToRGBAArray(array_buffer, decompositionLevel = 0)
Decodes the codestream into an RGBA 8-bit packed array buffer.
getDecodedComponentNumber()
int getDecodedComponentNumber()
Returns the index of the component last decoded by decodeLineAsUnsignedSamples(). Can only be called if requestPlanar is true.
getImageInfo()
FrameInfo getImageInfo()
Returns information about the image.
getNumDecompositions()
int getNumDecompositions()
Returns the number of decomposition levels available.
isReversible()
bool isReversible()
Indicates whether the image coding was lossless.
getProgressionOrder()
int getProgressionOrder()
Returns the progression order.
getDownSample()
Point getDownSample(int i)
Returns the horizontal and vertical downsampling factor for the ith component.
getImageOffset()
Point getImageOffset()
Returns the image offset.
isUsingColorTransform()
bool isUsingColorTransform()
Indicates whether the codestream uses color transforms.
isDownsamplingUsed()
bool isDownsamplingUsed()
Indicates whether any component of the codestream is downsampled.
Size
struct Size {
uint32_t width;
uint32_t height;
}
FrameInfo
struct FrameInfo {
uint16_t width;
uint16_t height;
uint8_t bitsPerSample;
uint8_t componentCount;
bool isSigned;
}
Point
struct Point {
uint32_t x;
uint32_t y;
}
Development
Dependencies
openHTJS uses docker to run emscripten.
Quick start
Clone the repository:
git clone --recursive https://github.com/sandflow/openhtjs.git
Build the distribution under dist:
npm run build
Build the demo web page to build/site:
/bin/sh scripts/setup_site.sh
Related Skills
healthcheck
348.0kHost security hardening and risk-tolerance configuration for OpenClaw deployments
imsg
348.0kiMessage/SMS CLI for listing chats, history, and sending messages via Messages.app.
node-connect
348.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
xurl
348.0kA CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.
