PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
dicom_file.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
17#pragma once
18
19#include "dicom_dataset.h"
20#include "dicom_tag_constants.h"
21#include "result.h"
22
24
25#include <cstdint>
26#include <filesystem>
27#include <span>
28#include <string>
29#include <string_view>
30#include <vector>
31
32namespace kcenon::pacs::core {
33
68public:
69
70 // ========================================================================
71 // Static Factory Methods (Reading)
72 // ========================================================================
73
79 [[nodiscard]] static auto open(const std::filesystem::path& path)
81
87 [[nodiscard]] static auto from_bytes(std::span<const uint8_t> data)
89
90 // ========================================================================
91 // Static Factory Methods (Creation)
92 // ========================================================================
93
108 [[nodiscard]] static auto create(dicom_dataset dataset,
110 -> dicom_file;
111
112 // ========================================================================
113 // Writing
114 // ========================================================================
115
121 [[nodiscard]] auto save(const std::filesystem::path& path) const
122 -> kcenon::pacs::VoidResult;
123
128 [[nodiscard]] auto to_bytes() const -> std::vector<uint8_t>;
129
130 // ========================================================================
131 // Accessors
132 // ========================================================================
133
138 [[nodiscard]] auto meta_information() const noexcept -> const dicom_dataset&;
139
144 [[nodiscard]] auto meta_information() noexcept -> dicom_dataset&;
145
150 [[nodiscard]] auto dataset() const noexcept -> const dicom_dataset&;
151
156 [[nodiscard]] auto dataset() noexcept -> dicom_dataset&;
157
158 // ========================================================================
159 // Convenience Accessors
160 // ========================================================================
161
166 [[nodiscard]] auto transfer_syntax() const -> encoding::transfer_syntax;
167
172 [[nodiscard]] auto sop_class_uid() const -> std::string;
173
178 [[nodiscard]] auto sop_instance_uid() const -> std::string;
179
180 // ========================================================================
181 // Construction
182 // ========================================================================
183
187 dicom_file() = default;
188
192 dicom_file(const dicom_file&) = default;
193
197 dicom_file(dicom_file&&) noexcept = default;
198
202 auto operator=(const dicom_file&) -> dicom_file& = default;
203
207 auto operator=(dicom_file&&) noexcept -> dicom_file& = default;
208
212 ~dicom_file() = default;
213
214private:
218 dicom_file(dicom_dataset meta_info, dicom_dataset main_dataset);
219
226 [[nodiscard]] static auto parse_meta_information(
227 std::span<const uint8_t> data, size_t& bytes_read)
229
236 [[nodiscard]] static auto generate_meta_information(
237 const dicom_dataset& dataset, const encoding::transfer_syntax& ts)
238 -> dicom_dataset;
239
245 [[nodiscard]] static auto encode_explicit_vr_le(const dicom_dataset& dataset)
246 -> std::vector<uint8_t>;
247
254 [[nodiscard]] static auto decode_explicit_vr_le(
255 std::span<const uint8_t> data, size_t& bytes_read)
257
266 [[nodiscard]] static auto decode_implicit_vr_le(
267 std::span<const uint8_t> data, size_t& bytes_read)
269
276 [[nodiscard]] static auto decode_explicit_vr_be(
277 std::span<const uint8_t> data, size_t& bytes_read)
279
285 [[nodiscard]] static auto encode_implicit_vr_le(const dicom_dataset& dataset)
286 -> std::vector<uint8_t>;
287
293 [[nodiscard]] static auto encode_explicit_vr_be(const dicom_dataset& dataset)
294 -> std::vector<uint8_t>;
295
303 [[nodiscard]] static auto decode_dataset(
304 std::span<const uint8_t> data,
305 const encoding::transfer_syntax& ts,
306 size_t& bytes_read)
308
315 [[nodiscard]] static auto encode_dataset(
316 const dicom_dataset& dataset,
317 const encoding::transfer_syntax& ts)
318 -> std::vector<uint8_t>;
319
328 [[nodiscard]] static auto parse_undefined_length_sequence(
329 std::span<const uint8_t> data, size_t& bytes_read,
330 bool explicit_vr, bool big_endian)
331 -> kcenon::pacs::Result<std::vector<dicom_dataset>>;
332
338 [[nodiscard]] static auto parse_encapsulated_frames(
339 std::span<const uint8_t> data)
340 -> std::vector<std::vector<uint8_t>>;
341
344
347
349 static constexpr std::string_view kImplementationClassUid =
350 "1.2.826.0.1.3680043.8.1055.1";
351
353 static constexpr std::string_view kImplementationVersionName = "PACS_SYS_001";
354
356 static constexpr uint8_t kDicmPrefix[4] = {'D', 'I', 'C', 'M'};
357
359 static constexpr size_t kPreambleSize = 128;
360};
361
362} // namespace kcenon::pacs::core
363
dicom_file(const dicom_file &)=default
Copy constructor.
auto save(const std::filesystem::path &path) const -> kcenon::pacs::VoidResult
Save the DICOM file to disk.
dicom_file(dicom_file &&) noexcept=default
Move constructor.
static auto decode_explicit_vr_be(std::span< const uint8_t > data, size_t &bytes_read) -> kcenon::pacs::Result< dicom_dataset >
Decode a dataset from Explicit VR Big Endian format.
auto dataset() const noexcept -> const dicom_dataset &
Get read-only access to the main dataset.
static auto open(const std::filesystem::path &path) -> kcenon::pacs::Result< dicom_file >
Open and read a DICOM file from disk.
static auto from_bytes(std::span< const uint8_t > data) -> kcenon::pacs::Result< dicom_file >
Parse a DICOM file from raw bytes.
static auto encode_dataset(const dicom_dataset &dataset, const encoding::transfer_syntax &ts) -> std::vector< uint8_t >
Encode a dataset based on its Transfer Syntax.
static auto encode_implicit_vr_le(const dicom_dataset &dataset) -> std::vector< uint8_t >
Encode a dataset using Implicit VR Little Endian.
static auto decode_implicit_vr_le(std::span< const uint8_t > data, size_t &bytes_read) -> kcenon::pacs::Result< dicom_dataset >
Decode a dataset from Implicit VR Little Endian format.
static auto encode_explicit_vr_le(const dicom_dataset &dataset) -> std::vector< uint8_t >
Encode a dataset using Explicit VR Little Endian.
static auto parse_encapsulated_frames(std::span< const uint8_t > data) -> std::vector< std::vector< uint8_t > >
Parse encapsulated pixel data frames.
static constexpr size_t kPreambleSize
Preamble size.
Definition dicom_file.h:359
dicom_dataset meta_info_
File Meta Information (Group 0002)
Definition dicom_file.h:343
auto sop_instance_uid() const -> std::string
Get the SOP Instance UID.
static constexpr std::string_view kImplementationVersionName
Implementation Version Name.
Definition dicom_file.h:353
auto to_bytes() const -> std::vector< uint8_t >
Encode the DICOM file to raw bytes.
static auto decode_explicit_vr_le(std::span< const uint8_t > data, size_t &bytes_read) -> kcenon::pacs::Result< dicom_dataset >
Decode a dataset from Explicit VR Little Endian format.
auto transfer_syntax() const -> encoding::transfer_syntax
Get the Transfer Syntax of this file.
static auto encode_explicit_vr_be(const dicom_dataset &dataset) -> std::vector< uint8_t >
Encode a dataset using Explicit VR Big Endian.
auto sop_class_uid() const -> std::string
Get the SOP Class UID.
static auto decode_dataset(std::span< const uint8_t > data, const encoding::transfer_syntax &ts, size_t &bytes_read) -> kcenon::pacs::Result< dicom_dataset >
Decode a dataset based on its Transfer Syntax.
static constexpr std::string_view kImplementationClassUid
Implementation Class UID for this library.
Definition dicom_file.h:349
static auto parse_undefined_length_sequence(std::span< const uint8_t > data, size_t &bytes_read, bool explicit_vr, bool big_endian) -> kcenon::pacs::Result< std::vector< dicom_dataset > >
Parse a sequence with undefined length.
static constexpr uint8_t kDicmPrefix[4]
DICOM magic bytes.
Definition dicom_file.h:356
static auto generate_meta_information(const dicom_dataset &dataset, const encoding::transfer_syntax &ts) -> dicom_dataset
Generate File Meta Information for a dataset.
dicom_file()=default
Default constructor - creates an empty file.
dicom_dataset dataset_
Main dataset (encoded per Transfer Syntax)
Definition dicom_file.h:346
static auto create(dicom_dataset dataset, const encoding::transfer_syntax &ts) -> dicom_file
Create a new DICOM file from a dataset.
static auto parse_meta_information(std::span< const uint8_t > data, size_t &bytes_read) -> kcenon::pacs::Result< dicom_dataset >
Parse file meta information from raw data.
auto meta_information() const noexcept -> const dicom_dataset &
Get read-only access to the File Meta Information.
Represents a DICOM Transfer Syntax.
DICOM Dataset - ordered collection of Data Elements.
Compile-time constants for commonly used DICOM tags.
Transfer Syntax UIDs.
Definition main.cpp:78
Result<T> type aliases and helpers for PACS system.