PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::encoding::compression::jpeg2000_codec Class Referencefinal

JPEG 2000 codec implementation supporting both lossless and lossy modes. More...

#include <jpeg2000_codec.h>

Inheritance diagram for kcenon::pacs::encoding::compression::jpeg2000_codec:
Inheritance graph
Collaboration diagram for kcenon::pacs::encoding::compression::jpeg2000_codec:
Collaboration graph

Classes

class  impl
 PIMPL implementation for jpeg2000_codec. More...
 

Public Member Functions

 jpeg2000_codec (bool lossless=true, float compression_ratio=kDefaultCompressionRatio, int resolution_levels=kDefaultResolutionLevels)
 Constructs a JPEG 2000 codec instance.
 
 ~jpeg2000_codec () override
 
 jpeg2000_codec (const jpeg2000_codec &)=delete
 
jpeg2000_codecoperator= (const jpeg2000_codec &)=delete
 
 jpeg2000_codec (jpeg2000_codec &&) noexcept
 
jpeg2000_codecoperator= (jpeg2000_codec &&) noexcept
 
Codec Information
std::string_view transfer_syntax_uid () const noexcept override
 Returns the Transfer Syntax UID supported by this codec.
 
std::string_view name () const noexcept override
 Returns a human-readable name for the codec.
 
bool is_lossy () const noexcept override
 Checks if this codec produces lossy compression.
 
bool can_encode (const image_params &params) const noexcept override
 Checks if this codec supports the given image parameters.
 
bool can_decode (const image_params &params) const noexcept override
 Checks if this codec can decode data with given parameters.
 
Configuration
bool is_lossless_mode () const noexcept
 Checks if this codec is configured for lossless mode.
 
float compression_ratio () const noexcept
 Gets the current compression ratio setting.
 
int resolution_levels () const noexcept
 Gets the number of DWT resolution levels.
 
Compression Operations
codec_result encode (std::span< const uint8_t > pixel_data, const image_params &params, const compression_options &options={}) const override
 Compresses pixel data to JPEG 2000 format.
 
codec_result decode (std::span< const uint8_t > compressed_data, const image_params &params) const override
 Decompresses JPEG 2000 data.
 
- Public Member Functions inherited from kcenon::pacs::encoding::compression::compression_codec
virtual ~compression_codec ()=default
 

Static Public Attributes

static constexpr std::string_view kTransferSyntaxUIDLossless
 DICOM Transfer Syntax UID for JPEG 2000 Lossless Only.
 
static constexpr std::string_view kTransferSyntaxUIDLossy
 DICOM Transfer Syntax UID for JPEG 2000 (Lossy or Lossless)
 
static constexpr float kDefaultCompressionRatio = 20.0f
 Default compression ratio for lossy mode (20:1)
 
static constexpr int kDefaultResolutionLevels = 6
 Default number of resolution levels.
 

Private Attributes

std::unique_ptr< implimpl_
 

Additional Inherited Members

- Protected Member Functions inherited from kcenon::pacs::encoding::compression::compression_codec
 compression_codec ()=default
 
 compression_codec (const compression_codec &)=default
 
compression_codecoperator= (const compression_codec &)=default
 
 compression_codec (compression_codec &&)=default
 
compression_codecoperator= (compression_codec &&)=default
 

Detailed Description

JPEG 2000 codec implementation supporting both lossless and lossy modes.

Implements DICOM Transfer Syntaxes:

  • 1.2.840.10008.1.2.4.90 (JPEG 2000 Image Compression - Lossless Only)
  • 1.2.840.10008.1.2.4.91 (JPEG 2000 Image Compression)

Uses OpenJPEG library for high-performance wavelet-based compression/decompression.

Supported Features:

  • 8-bit, 12-bit, 16-bit grayscale images
  • 8-bit color images (RGB, YCbCr)
  • Lossless mode (reversible 5/3 wavelet transform)
  • Lossy mode (irreversible 9/7 wavelet transform)
  • Configurable compression ratio for lossy mode
  • Progressive decoding support

Limitations:

  • Maximum image size: 2^32-1 x 2^32-1 pixels (practical limit: memory)
  • Requires OpenJPEG 2.4+ for full feature support

Thread Safety:

  • This class is NOT thread-safe
  • Create separate instances per thread for concurrent operations

Integration:

  • Uses thread_system for parallel tile encoding (via thread_pool_adapter)
  • Logs operations via logger_system (via logger_adapter)
  • Reports metrics to monitoring_system (via monitoring_adapter)
See also
DICOM PS3.5 Annex A.4.4 - JPEG 2000 Image Compression
ISO/IEC 15444-1 (JPEG 2000 Part 1)

Definition at line 51 of file jpeg2000_codec.h.

Constructor & Destructor Documentation

◆ jpeg2000_codec() [1/3]

kcenon::pacs::encoding::compression::jpeg2000_codec::jpeg2000_codec ( bool lossless = true,
float compression_ratio = kDefaultCompressionRatio,
int resolution_levels = kDefaultResolutionLevels )
explicit

Constructs a JPEG 2000 codec instance.

Parameters
losslessIf true, use lossless mode (Transfer Syntax 1.2.840.10008.1.2.4.90). If false, use lossy mode (Transfer Syntax 1.2.840.10008.1.2.4.91).
compression_ratioTarget compression ratio for lossy mode (ignored in lossless). Higher values = smaller files but lower quality. Typical range: 10-50 for medical imaging.
resolution_levelsNumber of DWT resolution levels (1-32, default: 6). More levels enable progressive decoding at multiple resolutions.

Definition at line 579 of file jpeg2000_codec.cpp.

582 : impl_(std::make_unique<impl>(lossless, compression_ratio, resolution_levels)) {}
float compression_ratio() const noexcept
Gets the current compression ratio setting.
int resolution_levels() const noexcept
Gets the number of DWT resolution levels.

◆ ~jpeg2000_codec()

kcenon::pacs::encoding::compression::jpeg2000_codec::~jpeg2000_codec ( )
overridedefault

◆ jpeg2000_codec() [2/3]

kcenon::pacs::encoding::compression::jpeg2000_codec::jpeg2000_codec ( const jpeg2000_codec & )
delete

◆ jpeg2000_codec() [3/3]

kcenon::pacs::encoding::compression::jpeg2000_codec::jpeg2000_codec ( jpeg2000_codec && )
defaultnoexcept

Member Function Documentation

◆ can_decode()

bool kcenon::pacs::encoding::compression::jpeg2000_codec::can_decode ( const image_params & params) const
nodiscardoverridevirtualnoexcept

Checks if this codec can decode data with given parameters.

Parameters
paramsThe image parameters
Returns
true if decoding is supported

Implements kcenon::pacs::encoding::compression::compression_codec.

Definition at line 625 of file jpeg2000_codec.cpp.

625 {
626 // For decoding, we're more lenient as actual parameters come from the codestream
627 // Just validate samples_per_pixel if specified
628 if (params.samples_per_pixel != 0 &&
629 params.samples_per_pixel != 1 &&
630 params.samples_per_pixel != 3) {
631 return false;
632 }
633 return true;
634}

◆ can_encode()

bool kcenon::pacs::encoding::compression::jpeg2000_codec::can_encode ( const image_params & params) const
nodiscardoverridevirtualnoexcept

Checks if this codec supports the given image parameters.

Parameters
paramsThe image parameters to check
Returns
true if the codec can handle these parameters

Implements kcenon::pacs::encoding::compression::compression_codec.

Definition at line 601 of file jpeg2000_codec.cpp.

601 {
602 // JPEG 2000 supports wide range of bit depths
603 if (params.bits_stored < 1 || params.bits_stored > 16) {
604 return false;
605 }
606
607 // bits_allocated must be 8 or 16
608 if (params.bits_allocated != 8 && params.bits_allocated != 16) {
609 return false;
610 }
611
612 // Support grayscale (1) and color (3) images
613 if (params.samples_per_pixel != 1 && params.samples_per_pixel != 3) {
614 return false;
615 }
616
617 // Require valid dimensions
618 if (params.width == 0 || params.height == 0) {
619 return false;
620 }
621
622 return true;
623}

◆ compression_ratio()

float kcenon::pacs::encoding::compression::jpeg2000_codec::compression_ratio ( ) const
nodiscardnoexcept

Gets the current compression ratio setting.

Returns
Compression ratio (only meaningful for lossy mode)

Definition at line 640 of file jpeg2000_codec.cpp.

640 {
641 return impl_->compression_ratio();
642}

References kcenon::pacs::encoding::compression::jpeg2000_codec::impl::compression_ratio(), and impl_.

Here is the call graph for this function:

◆ decode()

codec_result kcenon::pacs::encoding::compression::jpeg2000_codec::decode ( std::span< const uint8_t > compressed_data,
const image_params & params ) const
nodiscardoverridevirtual

Decompresses JPEG 2000 data.

Parameters
compressed_dataJPEG 2000 compressed data (J2K or JP2 format)
paramsImage parameters (width/height for validation)
Returns
Decompressed pixel data or error

Output format matches the original bit depth:

  • 8-bit: single byte per sample
  • 12/16-bit: two bytes per sample (little-endian)

Implements kcenon::pacs::encoding::compression::compression_codec.

Definition at line 654 of file jpeg2000_codec.cpp.

655 {
656 return impl_->decode(compressed_data, params);
657}
codec_result decode(std::span< const uint8_t > compressed_data, const image_params &params) const

References kcenon::pacs::encoding::compression::jpeg2000_codec::impl::decode(), and impl_.

Here is the call graph for this function:

◆ encode()

codec_result kcenon::pacs::encoding::compression::jpeg2000_codec::encode ( std::span< const uint8_t > pixel_data,
const image_params & params,
const compression_options & options = {} ) const
nodiscardoverridevirtual

Compresses pixel data to JPEG 2000 format.

Parameters
pixel_dataUncompressed pixel data (8/12/16-bit, grayscale or color)
paramsImage parameters
optionsCompression options:
  • quality: 1-100 for lossy mode (maps to compression ratio)
  • lossless: Override codec's lossless setting
Returns
Compressed J2K codestream or error

For lossless mode:

  • Uses reversible 5/3 integer wavelet transform
  • Output is exactly reconstructible

For lossy mode:

  • Uses irreversible 9/7 floating-point wavelet transform
  • Compression ratio is determined by quality setting or constructor parameter

Implements kcenon::pacs::encoding::compression::compression_codec.

Definition at line 648 of file jpeg2000_codec.cpp.

650 {
651 return impl_->encode(pixel_data, params, options);
652}
codec_result encode(std::span< const uint8_t > pixel_data, const image_params &params, const compression_options &options) const

References kcenon::pacs::encoding::compression::jpeg2000_codec::impl::encode(), and impl_.

Here is the call graph for this function:

◆ is_lossless_mode()

bool kcenon::pacs::encoding::compression::jpeg2000_codec::is_lossless_mode ( ) const
nodiscardnoexcept

Checks if this codec is configured for lossless mode.

Returns
true if lossless, false if lossy

Definition at line 636 of file jpeg2000_codec.cpp.

636 {
637 return impl_->is_lossless_mode();
638}

References impl_, and kcenon::pacs::encoding::compression::jpeg2000_codec::impl::is_lossless_mode().

Referenced by transfer_syntax_uid().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_lossy()

bool kcenon::pacs::encoding::compression::jpeg2000_codec::is_lossy ( ) const
nodiscardoverridevirtualnoexcept

Checks if this codec produces lossy compression.

Returns
true if lossy, false if lossless

Implements kcenon::pacs::encoding::compression::compression_codec.

Definition at line 597 of file jpeg2000_codec.cpp.

597 {
598 return !impl_->is_lossless_mode();
599}

References impl_, and kcenon::pacs::encoding::compression::jpeg2000_codec::impl::is_lossless_mode().

Here is the call graph for this function:

◆ name()

std::string_view kcenon::pacs::encoding::compression::jpeg2000_codec::name ( ) const
nodiscardoverridevirtualnoexcept

Returns a human-readable name for the codec.

Returns
The codec name (e.g., "JPEG Baseline")

Implements kcenon::pacs::encoding::compression::compression_codec.

Definition at line 593 of file jpeg2000_codec.cpp.

593 {
594 return impl_->is_lossless_mode() ? "JPEG 2000 Lossless" : "JPEG 2000";
595}

References impl_, and kcenon::pacs::encoding::compression::jpeg2000_codec::impl::is_lossless_mode().

Here is the call graph for this function:

◆ operator=() [1/2]

jpeg2000_codec & kcenon::pacs::encoding::compression::jpeg2000_codec::operator= ( const jpeg2000_codec & )
delete

◆ operator=() [2/2]

jpeg2000_codec & kcenon::pacs::encoding::compression::jpeg2000_codec::operator= ( jpeg2000_codec && )
defaultnoexcept

◆ resolution_levels()

int kcenon::pacs::encoding::compression::jpeg2000_codec::resolution_levels ( ) const
nodiscardnoexcept

Gets the number of DWT resolution levels.

Returns
Resolution levels (1-32)

Definition at line 644 of file jpeg2000_codec.cpp.

References impl_, and kcenon::pacs::encoding::compression::jpeg2000_codec::impl::resolution_levels().

Here is the call graph for this function:

◆ transfer_syntax_uid()

std::string_view kcenon::pacs::encoding::compression::jpeg2000_codec::transfer_syntax_uid ( ) const
nodiscardoverridevirtualnoexcept

Returns the Transfer Syntax UID supported by this codec.

Returns
The DICOM Transfer Syntax UID

Implements kcenon::pacs::encoding::compression::compression_codec.

Definition at line 589 of file jpeg2000_codec.cpp.

589 {
591}
static constexpr std::string_view kTransferSyntaxUIDLossy
DICOM Transfer Syntax UID for JPEG 2000 (Lossy or Lossless)
static constexpr std::string_view kTransferSyntaxUIDLossless
DICOM Transfer Syntax UID for JPEG 2000 Lossless Only.

References is_lossless_mode().

Here is the call graph for this function:

Member Data Documentation

◆ impl_

std::unique_ptr<impl> kcenon::pacs::encoding::compression::jpeg2000_codec::impl_
private

◆ kDefaultCompressionRatio

float kcenon::pacs::encoding::compression::jpeg2000_codec::kDefaultCompressionRatio = 20.0f
staticconstexpr

Default compression ratio for lossy mode (20:1)

Definition at line 62 of file jpeg2000_codec.h.

◆ kDefaultResolutionLevels

int kcenon::pacs::encoding::compression::jpeg2000_codec::kDefaultResolutionLevels = 6
staticconstexpr

Default number of resolution levels.

Definition at line 65 of file jpeg2000_codec.h.

◆ kTransferSyntaxUIDLossless

std::string_view kcenon::pacs::encoding::compression::jpeg2000_codec::kTransferSyntaxUIDLossless
staticconstexpr
Initial value:
=
"1.2.840.10008.1.2.4.90"

DICOM Transfer Syntax UID for JPEG 2000 Lossless Only.

Definition at line 54 of file jpeg2000_codec.h.

Referenced by kcenon::pacs::encoding::compression::codec_factory::create().

◆ kTransferSyntaxUIDLossy

std::string_view kcenon::pacs::encoding::compression::jpeg2000_codec::kTransferSyntaxUIDLossy
staticconstexpr
Initial value:
=
"1.2.840.10008.1.2.4.91"

DICOM Transfer Syntax UID for JPEG 2000 (Lossy or Lossless)

Definition at line 58 of file jpeg2000_codec.h.

Referenced by kcenon::pacs::encoding::compression::codec_factory::create().


The documentation for this class was generated from the following files: