CoreJ2K.Skia 2.4.0.98

Prefix Reserved
dotnet add package CoreJ2K.Skia --version 2.4.0.98
                    
NuGet\Install-Package CoreJ2K.Skia -Version 2.4.0.98
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CoreJ2K.Skia" Version="2.4.0.98" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="CoreJ2K.Skia" Version="2.4.0.98" />
                    
Directory.Packages.props
<PackageReference Include="CoreJ2K.Skia" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add CoreJ2K.Skia --version 2.4.0.98
                    
#r "nuget: CoreJ2K.Skia, 2.4.0.98"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package CoreJ2K.Skia@2.4.0.98
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=CoreJ2K.Skia&version=2.4.0.98
                    
Install as a Cake Addin
#tool nuget:?package=CoreJ2K.Skia&version=2.4.0.98
                    
Install as a Cake Tool
▄█████  ▄▄▄  ▄▄▄▄  ▄▄▄▄▄    ██ ████▄ ██ ▄█▀ 
██     ██▀██ ██▄█▄ ██▄▄     ██  ▄██▀ ████   
▀█████ ▀███▀ ██ ██ ██▄▄▄ ████▀ ███▄▄ ██ ▀█▄ 
A Managed and Portable JPEG2000 Codec for .NET Platforms

NuGet Downloads License Socket Badge
Release Build CodeQL Security Analysis Fuzzing


🚀 Quick Start

dotnet add package CoreJ2K
dotnet add package CoreJ2K.Skia

Simple API

using CoreJ2K;
using SkiaSharp;

// Decode – legacy path (returns InterleavedImage, useful for sample-level access)
using var image = J2kImage.FromStream(File.OpenRead("image.jp2"));
var bitmap = image.As<SKBitmap>();

// Decode – fast path (8-bit images, skips the intermediate int[] buffer: ~4× less memory)
var bitmap2 = J2kImage.DecodeToImage<SKBitmap>(File.OpenRead("image.jp2"));

// Encode with modern API (recommended)
byte[] data = CompleteConfigurationPresets.Web
    .WithCopyright("© 2025")
    .Encode(imageSource);

// Or use traditional API
byte[] j2kData = J2kImage.ToBytes(bitmap);

📖 Full Documentation • 💻 More Examples • 🎯 Modern API Guide • 📦 All Packages


📑 Table of Contents


About

What is CoreJ2K?

CoreJ2K is a pure C# implementation of the JPEG 2000 image compression standard for .NET. Modern fork of CSJ2K (C# port of jj2000), designed for .NET Standard and modern .NET platforms. Provides both encoding and decoding with 100% ISO/IEC 15444-1 Part 1 compliance.

Key Features

Feature Description
🏆 Standards Compliant 100% JPEG 2000 Part 1 (ISO/IEC 15444-1) • ~50% Part 2 extensions • 27 codestream markers • 22 JP2 boxes • Part 14 JPXML
⚡ Modern .NET .NET Standard 2.0/2.1 • .NET 8/9/10 • .NET Framework 4.8.1 (via netstandard2.0) • All platforms
🎯 Production Ready Lossless/Lossy • ROI • Files >4GB • Error resilience • 1,000+ tests
📦 Easy Integration NuGet packages • Simple API • SkiaSharp/ImageSharp/System.Drawing support
🆓 Open Source BSD-3-Clause • No fees • Active development • Community driven

Why Choose CoreJ2K?

✅ For .NET Developers ✅ For Production Use
Native C# (no P/Invoke) Battle-tested & stable
Memory safe (managed code) Complete Part 1 compliance
Safe for concurrent independent calls Medical imaging (DICOM) ready
Familiar NuGet install GIS/geospatial compatible
Works with all image libraries Interoperable with all decoders

Comparison: CoreJ2K is the only open-source .NET library with full JPEG 2000 Part 1 compliance and complete pointer marker read/write support.

↑ Back to top


Getting Started

Installation

Core Library
dotnet add package CoreJ2K
With Image Integration
# SkiaSharp (recommended - cross-platform)
dotnet add package CoreJ2K.Skia

# ImageSharp (modern .NET)
dotnet add package CoreJ2K.ImageSharp

# System.Drawing (Windows)
dotnet add package CoreJ2K.Windows

# Pfim (DDS/TGA)
dotnet add package CoreJ2K.Pfim

Integration packages are discovered and registered automatically at runtime on JIT runtimes (.NET Framework and .NET 8+). NativeAOT or aggressively trimmed apps should register creators explicitly, e.g. ImageFactory.Register(new SKBitmapImageCreator()) — see Plugin Registration.

Quick Examples

Basic Decoding
using CoreJ2K;
using SkiaSharp;

// From file
var image = J2kImage.FromStream(File.OpenRead("image.jp2"));
var bitmap = image.As<SKBitmap>();

// From bytes
byte[] data = File.ReadAllBytes("image.j2k");
var image2 = J2kImage.FromBytes(data);

// Save as PNG
using var output = File.OpenWrite("output.png");
bitmap.Encode(output, SKEncodedImageFormat.Png, 90);
Fast Decode (8-bit, ~4× less peak memory)

For the common 8-bit decode-and-display path, DecodeToImage<T> writes pixels directly into the backend image, skipping the intermediate int[] buffer that InterleavedImage would normally allocate. Use this whenever you don't need sample-level access after decoding.

using CoreJ2K;
using SkiaSharp;

// From stream – fast path (8-bit components: ~1 B/sample peak vs ~5 B/sample legacy)
SKBitmap bitmap = J2kImage.DecodeToImage<SKBitmap>(File.OpenRead("image.jp2"));

// From byte array
SKBitmap bitmap2 = J2kImage.DecodeToImage<SKBitmap>(File.ReadAllBytes("image.j2k"));

// From file path
SKBitmap bitmap3 = J2kImage.DecodeFileToImage<SKBitmap>("image.jp2");

When to use the legacy FromStream path instead:

  • You need to inspect or modify individual samples (GetSample, SetComponent, Crop, …).
  • Any component has bit depth > 8 (the fast path falls back automatically, but you may also call FromStream directly).
API Peak memory (8-bit RGB) Best for
DecodeToImage<T> ~1 B/sample Display / encode pipeline
FromStream().As<T>() ~5 B/sample Sample inspection / editing
Tile Access with TLM Markers

If a codestream has a TLM (tile-part lengths) marker, the decoder uses it to locate each tile without reading the packets of the tiles before it. Nothing needs to be enabled for decoding; it applies to streams from CoreJ2K and from other encoders. To write one, see Encoding with TLM and PLT markers.

Basic Encoding

// Default (high quality)
byte[] j2k = J2kImage.ToBytes(bitmap);

// Lossless
var lossless = new ParameterList { ["lossless"] = "on", ["file_format"] = "on" };
byte[] data = J2kImage.ToBytes(bitmap, lossless);

// Lossy with target bitrate
var lossy = new ParameterList { ["rate"] = "0.5", ["file_format"] = "on" };
byte[] compressed = J2kImage.ToBytes(bitmap, lossy);

Platform Support

Platform Framework Package
Windows .NET 8/9, Framework 4.8.1, Standard 2.x CoreJ2K, CoreJ2K.Windows
Linux .NET 8/9, Standard 2.x CoreJ2K, CoreJ2K.Skia
macOS .NET 8/9, Standard 2.x CoreJ2K, CoreJ2K.Skia
Mobile .NET 8/9 (MAUI), Xamarin CoreJ2K, CoreJ2K.Skia
Web .NET 8/9, ASP.NET Core CoreJ2K, CoreJ2K.ImageSharp

↑ Back to top


Documentation

Modern Configuration API

CoreJ2K 1.3.0+ includes a comprehensive, fluent configuration API that makes JPEG 2000 encoding easier and more intuitive than ever.

Quick Start with Presets
using CoreJ2K.Configuration;

// One-liner encoding with preset
byte[] webImage = CompleteConfigurationPresets.Web
    .WithCopyright("© 2025")
    .Encode(imageSource);

// Medical imaging (lossless)
byte[] medical = CompleteConfigurationPresets.Medical
    .WithMetadata(m => m
        .WithComment("Patient: Anonymous")
        .WithComment("Study: CT Scan"))
    .Encode(dicomImage);

// High-quality photography
byte[] photo = CompleteConfigurationPresets.Photography
    .WithCopyright("© 2025 Photographer")
    .WithComment("Sunset over mountains")
    .Encode(photograph);
Quality Presets
// Lossless (perfect reconstruction)
var config = new CompleteEncoderConfigurationBuilder()
    .ForLossless()
    .Build();

// High quality (90% quality)
var config = new CompleteEncoderConfigurationBuilder()
    .ForHighQuality()
    .Build();

// Balanced (75% quality)
var config = new CompleteEncoderConfigurationBuilder()
    .ForBalanced()
    .Build();

// High compression
var config = new CompleteEncoderConfigurationBuilder()
    .ForHighCompression()
    .Build();
Use Case Presets
// Medical imaging - lossless with appropriate settings
.ForMedical()

// Archival storage - very high quality + error resilience
.ForArchival()

// Web delivery - progressive + balanced quality
.ForWeb()

// Thumbnail generation - fast + small
.ForThumbnail()

// Geospatial/GIS - spatial browsing + tiled
.ForGeospatial()

// Streaming - quality progressive
.ForStreaming()
Fine-Grained Control
var config = new CompleteEncoderConfigurationBuilder()
    .WithQuality(0.85)
    .WithQuantization(q => q
        .UseExpounded()
        .WithBaseStepSize(0.008f)
        .WithGuardBits(2))
    .WithWavelet(w => w
        .UseIrreversible_9_7()
        .WithDecompositionLevels(6))
    .WithProgression(p => p.UseLRCP())
    .WithTiles(t => t.SetSize(512, 512))
    .WithMetadata(m => m
        .WithComment("Custom configuration")
        .WithCopyright("© 2025")
        .WithXml(customMetadata))
    .Build();

byte[] data = J2kImage.ToBytes(image, config);

📚 Complete Guides:

Traditional API (Encoding Guide)

Lossless
var p = new ParameterList();
p["lossless"] = "on";
p["file_format"] = "on";
byte[] data = J2kImage.ToBytes(bitmap, p);
Lossy with Quality
var p = new ParameterList();
p["rate"] = "0.5";         // 0.5 bits/pixel
p["file_format"] = "on";   // JP2 wrapper
p["tiles"] = "1024 1024";  // Tile size
p["Wlev"] = "5";           // Decomposition levels
byte[] data = J2kImage.ToBytes(bitmap, p);
Progressive Quality Layers
var p = new ParameterList();
p["rate"] = "0.2";
p["Alayers"] = "0.015 +20 2.0 +10";  // Multiple layers
p["Aptype"] = "res";                  // Resolution progression
byte[] data = J2kImage.ToBytes(bitmap, p);

Advanced Parameters

Common encoder parameters (case-sensitive):

Parameter Example Value Description
lossless "on" / "off" Enable lossless compression
rate "0.5" Target bitrate (bits per pixel)
file_format "on" / "off" Use JP2 container format
tiles "1024 1024" Tile dimensions (width height)
Wlev "5" Wavelet decomposition levels
Wcboff "0 0" Code-block partition origin
Ffilters "w5x3" / "w9x7" Wavelet filter (reversible/irreversible)
Qtype "reversible" / "expounded" Quantization type
Aptype "res" / "layer" / "pos-comp" Progression order
Alayers "0.015 +20 2.0" Layer rate specification
Mct "on" / "off" Multi-component transform
Psop "on" / "off" SOP markers (error resilience)
Peph "on" / "off" EPH markers (error resilience)

Note: Parameter names match internal encoder conventions (no leading dashes).

Usage Notes

  • InterleavedImage: Cross-platform image wrapper. Use As<T>() to convert to platform types (e.g., SKBitmap). Carries a full int[] sample buffer — use DecodeToImage<T> instead when you only need the final bitmap.
  • DecodeToImage<T>: Memory-efficient decode that skips InterleavedImage entirely for 8-bit images (~4× less peak memory). Falls back to FromStream + As<T> automatically for >8-bit components.
  • ParameterList: Optional encoding parameters. Use indexer to set: params["key"] = "value"
  • Image Sources: Accepts SKBitmap, Bitmap, Image, or codec-specific formats (PGM/PPM/PGX streams)
  • Thread Safety: Independent decode and encode calls can run concurrently on separate threads.
  • Parallel Decoding: Code-block decoding and the inverse wavelet transform use up to all cores by default (about 4x faster on 8 cores for lossless, 3x for lossy), with bit-identical output. Tune with WithMaxDegreeOfParallelism(n) or J2kImage.DefaultMaxDegreeOfParallelism. Encoding is parallel too (code-block coding, the forward wavelet transform, rate allocation and packet writing): about 4x faster on 8 cores, again with identical output.
  • Cancellation: Decodes and encodes observe a CancellationToken and stop within milliseconds with OperationCanceledException, including the *Async methods. Pass a token to FromBytes/DecodeBytes/DecodeToImage<T>/ToBytes/WriteTo, or set it with J2KDecoderConfiguration.WithCancellationToken / J2KEncoderConfiguration.WithCancellationToken.
  • Decode Limits: A decode is rejected with DecoderLimitException before any image-sized allocation if it would exceed the default 1 Gpixel / 2 GiB limits (at the requested resolution). Use DecoderLimits.Strict for untrusted input or DecoderLimits.None to opt out. See the decoder guide.

Upgrading to 2.4.0

Two defaults changed. Each is one line to revert.

  • Decode limits are on by default. A decode whose estimated memory exceeds 2 GiB (or 1 Gpixel) at the requested resolution now throws DecoderLimitException before allocating anything. A 16384x16384 RGB image (estimated about 3.2 GB) used to be attempted and is now rejected. If you decode very large trusted images, such as GIS or whole-slide data, opt out once at start-up with DecoderLimits.Default = DecoderLimits.None;, or raise the limit for specific calls with .WithLimits(...). Reduced-resolution decodes are measured at the reduced size, so previews of huge images are unaffected.
  • Decoding and encoding are parallel by default. Each decode uses up to all processors for code-block decoding and the inverse wavelet transform, and each encode uses up to all processors for code-block coding and the forward wavelet transform. Output is bit-identical to a single-threaded run. If your application already decodes or encodes many images concurrently (a server, for example), set J2kImage.DefaultMaxDegreeOfParallelism = 1; once at start-up to opt out of both, or pass WithMaxDegreeOfParallelism(1) to a single call.

Streams written with PLT (Hplt) or TLM (Htlm) markers are different from 2.3.x: tile-part lengths now include the PLT marker, PLT markers list every packet in the order it is written, and Htlm now writes a TLM marker. Streams written without those options are byte-identical to 2.3.x. See the changelog for everything in this release.

Encoding with TLM and PLT Markers

TLM (tile-part lengths, in the main header) and PLT (packet lengths, in each tile-part header) markers let a reader find a tile, or a packet within it, without parsing everything before it. They are off by default. Turn them on with encoder parameters:

var pl = new ParameterList
{
    ["tiles"] = "512 512",
    ["Htlm"] = "on",   // TLM marker in the main header
    ["Hplt"] = "on",   // PLT markers in the tile-part headers
};
byte[] data = J2kImage.ToBytes(image, pl);
  • The decoder reads both and uses TLM to find tiles. Other decoders can use them too; OpenJPEG reads CoreJ2K's streams with both.
  • TLM lists one tile-part per tile, with 32-bit lengths. The marker counts against a rate target. PLT markers do not, so a rate-limited stream written with Hplt comes out a little over its target.
  • Htlm is ignored, with a warning, together with tile_parts or packed packet headers (pph_main, pph_tile), which rewrite the tile-parts after they are written.
  • Hppm and Hppt are accepted but have no effect; use pph_main and pph_tile.

↑ Back to top


Standards & Compliance

Part 1: Core Coding System

CoreJ2K achieves 100% JPEG 2000 Part 1 (ISO/IEC 15444-1) compliance:

Component Support Details
Codestream Markers ✅ 27/27 (100%) All main header, tile-part, and packet markers
JP2 File Format ✅ 22/22 boxes (100%) All required and optional boxes
Wavelet Transforms ✅ Complete 5-3 (reversible), 9-7 (irreversible)
Quantization ✅ Complete Reversible, scalar derived, scalar expounded
Entropy Coding ✅ Complete Full MQ coder (arithmetic coding)
ROI Encoding ✅ Complete Max-shift method, arbitrary shapes
Progression Orders ✅ All 5 LRCP, RLCP, RPCL, PCRL, CPRL
Error Resilience ✅ Complete SOP/EPH markers, segmentation symbols
Pointer Markers ✅ PPM and PPT (pph_main, pph_tile), PLT (Hplt) and TLM (Htlm) read and written; PLM read only
TLM Tile Access ✅ Tiles located from TLM tile-part lengths
Extended Length ✅ Complete XLBox support for files >4GB
ICC Profiles ✅ Complete Full color management support
Metadata ✅ Complete XML, UUID, resolution, channels, Part 14 JPXML

Compliance Scores:

  • Baseline Profile: ✅ 100%
  • Profile 0: ✅ 100%
  • Profile 1: ✅ 100%
  • Extended Features: ✅ 100%
  • Part 14 JPXML: ✅ 100%

Part 2: Extensions

CoreJ2K implements the most commonly used JPEG 2000 Part 2 (ISO/IEC 15444-2) features end-to-end (encode and decode):

Feature Markers Read Write Notes
JPX File Format ASOC, NLST, DTBL, FTBL, FLST, CREF, JPCH, JPLH ✅ ✅ Full JPX box set + jpx brand
Extended Capabilities CAP (0xFF50) ✅ ✅ Auto-emitted for any Part 2 codestream
Variable DC Offset DCO (0xFF70) ✅ ✅ Per-component integer DC shifts
Non-linearity Transform NLT (0xFF76) ✅ ✅ Gamma (power-law) and LUT types
Multi-Component Transform MCT/MCC/MCO (0xFF74–77) ✅ ✅ Matrix decorrelation, dependency lifting, 5/3 wavelet
Component Bit Depth CBD (0xFF78) ✅ ✅ Per-component depth signaling
Arbitrary Decomposition DFS/ADS (0xFF72–73) ❌ ❌ Non-standard wavelet tree shapes
Arbitrary Transform Kernels ATK (0xFF79) ✅ ✅ Custom reversible/irreversible lifting kernels — see ATK guide
Trellis Coded Quantization — ❌ ❌ Alternative entropy path
Single Sample Overlap — ❌ ❌ Tie-in with DFS/ADS

Coverage: ~50% — all production-relevant per-sample and multi-component transforms, plus custom wavelet kernels (ATK), are implemented. Remaining gaps are the wavelet-shape features (DFS/ADS), trellis-coded quantization and single-sample overlap.

API note: Pass Part 2 parameters to J2kImage.ToBytes:

// DCO: per-component DC offset
var dco = new DCOMarkerSegment { Offsets = new[] { 10, -3, 20 } };

// NLT: gamma non-linearity
var nlt = new NLTMarkerSegment { Type = NLTType.Gamma, GammaExponent = 2.2 };

// Encode with Part 2 extensions (Rsiz + CAP written automatically)
byte[] data = J2kImage.ToBytes(src, metadata, pl, nltSegments: new[] { nlt }, dcoSegment: dco);

Library Comparison

Quick comparison with major JPEG 2000 libraries:

Feature CoreJ2K Kakadu OpenJPEG JJ2000 LEADTOOLS
Part 1 Compliance ✅ 100% ✅ 100% ⚠️ ~95% ⚠️ ~90% ✅ 100%
Part 2 Coverage ⚠️ ~50% ✅ ~95% ⚠️ ~20% ❌ 0% ✅ ~80%
Language C# C++ C Java C/C++
License BSD (Free) Commercial BSD (Free) JJ2000 Commercial
Cost ✅ Free ❌ $$$$ ✅ Free ✅ Free ❌ $$$$
.NET Native ✅ ❌ ⚠️ P/Invoke ❌ ✅
Memory Safety ✅ Managed ⚠️ Manual ⚠️ Manual ✅ Managed ⚠️ Manual
Pointer Markers ✅ Full R/W ✅ Full R/W ⚠️ Read only ⚠️ Read only ✅ Full R/W
Files >4GB ✅ Yes ✅ Yes ⚠️ Limited ❌ No ✅ Yes
Part 14 JPXML ✅ Full R/W ⚠️ Partial ❌ No ❌ No ❌ No
Active Dev ✅ 2026 ✅ 2025 ✅ 2025 ❌ 2010 ✅ 2025

CoreJ2K Unique Advantages:

  • Only open-source .NET library with full Part 1 compliance
  • Only open-source library with complete pointer marker read/write
  • Memory-safe managed code (no buffer overflows)
  • Zero licensing costs

📊 View detailed comparison tables →

JPEG 2000 Specification Compliance

CoreJ2K supports multiple parts of ISO/IEC 15444:

Part Name Read Write Status
Part 1 Core Coding System ✅ Full ✅ Full 100% Complete
Part 2 Extensions ⚠️ Partial ⚠️ Partial ~50% — JPX boxes, DCO, NLT, MCT family, ATK; DFS/ADS pending
Part 4 Conformance Testing N/A N/A 100% Complete
Part 14 XML Representation (JPXML) ✅ Full ✅ Full 100% Complete

Part 1 covers 99% of real-world JPEG 2000 usage including:

  • ✅ Medical imaging (DICOM)
  • ✅ Digital cinema (DCP)
  • ✅ Geospatial/satellite imagery
  • ✅ Digital archives and libraries
  • ✅ High-quality image storage

📖 View complete specification details →

↑ Back to top


Support

Resources

Support the Project

If CoreJ2K helps your project:

  • ⭐ Star the repository on GitHub
  • 📢 Share with others
  • 💰 Donate via cryptocurrency:
    • ZEC
    • BTC

↑ Back to top


Contributing

Contributions welcome! Ways to help:

  • 🐛 Report bugs via GitHub Issues
  • 💡 Suggest features in Discussions
  • 📝 Improve docs with pull requests
  • 🧪 Add tests for better coverage
  • 🔧 Fix issues and submit PRs

↑ Back to top


License

BSD 3-Clause License

Copyright (c) 1999-2000 JJ2000 Partners
Copyright (c) 2007-2012 Jason S. Clary
Copyright (c) 2013-2016 Anders Gustafsson, Cureos AB
Copyright (c) 2024-2026 Sjofn LLC

Free to use in commercial and open-source projects. No licensing fees.

→ Full license text


<div align="center">

Made with ❤️ for the .NET community

GitHub stars GitHub issues Commit Activity

↑ Back to top

</div>


Appendix: Detailed Comparison Tables

<details> <summary><b>Click to expand full library comparison</b></summary>

Standards Compliance and Features

Feature CoreJ2K Kakadu OpenJPEG JJ2000 JasPer Pillow LEADTOOLS
Part 1 Compliance ✅ 100% ✅ 100% ⚠️ ~95% ⚠️ ~90% ⚠️ ~85% ⚠️ ~70% ✅ 100%
Part 2 Coverage ⚠️ ~50% ✅ ~95% ⚠️ ~20% ❌ 0% ❌ 0% ❌ 0% ✅ ~80%
Decode ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Basic ✅ Full
Encode ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ❌ No ✅ Full
JP2 File Format ✅ Full ✅ Full ✅ Full ✅ Full ⚠️ Partial ⚠️ Basic ✅ Full
Lossless ✅ Yes ✅ Yes ✅ Yes ✅ Yes ✅ Yes ✅ Yes ✅ Yes
Lossy ✅ Yes ✅ Yes ✅ Yes ✅ Yes ✅ Yes ✅ Yes ✅ Yes
Error Resilience (SOP/EPH) ✅ Full ✅ Full ✅ Full ✅ Full ⚠️ Partial ❌ No ✅ Full
Pointer Markers (PPM/PPT/PLM/PLT/TLM) ✅ Full R/W ✅ Full R/W ⚠️ Read only ⚠️ Read only ❌ No ❌ No ✅ Full R/W
ROI (Region of Interest) ✅ Yes ✅ Yes ✅ Yes ✅ Yes ⚠️ Limited ❌ No ✅ Yes
Extended Length (XLBox) ✅ Full ✅ Full ⚠️ Limited ❌ No ❌ No ❌ No ✅ Full
Multi-component Transform ✅ Yes ✅ Yes ✅ Yes ✅ Yes ⚠️ Limited ⚠️ Limited ✅ Yes
Tile-based Processing ✅ Yes ✅ Yes ✅ Yes ✅ Yes ✅ Yes ⚠️ Limited ✅ Yes
Progression Orders ✅ All 5 ✅ All 5 ✅ All 5 ✅ All 5 ⚠️ Limited ⚠️ Limited ✅ All 5
Quality Layers ✅ Unlimited ✅ Unlimited ✅ Unlimited ✅ Unlimited ⚠️ Limited ⚠️ Limited ✅ Unlimited
ICC Profile Support ✅ Full ✅ Full ✅ Full ⚠️ Basic ⚠️ Basic ✅ Full ✅ Full
Metadata (XML/UUID) ✅ Full ✅ Full ⚠️ Partial ⚠️ Partial ❌ No ⚠️ Basic ✅ Full
Part 14 JPXML (XML metadata representation) ✅ Full R/W ⚠️ Partial ❌ No ❌ No ❌ No ❌ No ❌ No
Palette/Component Mapping ✅ Full ✅ Full ✅ Full ⚠️ Partial ⚠️ Partial ❌ No ✅ Full

Technical Characteristics

Aspect CoreJ2K Kakadu OpenJPEG JJ2000 JasPer Pillow LEADTOOLS
Language C# C++ C Java C Python/C C/C++
License BSD (Open) Commercial BSD (Open) JJ2000 (Open) MIT (Open) PIL (Open) Commercial
Cost ✅ Free ❌ $$$$ ✅ Free ✅ Free ✅ Free ✅ Free ❌ $$$$
Active Development ✅ Active ✅ Active ✅ Active ❌ Abandoned ⚠️ Minimal ✅ Active ✅ Active
Last Update 2026 2025 2025 2010 2022 2025 2025
Platform Support .NET all All All JVM All All Windows mainly
Cross-platform ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ⚠️ Limited
Memory Safety ✅ Managed ⚠️ Manual ⚠️ Manual ✅ Managed ⚠️ Manual ✅ Managed ⚠️ Manual
Multi-threading ✅ Parallel decode and encode ✅ Yes ✅ Yes ⚠️ Limited ⚠️ Limited ✅ Yes ✅ Yes
SIMD Optimization ✅ Yes (AVX/auto-vec) ✅ Full ✅ Full ❌ No ❌ No ⚠️ Limited ✅ Full

Performance and Quality

Metric CoreJ2K Kakadu OpenJPEG JJ2000 JasPer Pillow LEADTOOLS
Encoding Speed ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐⭐
Decoding Speed ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐
Compression Ratio ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐
Image Quality ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐
Memory Efficiency ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐
Large File Support (>4GB) ✅ Yes ✅ Yes ⚠️ Limited ❌ No ❌ No ❌ No ✅ Yes

Developer Experience

Aspect CoreJ2K Kakadu OpenJPEG JJ2000 JasPer Pillow LEADTOOLS
Documentation ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
API Simplicity ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
Code Examples ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
NuGet/Package Manager ✅ Yes ❌ No ✅ Yes ⚠️ Maven ❌ Manual ✅ PyPI ✅ Yes
Community Support ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐ ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
Issue Tracking ✅ GitHub ⚠️ Private ✅ GitHub ❌ Closed ✅ GitHub ✅ GitHub ⚠️ Private
Integration Ease ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐

Use Case Suitability

Use Case CoreJ2K Kakadu OpenJPEG JJ2000 JasPer Pillow LEADTOOLS
.NET Applications ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐ ⭐ ⭐⭐ ⭐ ⭐⭐⭐⭐⭐
Cross-platform Apps ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
Web Services ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
Mobile Apps ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐
Medical Imaging ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐⭐
Geospatial/GIS ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐
Archive/Digital Libraries ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 is compatible. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on CoreJ2K.Skia:

Package Downloads
DocSharp.SkiaSharp

.NET library for converting documents. The DocSharp.SkiaSharp package provides helper functions to convert unsupported images when creating documents, using SkiaSharp as graphics library.

UtopiaSkye.OpenMetaverse

Client library for the NGC OpenMetaverse-compatible Tranquillity virtual world servers. Provides login, inventory, asset, object, and messaging APIs.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.4.0.98 40 10/3/2026
2.3.3.91 3,894 7/21/2026
2.3.2.86 1,005 7/12/2026
2.3.1.84 133 7/10/2026
2.3.0.81 3,724 6/12/2026
2.2.2.72 1,206 5/26/2026
2.2.1.68 158 5/22/2026
2.2.0.62 148 5/22/2026
2.1.2.38 12,143 2/5/2026
2.1.1.18 127 2/3/2026
2.1.0.101 2,801 12/15/2025
2.0.0.97 266 12/14/2025
1.3.2.80 1,972 11/15/2025
1.3.1.77 327 11/13/2025
1.3.0.75 555 11/11/2025
1.2.2.68 1,016 11/6/2025
1.2.1.63 491 10/31/2025
1.2.0.55 1,517 10/12/2025
1.1.2.50 3,930 6/14/2025
Loading failed