odil
C++11libraryfortheDICOMstandard
Writer.h
1 /*************************************************************************
2  * odil - Copyright (C) Universite de Strasbourg
3  * Distributed under the terms of the CeCILL-B license, as published by
4  * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
5  * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
6  * for details.
7  ************************************************************************/
8 
9 #ifndef _ca5c06d2_04f9_4009_9e98_5607e1060379
10 #define _ca5c06d2_04f9_4009_9e98_5607e1060379
11 
12 #include <ostream>
13 #include <string>
14 
15 #include "odil/DataSet.h"
16 #include "odil/Element.h"
17 #include "odil/endian.h"
18 #include "odil/registry.h"
19 #include "odil/Tag.h"
20 #include "odil/Value.h"
21 #include "odil/VR.h"
22 
23 namespace odil
24 {
25 
27 class Writer
28 {
29 public:
31  enum class ItemEncoding
32  {
33  ExplicitLength,
34  UndefinedLength
35  };
36 
38  std::ostream & stream;
39 
41  ByteOrdering byte_ordering;
48 
53  template<typename T>
54  static void write_binary(
55  T const & value, std::ostream & stream, ByteOrdering byte_ordering);
56 
59  Value::Binary const & value, std::ostream & stream,
60  ByteOrdering byte_ordering, bool explicit_vr);
61 
63  Writer(
64  std::ostream & stream,
65  ByteOrdering byte_ordering, bool explicit_vr,
66  ItemEncoding item_encoding=ItemEncoding::ExplicitLength,
67  bool use_group_length=false);
68 
73  Writer(
74  std::ostream & stream,
75  std::string const & transfer_syntax,
76  ItemEncoding item_encoding=ItemEncoding::ExplicitLength,
77  bool use_group_length=false);
78 
80  void write_data_set(DataSet const & data_set) const;
81 
83  void write_tag(Tag const & tag) const;
84 
86  void write_element(Element const & element) const;
87 
89  static void write_file(
90  DataSet const &data_set, std::ostream & stream,
91  DataSet const & meta_information = DataSet(),
92  std::string const & transfer_syntax = registry::ExplicitVRLittleEndian,
93  ItemEncoding item_encoding=ItemEncoding::ExplicitLength,
94  bool use_group_length=false);
95 
96 private:
97 
98  struct Visitor
99  {
100  typedef void result_type;
101 
102  std::ostream & stream;
103  VR vr;
104 
105  ByteOrdering byte_ordering;
106  bool explicit_vr;
108  bool use_group_length;
109 
110  Visitor(
111  std::ostream & stream, VR vr,
112  ByteOrdering byte_ordering, bool explicit_vr, ItemEncoding item_encoding,
113  bool use_group_length);
114 
115  result_type operator()(Value::Integers const & value) const;
116  result_type operator()(Value::Reals const & value) const;
117  result_type operator()(Value::Strings const & value) const;
118  result_type operator()(Value::DataSets const & value) const;
119  result_type operator()(Value::Binary const & value) const;
120 
121  template<typename T>
122  void write_strings(T const & sequence, char padding) const;
123  };
124 };
125 
126 }
127 
128 #include "odil/Writer.txx"
129 
130 #endif // _ca5c06d2_04f9_4009_9e98_5607e1060379
bool explicit_vr
Explicit-ness of the Value Representations.
Definition: Writer.h:43
Write DICOM objects to a stream.
Definition: Writer.h:27
void write_tag(Tag const &tag) const
Write a tag.
Definition: Writer.cpp:142
std::vector< String > Strings
String container.
Definition: Value.h:55
std::vector< Real > Reals
Real container.
Definition: Value.h:52
void write_element(Element const &element) const
Write an element (VR, VL and value).
Definition: Writer.cpp:150
static void write_file(DataSet const &data_set, std::ostream &stream, DataSet const &meta_information=DataSet(), std::string const &transfer_syntax=registry::ExplicitVRLittleEndian, ItemEncoding item_encoding=ItemEncoding::ExplicitLength, bool use_group_length=false)
Write a file (meta-information and data set).
Definition: Writer.cpp:220
Definition: Association.cpp:39
A DICOM element tag.
Definition: Tag.h:22
std::vector< Integer > Integers
Integer container.
Definition: Value.h:49
static void write_binary(T const &value, std::ostream &stream, ByteOrdering byte_ordering)
Write binary data to an stream encoded with the given endianness, ensure stream is still good...
std::vector< DataSet > DataSets
Data sets container.
Definition: Value.h:58
void write_data_set(DataSet const &data_set) const
Write a data set.
Definition: Writer.cpp:91
std::vector< std::vector< uint8_t > > Binary
Binary data container.
Definition: Value.h:61
ByteOrdering byte_ordering
Endianness.
Definition: Writer.h:41
ItemEncoding item_encoding
Encoding of sequence items.
Definition: Writer.h:45
DICOM Data set.
Definition: DataSet.h:28
ItemEncoding
Encodings of sequence items.
Definition: Writer.h:31
std::ostream & stream
Output stream.
Definition: Writer.h:38
Element of a DICOM data set.
Definition: Element.h:25
bool use_group_length
Presence of group length elements.
Definition: Writer.h:47
Writer(std::ostream &stream, ByteOrdering byte_ordering, bool explicit_vr, ItemEncoding item_encoding=ItemEncoding::ExplicitLength, bool use_group_length=false)
Build a writer.
Definition: Writer.cpp:64
static void write_encapsulated_pixel_data(Value::Binary const &value, std::ostream &stream, ByteOrdering byte_ordering, bool explicit_vr)
Write pixel data in encapsulated form.
Definition: Writer.cpp:34