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

JPEG XL codec implementation (Supplement 232). More...

#include <jpegxl_codec.h>

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

Public Member Functions

 jpegxl_codec (bool lossless=true, bool jpeg_recompression=false, float quality_distance=kDefaultQualityDistance)
 Constructs a JPEG XL codec instance.
 
 ~jpegxl_codec () override
 
 jpegxl_codec (const jpegxl_codec &)=delete
 
jpegxl_codecoperator= (const jpegxl_codec &)=delete
 
 jpegxl_codec (jpegxl_codec &&) noexcept
 
jpegxl_codecoperator= (jpegxl_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
 
bool is_jpeg_recompression_mode () const noexcept
 
float quality_distance () const noexcept
 
Compression Operations
codec_result encode (std::span< const uint8_t > pixel_data, const image_params &params, const compression_options &options={}) const override
 Compresses uncompressed pixel data.
 
codec_result decode (std::span< const uint8_t > compressed_data, const image_params &params) const override
 Decompresses compressed pixel 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 XL Lossless.
 
static constexpr std::string_view kTransferSyntaxUIDJPEGRecompression
 DICOM Transfer Syntax UID for JPEG XL JPEG Recompression.
 
static constexpr std::string_view kTransferSyntaxUIDLossy
 DICOM Transfer Syntax UID for JPEG XL (any mode)
 
static constexpr float kDefaultQualityDistance = 1.0f
 Default quality distance for lossy mode (1.0 = visually lossless)
 

Private Attributes

bool lossless_
 
bool jpeg_recompression_
 
float quality_distance_
 

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 XL codec implementation (Supplement 232).

Implements DICOM Transfer Syntaxes for JPEG XL:

  • 1.2.840.10008.1.2.4.110 (JPEG XL Lossless)
  • 1.2.840.10008.1.2.4.111 (JPEG XL JPEG Recompression – zero generation loss)
  • 1.2.840.10008.1.2.4.112 (JPEG XL – any mode)

JPEG XL provides superior compression compared to JPEG 2000 and PNG, with a unique ability to losslessly recompress existing JPEG data without any generation loss – critical for legacy archive migration.

Supported Features:

  • 8-bit and 16-bit grayscale images
  • 8-bit color images (RGB)
  • Lossless mode
  • JPEG recompression (reversible, no generation loss)
  • Lossy mode with configurable quality

Thread Safety:

  • This class is NOT thread-safe
  • Create separate instances per thread for concurrent operations
Note
Actual encode/decode operations require libjxl integration. Without libjxl, encode/decode return an error.
See also
DICOM Supplement 232 – JPEG XL Transfer Syntaxes
ISO/IEC 18181 – JPEG XL Image Coding System

Definition at line 47 of file jpegxl_codec.h.

Constructor & Destructor Documentation

◆ jpegxl_codec() [1/3]

kcenon::pacs::encoding::compression::jpegxl_codec::jpegxl_codec ( bool lossless = true,
bool jpeg_recompression = false,
float quality_distance = kDefaultQualityDistance )
explicit

Constructs a JPEG XL codec instance.

Parameters
losslessIf true, use lossless mode (UID .110).
jpeg_recompressionIf true, use JPEG recompression mode (UID .111). Only meaningful when lossless is true.
quality_distanceButteraugli distance for lossy mode (0.0 = lossless, 1.0 = visually lossless). Ignored in lossless mode.

Definition at line 10 of file jpegxl_codec.cpp.

◆ ~jpegxl_codec()

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

◆ jpegxl_codec() [2/3]

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

◆ jpegxl_codec() [3/3]

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

Member Function Documentation

◆ can_decode()

bool kcenon::pacs::encoding::compression::jpegxl_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 60 of file jpegxl_codec.cpp.

60 {
61 return can_encode(params);
62}
bool can_encode(const image_params &params) const noexcept override
Checks if this codec supports the given image parameters.

◆ can_encode()

bool kcenon::pacs::encoding::compression::jpegxl_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 44 of file jpegxl_codec.cpp.

44 {
45 if (params.width == 0 || params.height == 0) {
46 return false;
47 }
48
49 if (params.samples_per_pixel != 1 && params.samples_per_pixel != 3) {
50 return false;
51 }
52
53 if (params.bits_stored < 1 || params.bits_stored > 16) {
54 return false;
55 }
56
57 return true;
58}

◆ decode()

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

Decompresses compressed pixel data.

Parameters
compressed_dataThe compressed pixel data (single frame)
paramsImage parameters (width, height, samples_per_pixel)
Returns
codec_result containing decompressed data or error

The output pixel data is always in interleaved format (planar_configuration=0).

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

Definition at line 88 of file jpegxl_codec.cpp.

90 {
93 "JPEG XL codec not available: libjxl library not found at build time. "
94 "Build with PACS_WITH_JPEGXL=ON to enable.");
95}
constexpr int decompression_error
Definition result.h:79
Result< T > pacs_error(int code, const std::string &message, const std::string &details="")
Create a PACS error result with module context.
Definition result.h:234

References kcenon::pacs::error_codes::decompression_error, and kcenon::pacs::pacs_error().

Here is the call graph for this function:

◆ encode()

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

Compresses uncompressed pixel data.

Parameters
pixel_dataThe raw, uncompressed pixel data
paramsImage parameters describing the pixel data
optionsCompression settings
Returns
codec_result containing compressed data or error

The input pixel_data must match the format specified by params:

  • For planar_configuration=0: interleaved (RGBRGB...)
  • For planar_configuration=1: separate planes (RRR...GGG...BBB...)
Note
This is a potentially expensive operation. Consider using thread_pool_adapter for batch processing.

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

Definition at line 78 of file jpegxl_codec.cpp.

81 {
84 "JPEG XL codec not available: libjxl library not found at build time. "
85 "Build with PACS_WITH_JPEGXL=ON to enable.");
86}
constexpr int compression_error
Definition result.h:78

References kcenon::pacs::error_codes::compression_error, and kcenon::pacs::pacs_error().

Here is the call graph for this function:

◆ is_jpeg_recompression_mode()

bool kcenon::pacs::encoding::compression::jpegxl_codec::is_jpeg_recompression_mode ( ) const
nodiscardnoexcept

Definition at line 68 of file jpegxl_codec.cpp.

68 {
70}

References jpeg_recompression_.

◆ is_lossless_mode()

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

Definition at line 64 of file jpegxl_codec.cpp.

64 {
65 return lossless_;
66}

References lossless_.

◆ is_lossy()

bool kcenon::pacs::encoding::compression::jpegxl_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 40 of file jpegxl_codec.cpp.

40 {
41 return !lossless_;
42}

References lossless_.

◆ name()

std::string_view kcenon::pacs::encoding::compression::jpegxl_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 31 of file jpegxl_codec.cpp.

31 {
32 if (lossless_) {
34 ? "JPEG XL JPEG Recompression"
35 : "JPEG XL (Lossless)";
36 }
37 return "JPEG XL (Lossy)";
38}

References jpeg_recompression_, and lossless_.

◆ operator=() [1/2]

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

◆ operator=() [2/2]

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

◆ quality_distance()

float kcenon::pacs::encoding::compression::jpegxl_codec::quality_distance ( ) const
nodiscardnoexcept

Definition at line 72 of file jpegxl_codec.cpp.

72 {
73 return quality_distance_;
74}

References quality_distance_.

◆ transfer_syntax_uid()

std::string_view kcenon::pacs::encoding::compression::jpegxl_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 22 of file jpegxl_codec.cpp.

22 {
23 if (lossless_) {
27 }
29}
static constexpr std::string_view kTransferSyntaxUIDJPEGRecompression
DICOM Transfer Syntax UID for JPEG XL JPEG Recompression.
static constexpr std::string_view kTransferSyntaxUIDLossy
DICOM Transfer Syntax UID for JPEG XL (any mode)
static constexpr std::string_view kTransferSyntaxUIDLossless
DICOM Transfer Syntax UID for JPEG XL Lossless.

Member Data Documentation

◆ jpeg_recompression_

bool kcenon::pacs::encoding::compression::jpegxl_codec::jpeg_recompression_
private

Definition at line 121 of file jpegxl_codec.h.

Referenced by is_jpeg_recompression_mode(), and name().

◆ kDefaultQualityDistance

float kcenon::pacs::encoding::compression::jpegxl_codec::kDefaultQualityDistance = 1.0f
staticconstexpr

Default quality distance for lossy mode (1.0 = visually lossless)

Definition at line 62 of file jpegxl_codec.h.

◆ kTransferSyntaxUIDJPEGRecompression

std::string_view kcenon::pacs::encoding::compression::jpegxl_codec::kTransferSyntaxUIDJPEGRecompression
staticconstexpr
Initial value:
=
"1.2.840.10008.1.2.4.111"

DICOM Transfer Syntax UID for JPEG XL JPEG Recompression.

Definition at line 54 of file jpegxl_codec.h.

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

◆ kTransferSyntaxUIDLossless

std::string_view kcenon::pacs::encoding::compression::jpegxl_codec::kTransferSyntaxUIDLossless
staticconstexpr
Initial value:
=
"1.2.840.10008.1.2.4.110"

DICOM Transfer Syntax UID for JPEG XL Lossless.

Definition at line 50 of file jpegxl_codec.h.

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

◆ kTransferSyntaxUIDLossy

std::string_view kcenon::pacs::encoding::compression::jpegxl_codec::kTransferSyntaxUIDLossy
staticconstexpr
Initial value:
=
"1.2.840.10008.1.2.4.112"

DICOM Transfer Syntax UID for JPEG XL (any mode)

Definition at line 58 of file jpegxl_codec.h.

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

◆ lossless_

bool kcenon::pacs::encoding::compression::jpegxl_codec::lossless_
private

Definition at line 120 of file jpegxl_codec.h.

Referenced by is_lossless_mode(), is_lossy(), and name().

◆ quality_distance_

float kcenon::pacs::encoding::compression::jpegxl_codec::quality_distance_
private

Definition at line 122 of file jpegxl_codec.h.

Referenced by quality_distance().


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