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/odil.h"
19 #include "odil/registry.h"
20 #include "odil/Tag.h"
21 #include "odil/Value.h"
22 #include "odil/VR.h"
23 
24 namespace odil
25 {
26 
28 class ODIL_API Writer
29 {
30 public:
32  enum class ItemEncoding
33  {
34  ExplicitLength,
35  UndefinedLength
36  };
37 
39  std::ostream & stream;
40 
42  ByteOrdering byte_ordering;
49 
54  template<typename T>
55  static void write_binary(
56  T const & value, std::ostream & stream, ByteOrdering byte_ordering);
57 
59  static void write_encapsulated_pixel_data(
60  Value::Binary const & value, std::ostream & stream,
61  ByteOrdering byte_ordering, bool explicit_vr);
62 
64  Writer(
65  std::ostream & stream,
66  ByteOrdering byte_ordering, bool explicit_vr,
67  ItemEncoding item_encoding=ItemEncoding::ExplicitLength,
68  bool use_group_length=false);
69 
74  Writer(
75  std::ostream & stream,
76  std::string const & transfer_syntax,
77  ItemEncoding item_encoding=ItemEncoding::ExplicitLength,
78  bool use_group_length=false);
79 
81  void write_data_set(DataSet const & data_set) const;
82 
84  void write_tag(Tag const & tag) const;
85 
87  void write_element(Element const & element) const;
88 
90  static void write_file(
91  DataSet const &data_set, std::ostream & stream,
92  DataSet const & meta_information = DataSet(),
93  std::string const & transfer_syntax = registry::ExplicitVRLittleEndian,
94  ItemEncoding item_encoding=ItemEncoding::ExplicitLength,
95  bool use_group_length=false);
96 
97 private:
98 
99  struct Visitor
100  {
101  typedef void result_type;
102 
103  std::ostream & stream;
104  VR vr;
105 
106  ByteOrdering byte_ordering;
107  bool explicit_vr;
108  ItemEncoding item_encoding;
109  bool use_group_length;
110 
111  Visitor(
112  std::ostream & stream, VR vr,
113  ByteOrdering byte_ordering, bool explicit_vr, ItemEncoding item_encoding,
114  bool use_group_length);
115 
116  result_type operator()(Value::Integers const & value) const;
117  result_type operator()(Value::Reals const & value) const;
118  result_type operator()(Value::Strings const & value) const;
119  result_type operator()(Value::DataSets const & value) const;
120  result_type operator()(Value::Binary const & value) const;
121 
122  template<typename T>
123  void write_strings(T const & sequence, char padding) const;
124  };
125 };
126 
127 }
128 
129 #include "odil/Writer.txx"
130 
131 #endif // _ca5c06d2_04f9_4009_9e98_5607e1060379
bool explicit_vr
Explicit-ness of the Value Representations.
Definition: Writer.h:44
Write DICOM objects to a stream.
Definition: Writer.h:28
std::vector< String > Strings
String container.
Definition: Value.h:57
std::vector< Real > Reals
Real container.
Definition: Value.h:54
Definition: Association.cpp:39
A DICOM element tag.
Definition: Tag.h:24
std::vector< Integer > Integers
Integer container.
Definition: Value.h:51
std::vector< DataSet > DataSets
Data sets container.
Definition: Value.h:60
std::vector< std::vector< uint8_t > > Binary
Binary data container.
Definition: Value.h:63
ByteOrdering byte_ordering
Endianness.
Definition: Writer.h:42
ItemEncoding item_encoding
Encoding of sequence items.
Definition: Writer.h:46
DICOM Data set.
Definition: DataSet.h:29
ItemEncoding
Encodings of sequence items.
Definition: Writer.h:32
std::ostream & stream
Output stream.
Definition: Writer.h:39
Element of a DICOM data set.
Definition: Element.h:26
bool use_group_length
Presence of group length elements.
Definition: Writer.h:48