Mercurial > hg > orthanc-wsi
annotate Applications/Dicomizer.cpp @ 288:a1efc5c39615
fix LSB build
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 12 Jul 2023 23:37:38 +0200 |
parents | ea08ace91b81 |
children | 5f783bf882fe |
rev | line source |
---|---|
0 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
254 | 5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
6 * Copyright (C) 2021-2023 Sebastien Jodogne, ICTEAM UCLouvain, Belgium | |
0 | 7 * |
8 * This program is free software: you can redistribute it and/or | |
9 * modify it under the terms of the GNU Affero General Public License | |
10 * as published by the Free Software Foundation, either version 3 of | |
11 * the License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Affero General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Affero General Public License | |
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 **/ | |
21 | |
22 | |
23 #include "../Framework/Algorithms/ReconstructPyramidCommand.h" | |
24 #include "../Framework/Algorithms/TranscodeTileCommand.h" | |
25 #include "../Framework/DicomToolbox.h" | |
26 #include "../Framework/DicomizerParameters.h" | |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
27 #include "../Framework/ImageToolbox.h" |
0 | 28 #include "../Framework/ImagedVolumeParameters.h" |
244
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
29 #include "../Framework/Inputs/CytomineImage.h" |
0 | 30 #include "../Framework/Inputs/HierarchicalTiff.h" |
31 #include "../Framework/Inputs/OpenSlidePyramid.h" | |
32 #include "../Framework/Inputs/TiledJpegImage.h" | |
33 #include "../Framework/Inputs/TiledPngImage.h" | |
34 #include "../Framework/Inputs/TiledPyramidStatistics.h" | |
151 | 35 #include "../Framework/MultiThreading/BagOfTasksProcessor.h" |
0 | 36 #include "../Framework/Outputs/DicomPyramidWriter.h" |
37 #include "../Framework/Outputs/TruncatedPyramidWriter.h" | |
38 | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
39 #include <Compatibility.h> // For std::unique_ptr |
192 | 40 #include <DicomParsing/FromDcmtkBridge.h> |
41 #include <Logging.h> | |
42 #include <OrthancException.h> | |
213
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
43 #include <Toolbox.h> |
192 | 44 #include <SystemToolbox.h> |
59
7a3853d51c45
Move "Framework/Orthanc/" as "Resources/Orthanc/"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
57
diff
changeset
|
45 |
0 | 46 #include "ApplicationToolbox.h" |
47 | |
48 #include <EmbeddedResources.h> | |
49 | |
50 #include <dcmtk/dcmdata/dcdeftag.h> | |
51 #include <dcmtk/dcmdata/dcuid.h> | |
52 #include <dcmtk/dcmdata/dcvrobow.h> | |
53 #include <dcmtk/dcmdata/dcvrat.h> | |
54 | |
55 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
56 static const char* OPTION_COLOR = "color"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
57 static const char* OPTION_COMPRESSION = "compression"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
58 static const char* OPTION_DATASET = "dataset"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
59 static const char* OPTION_FOLDER = "folder"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
60 static const char* OPTION_FOLDER_PATTERN = "folder-pattern"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
61 static const char* OPTION_HELP = "help"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
62 static const char* OPTION_ICC_PROFILE = "icc-profile"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
63 static const char* OPTION_IMAGED_DEPTH = "imaged-depth"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
64 static const char* OPTION_IMAGED_HEIGHT = "imaged-height"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
65 static const char* OPTION_IMAGED_WIDTH = "imaged-width"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
66 static const char* OPTION_INPUT = "input"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
67 static const char* OPTION_JPEG_QUALITY = "jpeg-quality"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
68 static const char* OPTION_LEVELS = "levels"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
69 static const char* OPTION_LOWER_LEVELS = "lower-levels"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
70 static const char* OPTION_MAX_SIZE = "max-size"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
71 static const char* OPTION_OFFSET_X = "offset-x"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
72 static const char* OPTION_OFFSET_Y = "offset-y"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
73 static const char* OPTION_OPENSLIDE = "openslide"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
74 static const char* OPTION_OPTICAL_PATH = "optical-path"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
75 static const char* OPTION_PYRAMID = "pyramid"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
76 static const char* OPTION_REENCODE = "reencode"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
77 static const char* OPTION_REPAINT = "repaint"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
78 static const char* OPTION_SAFETY = "safety"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
79 static const char* OPTION_SAMPLE_DATASET = "sample-dataset"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
80 static const char* OPTION_SMOOTH = "smooth"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
81 static const char* OPTION_THREADS = "threads"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
82 static const char* OPTION_TILE_HEIGHT = "tile-height"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
83 static const char* OPTION_TILE_WIDTH = "tile-width"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
84 static const char* OPTION_VERBOSE = "verbose"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
85 static const char* OPTION_VERSION = "version"; |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
86 |
244
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
87 // New in release 1.1 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
88 static const char* OPTION_CYTOMINE_URL = "cytomine-url"; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
89 static const char* OPTION_CYTOMINE_IMAGE_INSTANCE_ID = "cytomine-image"; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
90 static const char* OPTION_CYTOMINE_PUBLIC_KEY = "cytomine-public-key"; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
91 static const char* OPTION_CYTOMINE_PRIVATE_KEY = "cytomine-private-key"; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
92 static const char* OPTION_CYTOMINE_COMPRESSION = "cytomine-compression"; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
93 |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
94 |
226 | 95 #if ORTHANC_FRAMEWORK_VERSION_IS_ABOVE(1, 9, 0) |
96 | |
97 bool ReadJsonWithoutComments(Json::Value& target, | |
98 const std::string& source) | |
99 { | |
100 return Orthanc::Toolbox::ReadJsonWithoutComments(target, source); | |
101 } | |
102 | |
103 #else | |
104 | |
105 // Backward compatibility with Orthanc framework <= 1.8.2 | |
106 #include <json/reader.h> | |
107 | |
108 bool ReadJsonWithoutComments(Json::Value& target, | |
109 const std::string& source) | |
110 { | |
111 Json::Reader reader; | |
112 return reader.parse(source, target, false); | |
113 } | |
114 #endif | |
115 | |
116 | |
0 | 117 static void TranscodePyramid(OrthancWSI::PyramidWriterBase& target, |
118 OrthancWSI::ITiledPyramid& source, | |
119 const OrthancWSI::DicomizerParameters& parameters) | |
120 { | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
121 LOG(WARNING) << "Transcoding the source pyramid (not re-encoding)"; |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
122 |
236
b0ee417b667a
migrating new definitions in namespace Orthanc to namespace OrthancWSI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
123 OrthancWSI::BagOfTasks tasks; |
0 | 124 |
125 for (unsigned int i = 0; i < source.GetLevelCount(); i++) | |
126 { | |
127 LOG(WARNING) << "Creating level " << i << " of size " | |
128 << source.GetLevelWidth(i) << "x" << source.GetLevelHeight(i); | |
129 target.AddLevel(source.GetLevelWidth(i), source.GetLevelHeight(i)); | |
130 } | |
131 | |
132 OrthancWSI::TranscodeTileCommand::PrepareBagOfTasks(tasks, target, source, parameters); | |
133 OrthancWSI::ApplicationToolbox::Execute(tasks, parameters.GetThreadsCount()); | |
134 } | |
135 | |
136 | |
137 static void ReconstructPyramid(OrthancWSI::PyramidWriterBase& target, | |
138 OrthancWSI::ITiledPyramid& source, | |
139 const OrthancWSI::DicomizerParameters& parameters) | |
140 { | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
141 LOG(WARNING) << "Re-encoding the source pyramid (not transcoding, slower process)"; |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
142 |
236
b0ee417b667a
migrating new definitions in namespace Orthanc to namespace OrthancWSI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
143 OrthancWSI::BagOfTasks tasks; |
0 | 144 |
145 unsigned int levelsCount = parameters.GetPyramidLevelsCount(target, source); | |
146 LOG(WARNING) << "The target pyramid will have " << levelsCount << " levels"; | |
147 assert(levelsCount >= 1); | |
148 | |
149 for (unsigned int i = 0; i < levelsCount; i++) | |
150 { | |
151 unsigned int width = OrthancWSI::CeilingDivision(source.GetLevelWidth(0), 1 << i); | |
152 unsigned int height = OrthancWSI::CeilingDivision(source.GetLevelHeight(0), 1 << i); | |
153 | |
154 LOG(WARNING) << "Creating level " << i << " of size " << width << "x" << height; | |
155 target.AddLevel(width, height); | |
156 } | |
157 | |
158 unsigned int lowerLevelsCount = parameters.GetPyramidLowerLevelsCount(target, source); | |
159 if (lowerLevelsCount > levelsCount) | |
160 { | |
161 LOG(WARNING) << "The number of lower levels (" << lowerLevelsCount | |
162 << ") exceeds the number of levels (" << levelsCount | |
163 << "), cropping it"; | |
164 lowerLevelsCount = levelsCount; | |
165 } | |
166 | |
167 assert(lowerLevelsCount <= levelsCount); | |
168 if (lowerLevelsCount != levelsCount) | |
169 { | |
170 LOG(WARNING) << "Constructing the " << lowerLevelsCount << " lower levels of the pyramid"; | |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
171 OrthancWSI::TruncatedPyramidWriter truncated(target, lowerLevelsCount, source.GetPhotometricInterpretation()); |
0 | 172 OrthancWSI::ReconstructPyramidCommand::PrepareBagOfTasks |
173 (tasks, truncated, source, lowerLevelsCount + 1, 0, parameters); | |
174 OrthancWSI::ApplicationToolbox::Execute(tasks, parameters.GetThreadsCount()); | |
175 | |
176 assert(tasks.GetSize() == 0); | |
177 | |
178 const unsigned int upperLevelsCount = levelsCount - lowerLevelsCount; | |
179 LOG(WARNING) << "Constructing the " << upperLevelsCount << " upper levels of the pyramid"; | |
180 OrthancWSI::ReconstructPyramidCommand::PrepareBagOfTasks | |
181 (tasks, target, truncated.GetUpperLevel(), | |
182 upperLevelsCount, lowerLevelsCount, parameters); | |
183 OrthancWSI::ApplicationToolbox::Execute(tasks, parameters.GetThreadsCount()); | |
184 } | |
185 else | |
186 { | |
187 LOG(WARNING) << "Constructing the pyramid"; | |
188 OrthancWSI::ReconstructPyramidCommand::PrepareBagOfTasks | |
189 (tasks, target, source, levelsCount, 0, parameters); | |
190 OrthancWSI::ApplicationToolbox::Execute(tasks, parameters.GetThreadsCount()); | |
191 } | |
192 } | |
193 | |
194 | |
195 static void Recompress(OrthancWSI::IFileTarget& output, | |
196 OrthancWSI::ITiledPyramid& source, | |
197 const DcmDataset& dataset, | |
198 const OrthancWSI::DicomizerParameters& parameters, | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
199 const OrthancWSI::ImagedVolumeParameters& volume, |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
200 OrthancWSI::ImageCompression sourceCompression) |
0 | 201 { |
202 OrthancWSI::TiledPyramidStatistics stats(source); | |
203 | |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
204 OrthancWSI::ImageToolbox::CheckConstantTileSize(stats); // Sanity check |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
205 LOG(WARNING) << "Size of source tiles: " << stats.GetTileWidth(0) << "x" << stats.GetTileHeight(0); |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
206 LOG(WARNING) << "Pixel format: " << Orthanc::EnumerationToString(source.GetPixelFormat()); |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
207 LOG(WARNING) << "Source photometric interpretation: " << Orthanc::EnumerationToString(source.GetPhotometricInterpretation()); |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
208 LOG(WARNING) << "Source compression: " << EnumerationToString(sourceCompression); |
0 | 209 LOG(WARNING) << "Smoothing is " << (parameters.IsSmoothEnabled() ? "enabled" : "disabled"); |
210 | |
211 if (parameters.IsRepaintBackground()) | |
212 { | |
213 LOG(WARNING) << "Repainting the background with color: (" | |
214 << static_cast<int>(parameters.GetBackgroundColorRed()) << "," | |
215 << static_cast<int>(parameters.GetBackgroundColorGreen()) << "," | |
216 << static_cast<int>(parameters.GetBackgroundColorBlue()) << ")"; | |
217 } | |
218 else | |
219 { | |
220 LOG(WARNING) << "No repainting of the background"; | |
221 } | |
222 | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
223 Orthanc::PhotometricInterpretation targetPhotometric; |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
224 bool transcoding; |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
225 |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
226 if (parameters.IsForceReencode() || |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
227 parameters.IsReconstructPyramid() || |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
228 sourceCompression != parameters.GetTargetCompression()) |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
229 { |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
230 // The tiles of the source image will be re-encoded |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
231 transcoding = false; |
171 | 232 |
233 if (source.GetPixelFormat() == Orthanc::PixelFormat_Grayscale8) | |
234 { | |
235 targetPhotometric = source.GetPhotometricInterpretation(); | |
236 } | |
237 else | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
238 { |
171 | 239 switch (parameters.GetTargetCompression()) |
240 { | |
241 case OrthancWSI::ImageCompression_Jpeg: | |
242 case OrthancWSI::ImageCompression_Jpeg2000: | |
243 targetPhotometric = Orthanc::PhotometricInterpretation_YBRFull422; | |
244 break; | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
245 |
171 | 246 case OrthancWSI::ImageCompression_None: |
247 targetPhotometric = Orthanc::PhotometricInterpretation_RGB; | |
248 break; | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
249 |
171 | 250 default: |
251 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
252 } | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
253 } |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
254 } |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
255 else |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
256 { |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
257 // Transcoding: The tiles are copied (no re-encoding) |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
258 transcoding = true; |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
259 targetPhotometric = source.GetPhotometricInterpretation(); |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
260 } |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
261 |
0 | 262 OrthancWSI::DicomPyramidWriter target(output, dataset, |
263 source.GetPixelFormat(), | |
264 parameters.GetTargetCompression(), | |
265 parameters.GetTargetTileWidth(source), | |
266 parameters.GetTargetTileHeight(source), | |
267 parameters.GetDicomMaxFileSize(), | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
268 volume, targetPhotometric); |
29 | 269 target.SetJpegQuality(parameters.GetJpegQuality()); |
0 | 270 |
271 LOG(WARNING) << "Size of target tiles: " << target.GetTileWidth() << "x" << target.GetTileHeight(); | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
272 LOG(WARNING) << "Target photometric interpretation: " << Orthanc::EnumerationToString(targetPhotometric); |
0 | 273 |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
274 if (!transcoding && |
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
275 target.GetImageCompression() == OrthancWSI::ImageCompression_Jpeg) |
0 | 276 { |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
277 LOG(WARNING) << "Target compression: Jpeg with quality " |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
278 << static_cast<int>(target.GetJpegQuality()); |
0 | 279 target.SetJpegQuality(target.GetJpegQuality()); |
280 } | |
281 else | |
282 { | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
283 LOG(WARNING) << "Target compression: " |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
284 << OrthancWSI::EnumerationToString(target.GetImageCompression()); |
0 | 285 } |
286 | |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
287 OrthancWSI::ImageToolbox::CheckConstantTileSize(stats); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
288 if (stats.GetTileWidth(0) % target.GetTileWidth() != 0 || |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
289 stats.GetTileHeight(0) % target.GetTileHeight() != 0) |
0 | 290 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
291 LOG(ERROR) << "When resampling the tile size, " |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
292 << "it must be a integer divisor of the original tile size"; |
0 | 293 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); |
294 } | |
295 | |
296 if (target.GetTileWidth() <= 16 || | |
297 target.GetTileHeight() <= 16) | |
298 { | |
299 LOG(ERROR) << "Tiles are too small (16 pixels minimum): " | |
300 << target.GetTileWidth() << "x" << target.GetTileHeight(); | |
301 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); | |
302 } | |
303 | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
304 if (transcoding) |
0 | 305 { |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
306 TranscodePyramid(target, stats, parameters); |
0 | 307 } |
308 else | |
309 { | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
310 ReconstructPyramid(target, stats, parameters); |
0 | 311 } |
312 | |
313 target.Flush(); | |
314 } | |
315 | |
316 | |
317 | |
318 static DcmDataset* ParseDataset(const std::string& path) | |
319 { | |
320 Json::Value json; | |
321 | |
322 if (path.empty()) | |
323 { | |
324 json = Json::objectValue; // Empty dataset => TODO EMBED | |
325 } | |
326 else | |
327 { | |
328 std::string content; | |
43 | 329 Orthanc::SystemToolbox::ReadFile(content, path); |
0 | 330 |
226 | 331 if (!ReadJsonWithoutComments(json, content)) |
0 | 332 { |
333 LOG(ERROR) << "Cannot parse the JSON file in: " << path; | |
334 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
335 } | |
336 } | |
337 | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
338 std::unique_ptr<DcmDataset> dataset(Orthanc::FromDcmtkBridge::FromJson(json, true, true, Orthanc::Encoding_Latin1, |
177
ea62c89b264b
fix due to change in the orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
175
diff
changeset
|
339 "" /* no private tag, thus no private creator */)); |
0 | 340 if (dataset.get() == NULL) |
341 { | |
342 LOG(ERROR) << "Cannot convert to JSON file to a DICOM dataset: " << path; | |
343 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
344 } | |
345 | |
346 // VL Whole Slide Microscopy Image IOD | |
271
45e3b5adf4ae
opened issue 2379 in OpenSeadragon
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
265
diff
changeset
|
347 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_SOPClassUID, OrthancWSI::VL_WHOLE_SLIDE_MICROSCOPY_IMAGE_STORAGE_IOD); |
0 | 348 |
349 // Slide Microscopy | |
350 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_Modality, "SM"); | |
351 | |
352 // Patient orientation makes no sense in whole-slide images | |
353 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_PatientOrientation, ""); | |
354 | |
355 // Some basic coordinate information | |
356 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_VolumetricProperties, "VOLUME"); | |
357 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_ImageOrientationSlide, "0\\-1\\0\\-1\\0\\0"); | |
358 | |
359 std::string date, time; | |
130 | 360 Orthanc::SystemToolbox::GetNowDicom(date, time, true /* use UTC time (not local time) */); |
0 | 361 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_StudyDate, date); |
362 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_StudyTime, time); | |
363 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_SeriesDate, date); | |
364 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_SeriesTime, time); | |
365 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_ContentDate, date); | |
366 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_ContentTime, time); | |
367 OrthancWSI::DicomToolbox::SetStringTag(*dataset, DCM_AcquisitionDateTime, date + time); | |
368 | |
369 return dataset.release(); | |
370 } | |
371 | |
372 | |
373 | |
374 static void SetupDimension(DcmDataset& dataset, | |
375 const std::string& opticalPathId, | |
376 const OrthancWSI::ITiledPyramid& source, | |
377 const OrthancWSI::ImagedVolumeParameters& volume) | |
378 { | |
83 | 379 // Extract the identifier of the Dimension Organization, if provided |
380 std::string organization; | |
0 | 381 DcmItem* previous = OrthancWSI::DicomToolbox::ExtractSingleSequenceItem(dataset, DCM_DimensionOrganizationSequence); |
382 | |
83 | 383 if (previous != NULL && |
384 previous->tagExists(DCM_DimensionOrganizationUID)) | |
385 { | |
386 organization = OrthancWSI::DicomToolbox::GetStringTag(*previous, DCM_DimensionOrganizationUID); | |
387 } | |
388 else | |
0 | 389 { |
83 | 390 // No Dimension Organization provided: Generate an unique identifier |
391 organization = Orthanc::FromDcmtkBridge::GenerateUniqueIdentifier(Orthanc::ResourceType_Instance); | |
392 } | |
393 | |
394 | |
395 { | |
396 // Construct tag "Dimension Organization Sequence" (0020,9221) | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
397 std::unique_ptr<DcmItem> item(new DcmItem); |
83 | 398 OrthancWSI::DicomToolbox::SetStringTag(*item, DCM_DimensionOrganizationUID, organization); |
399 | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
400 std::unique_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_DimensionOrganizationSequence)); |
83 | 401 |
402 if (!sequence->insert(item.release(), false, false).good() || | |
403 !dataset.insert(sequence.release(), true /* replace */, false).good()) | |
0 | 404 { |
83 | 405 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
0 | 406 } |
407 } | |
408 | |
83 | 409 |
0 | 410 { |
83 | 411 // Construct tag "Dimension Index Sequence" (0020,9222) |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
412 std::unique_ptr<DcmItem> item(new DcmItem); |
83 | 413 OrthancWSI::DicomToolbox::SetStringTag(*item, DCM_DimensionOrganizationUID, organization); |
84
727670c5c125
fix generation of "Dimension Index Sequence" and "Dimension Index Values"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
83
diff
changeset
|
414 OrthancWSI::DicomToolbox::SetAttributeTag(*item, DCM_FunctionalGroupPointer, DCM_PlanePositionSlideSequence); |
727670c5c125
fix generation of "Dimension Index Sequence" and "Dimension Index Values"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
83
diff
changeset
|
415 OrthancWSI::DicomToolbox::SetAttributeTag(*item, DCM_DimensionIndexPointer, DCM_ColumnPositionInTotalImagePixelMatrix); |
727670c5c125
fix generation of "Dimension Index Sequence" and "Dimension Index Values"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
83
diff
changeset
|
416 |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
417 std::unique_ptr<DcmItem> item2(new DcmItem); |
84
727670c5c125
fix generation of "Dimension Index Sequence" and "Dimension Index Values"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
83
diff
changeset
|
418 OrthancWSI::DicomToolbox::SetStringTag(*item2, DCM_DimensionOrganizationUID, organization); |
727670c5c125
fix generation of "Dimension Index Sequence" and "Dimension Index Values"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
83
diff
changeset
|
419 OrthancWSI::DicomToolbox::SetAttributeTag(*item2, DCM_FunctionalGroupPointer, DCM_PlanePositionSlideSequence); |
727670c5c125
fix generation of "Dimension Index Sequence" and "Dimension Index Values"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
83
diff
changeset
|
420 OrthancWSI::DicomToolbox::SetAttributeTag(*item2, DCM_DimensionIndexPointer, DCM_RowPositionInTotalImagePixelMatrix); |
0 | 421 |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
422 std::unique_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_DimensionIndexSequence)); |
0 | 423 |
83 | 424 if (!sequence->insert(item.release(), false, false).good() || |
84
727670c5c125
fix generation of "Dimension Index Sequence" and "Dimension Index Values"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
83
diff
changeset
|
425 !sequence->insert(item2.release(), false, false).good() || |
83 | 426 !dataset.insert(sequence.release(), true /* replace */, false).good()) |
427 { | |
428 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
429 } | |
0 | 430 } |
431 | |
432 | |
83 | 433 { |
434 // Construct tag "Shared Functional Groups Sequence" (5200,9229) | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
435 std::unique_ptr<DcmItem> item(new DcmItem); |
168
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
436 |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
437 std::unique_ptr<DcmItem> item3(new DcmItem); |
168
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
438 OrthancWSI::DicomToolbox::SetStringTag(*item3, DCM_OpticalPathIdentifier, opticalPathId); |
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
439 |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
440 std::unique_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_SharedFunctionalGroupsSequence)); |
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
441 std::unique_ptr<DcmSequenceOfItems> sequence3(new DcmSequenceOfItems(DCM_OpticalPathIdentificationSequence)); |
168
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
442 |
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
443 if (!sequence3->insert(item3.release(), false, false).good() || |
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
444 !item->insert(sequence3.release(), false, false).good() || |
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
445 !sequence->insert(item.release(), false, false).good() || |
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
446 !dataset.insert(sequence.release(), true /* replace */, false).good()) |
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
447 { |
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
448 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
d3aea0af03e1
attempt to fix issue 139
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
167
diff
changeset
|
449 } |
0 | 450 } |
451 } | |
452 | |
453 | |
454 static void EnrichDataset(DcmDataset& dataset, | |
455 const OrthancWSI::ITiledPyramid& source, | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
456 OrthancWSI::ImageCompression sourceCompression, |
0 | 457 const OrthancWSI::DicomizerParameters& parameters, |
458 const OrthancWSI::ImagedVolumeParameters& volume) | |
459 { | |
460 Orthanc::Encoding encoding = Orthanc::FromDcmtkBridge::DetectEncoding(dataset, Orthanc::Encoding_Latin1); | |
461 | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
462 if (sourceCompression == OrthancWSI::ImageCompression_Jpeg || |
0 | 463 parameters.GetTargetCompression() == OrthancWSI::ImageCompression_Jpeg) |
464 { | |
465 // Takes as estimation a 1:10 compression ratio | |
466 OrthancWSI::DicomToolbox::SetStringTag(dataset, DCM_LossyImageCompression, "01"); | |
467 OrthancWSI::DicomToolbox::SetStringTag(dataset, DCM_LossyImageCompressionRatio, "10"); | |
468 OrthancWSI::DicomToolbox::SetStringTag(dataset, DCM_LossyImageCompressionMethod, "ISO_10918_1"); // JPEG Lossy Compression | |
469 } | |
470 else | |
471 { | |
472 OrthancWSI::DicomToolbox::SetStringTag(dataset, DCM_LossyImageCompression, "00"); | |
473 } | |
474 | |
475 OrthancWSI::DicomToolbox::SetStringTag(dataset, DCM_ImagedVolumeWidth, boost::lexical_cast<std::string>(volume.GetWidth())); | |
476 OrthancWSI::DicomToolbox::SetStringTag(dataset, DCM_ImagedVolumeHeight, boost::lexical_cast<std::string>(volume.GetHeight())); | |
477 OrthancWSI::DicomToolbox::SetStringTag(dataset, DCM_ImagedVolumeDepth, boost::lexical_cast<std::string>(volume.GetDepth())); | |
478 | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
479 std::unique_ptr<DcmItem> origin(new DcmItem); |
0 | 480 OrthancWSI::DicomToolbox::SetStringTag(*origin, DCM_XOffsetInSlideCoordinateSystem, |
481 boost::lexical_cast<std::string>(volume.GetOffsetX())); | |
482 OrthancWSI::DicomToolbox::SetStringTag(*origin, DCM_YOffsetInSlideCoordinateSystem, | |
483 boost::lexical_cast<std::string>(volume.GetOffsetY())); | |
484 | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
485 std::unique_ptr<DcmSequenceOfItems> sequenceOrigin(new DcmSequenceOfItems(DCM_TotalPixelMatrixOriginSequence)); |
0 | 486 if (!sequenceOrigin->insert(origin.release(), false, false).good() || |
487 !dataset.insert(sequenceOrigin.release(), false, false).good()) | |
488 { | |
489 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
490 } | |
491 | |
492 | |
493 if (parameters.GetOpticalPath() == OrthancWSI::OpticalPath_Brightfield) | |
494 { | |
495 if (dataset.tagExists(DCM_OpticalPathSequence)) | |
496 { | |
497 LOG(ERROR) << "The user DICOM dataset already contains an optical path sequence, giving up"; | |
498 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
499 } | |
500 | |
501 std::string brightfield; | |
502 Orthanc::EmbeddedResources::GetFileResource(brightfield, Orthanc::EmbeddedResources::BRIGHTFIELD_OPTICAL_PATH); | |
503 | |
504 Json::Value json; | |
226 | 505 if (!ReadJsonWithoutComments(json, brightfield)) |
0 | 506 { |
507 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
508 } | |
509 | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
510 std::unique_ptr<DcmElement> element(Orthanc::FromDcmtkBridge::FromJson( |
0 | 511 Orthanc::DicomTag(DCM_OpticalPathSequence.getGroup(), |
512 DCM_OpticalPathSequence.getElement()), | |
177
ea62c89b264b
fix due to change in the orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
175
diff
changeset
|
513 json, false, encoding, |
ea62c89b264b
fix due to change in the orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
175
diff
changeset
|
514 "" /* no private tag, thus no private creator */)); |
0 | 515 if (!dataset.insert(element.release()).good()) |
516 { | |
517 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
518 } | |
519 } | |
520 | |
521 | |
522 std::string profile; | |
523 if (parameters.GetIccProfilePath().empty()) | |
524 { | |
525 Orthanc::EmbeddedResources::GetFileResource(profile, Orthanc::EmbeddedResources::SRGB_ICC_PROFILE); | |
526 } | |
527 else | |
528 { | |
43 | 529 Orthanc::SystemToolbox::ReadFile(profile, parameters.GetIccProfilePath()); |
0 | 530 } |
531 | |
532 | |
533 DcmItem* opticalPath = OrthancWSI::DicomToolbox::ExtractSingleSequenceItem(dataset, DCM_OpticalPathSequence); | |
534 if (opticalPath == NULL) | |
535 { | |
536 LOG(ERROR) << "No optical path specified"; | |
537 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
538 } | |
539 | |
540 if (!opticalPath->tagExists(DCM_ICCProfile)) | |
541 { | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
542 std::unique_ptr<DcmOtherByteOtherWord> icc(new DcmOtherByteOtherWord(DCM_ICCProfile)); |
0 | 543 |
544 if (!icc->putUint8Array(reinterpret_cast<const Uint8*>(profile.c_str()), profile.size()).good() || | |
545 !opticalPath->insert(icc.release()).good()) | |
546 { | |
547 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
548 } | |
549 } | |
550 | |
551 const char* opticalPathId = NULL; | |
552 if (!opticalPath->findAndGetString(DCM_OpticalPathIdentifier, opticalPathId).good() || | |
553 opticalPathId == NULL) | |
554 { | |
555 LOG(ERROR) << "No identifier in the optical path"; | |
556 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
557 } | |
558 | |
559 SetupDimension(dataset, opticalPathId, source, volume); | |
560 } | |
561 | |
562 | |
563 static bool ParseParameters(int& exitStatus, | |
564 OrthancWSI::DicomizerParameters& parameters, | |
565 OrthancWSI::ImagedVolumeParameters& volume, | |
566 int argc, | |
567 char* argv[]) | |
568 { | |
569 // Declare the supported parameters | |
570 boost::program_options::options_description generic("Generic options"); | |
571 generic.add_options() | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
572 (OPTION_HELP, "Display this help and exit") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
573 (OPTION_VERSION, "Output version information and exit") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
574 (OPTION_VERBOSE, "Be verbose in logs") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
575 (OPTION_THREADS, |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
576 boost::program_options::value<int>()->default_value(parameters.GetThreadsCount()), |
0 | 577 "Number of processing threads to be used") |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
578 (OPTION_OPENSLIDE, boost::program_options::value<std::string>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
579 "Path to the shared library of OpenSlide " |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
580 "(not necessary if converting from standard hierarchical TIFF)") |
0 | 581 ; |
582 | |
583 boost::program_options::options_description source("Options for the source image"); | |
584 source.add_options() | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
585 (OPTION_DATASET, boost::program_options::value<std::string>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
586 "Path to a JSON file containing the DICOM dataset") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
587 (OPTION_SAMPLE_DATASET, |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
588 "Display a minimalistic sample DICOM dataset in JSON format, then exit") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
589 (OPTION_REENCODE, boost::program_options::value<bool>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
590 "Whether to re-encode each tile (no transcoding, much slower) (Boolean)") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
591 (OPTION_REPAINT, boost::program_options::value<bool>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
592 "Whether to repaint the background of the image (Boolean)") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
593 (OPTION_COLOR, boost::program_options::value<std::string>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
594 "Color of the background (e.g. \"255,0,0\")") |
0 | 595 ; |
596 | |
244
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
597 boost::program_options::options_description cytomine("Options if importing from Cytomine"); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
598 cytomine.add_options() |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
599 (OPTION_CYTOMINE_URL, boost::program_options::value<std::string>(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
600 "URL of the source Cytomine server, for instance: https://demo.cytomine.be/") |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
601 (OPTION_CYTOMINE_PUBLIC_KEY, boost::program_options::value<std::string>(), |
246 | 602 "Your personal public key in Cytomine (cf. Account in the Cytomine Web interface)") |
244
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
603 (OPTION_CYTOMINE_PRIVATE_KEY, boost::program_options::value<std::string>(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
604 "Your personal private key in Cytomine (to be kept secret)") |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
605 (OPTION_CYTOMINE_IMAGE_INSTANCE_ID, boost::program_options::value<int>(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
606 "ID of the Image Instance of interest in Cytomine (must be an integer)") |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
607 (OPTION_CYTOMINE_COMPRESSION, boost::program_options::value<std::string>()->default_value("jpeg"), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
608 "Compression to be used for downloading the tiles from Cytomine, " |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
609 "can be \"jpeg\" (faster) or \"png\" (better quality)") |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
610 ; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
611 |
0 | 612 boost::program_options::options_description pyramid("Options to construct the pyramid"); |
613 pyramid.add_options() | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
614 (OPTION_PYRAMID, boost::program_options::value<bool>()->default_value(false), |
0 | 615 "Reconstruct the full pyramid (slow) (Boolean)") |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
616 (OPTION_SMOOTH, boost::program_options::value<bool>()->default_value(false), |
0 | 617 "Apply smoothing when reconstructing the pyramid " |
618 "(slower, but higher quality) (Boolean)") | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
619 (OPTION_LEVELS, boost::program_options::value<int>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
620 "Number of levels in the target pyramid") |
0 | 621 ; |
622 | |
623 boost::program_options::options_description target("Options for the target image"); | |
624 target.add_options() | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
625 (OPTION_TILE_WIDTH, boost::program_options::value<int>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
626 "Width of the tiles in the target image") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
627 (OPTION_TILE_HEIGHT, boost::program_options::value<int>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
628 "Height of the tiles in the target image") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
629 (OPTION_COMPRESSION, boost::program_options::value<std::string>(), |
0 | 630 "Compression of the target image (\"none\", \"jpeg\" or \"jpeg2000\")") |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
631 (OPTION_JPEG_QUALITY, boost::program_options::value<int>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
632 "Set quality level for JPEG (0..100)") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
633 (OPTION_MAX_SIZE, boost::program_options::value<int>()->default_value(10), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
634 "Maximum size per DICOM instance (in MB), 0 means no limit on the file size") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
635 (OPTION_FOLDER, boost::program_options::value<std::string>(), |
0 | 636 "Folder where to store the output DICOM instances") |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
637 (OPTION_FOLDER_PATTERN, |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
638 boost::program_options::value<std::string>()->default_value("wsi-%06d.dcm"), |
0 | 639 "Pattern for the files in the output folder") |
640 ("orthanc", boost::program_options::value<std::string>()->default_value("http://localhost:8042/"), | |
641 "URL to the REST API of the target Orthanc server") | |
642 ; | |
643 | |
644 boost::program_options::options_description volumeOptions("Description of the imaged volume"); | |
645 volumeOptions.add_options() | |
279
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
646 (OPTION_IMAGED_WIDTH, boost::program_options::value<float>(), |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
647 "Width of the specimen (in mm), defaults to 15mm if missing") |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
648 (OPTION_IMAGED_HEIGHT, boost::program_options::value<float>(), |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
649 "Height of the specimen (in mm), defaults to 15mm if missing") |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
650 (OPTION_IMAGED_DEPTH, boost::program_options::value<float>()->default_value(1), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
651 "Depth of the specimen (in mm)") |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
652 (OPTION_OFFSET_X, boost::program_options::value<float>()->default_value(20), |
0 | 653 "X offset the specimen, wrt. slide coordinates origin (in mm)") |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
654 (OPTION_OFFSET_Y, boost::program_options::value<float>()->default_value(40), |
0 | 655 "Y offset the specimen, wrt. slide coordinates origin (in mm)") |
656 ; | |
657 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
658 boost::program_options::options_description restOptions |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
659 ("HTTP/HTTPS client configuration to access the Orthanc REST API"); |
125
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
660 OrthancWSI::ApplicationToolbox::AddRestApiOptions(restOptions); |
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
661 |
0 | 662 boost::program_options::options_description advancedOptions("Advanced options"); |
663 advancedOptions.add_options() | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
664 (OPTION_OPTICAL_PATH, boost::program_options::value<std::string>()->default_value("brightfield"), |
0 | 665 "Optical path to be automatically added to the DICOM dataset (\"none\" or \"brightfield\")") |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
666 (OPTION_ICC_PROFILE, boost::program_options::value<std::string>(), |
0 | 667 "Path to the ICC profile to be included. If empty, a default sRGB profile will be added.") |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
668 (OPTION_SAFETY, boost::program_options::value<bool>()->default_value(true), |
0 | 669 "Whether to do additional checks to verify the source image is supported (might slow down) (Boolean)") |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
670 (OPTION_LOWER_LEVELS, boost::program_options::value<int>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
671 "Number of pyramid levels up to which multithreading " |
0 | 672 "should be applied (only for performance/memory tuning)") |
673 ; | |
674 | |
675 boost::program_options::options_description hidden; | |
676 hidden.add_options() | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
677 (OPTION_INPUT, boost::program_options::value<std::string>(), |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
678 "Input file"); |
0 | 679 ; |
680 | |
681 boost::program_options::options_description allWithoutHidden; | |
125
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
682 allWithoutHidden |
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
683 .add(generic) |
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
684 .add(source) |
244
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
685 .add(cytomine) |
125
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
686 .add(pyramid) |
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
687 .add(target) |
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
688 .add(volumeOptions) |
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
689 .add(restOptions) |
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
690 .add(advancedOptions); |
0 | 691 |
692 boost::program_options::options_description all = allWithoutHidden; | |
693 all.add(hidden); | |
694 | |
695 boost::program_options::positional_options_description positional; | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
696 positional.add(OPTION_INPUT, 1); |
0 | 697 |
698 boost::program_options::variables_map options; | |
699 bool error = false; | |
700 | |
701 try | |
702 { | |
703 boost::program_options::store(boost::program_options::command_line_parser(argc, argv). | |
704 options(all).positional(positional).run(), options); | |
705 boost::program_options::notify(options); | |
706 } | |
707 catch (boost::program_options::error& e) | |
708 { | |
709 LOG(ERROR) << "Error while parsing the command-line arguments: " << e.what(); | |
710 error = true; | |
711 } | |
712 | |
713 if (!error && | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
714 options.count(OPTION_SAMPLE_DATASET)) |
0 | 715 { |
716 std::string sample; | |
717 Orthanc::EmbeddedResources::GetFileResource(sample, Orthanc::EmbeddedResources::SAMPLE_DATASET); | |
718 | |
719 std::cout << std::endl << sample << std::endl; | |
720 | |
721 return false; | |
722 } | |
723 | |
244
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
724 // New in release 1.1 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
725 if (options.count(OPTION_CYTOMINE_URL) || |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
726 options.count(OPTION_CYTOMINE_PUBLIC_KEY) || |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
727 options.count(OPTION_CYTOMINE_PRIVATE_KEY) || |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
728 options.count(OPTION_CYTOMINE_IMAGE_INSTANCE_ID)) |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
729 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
730 if (!options.count(OPTION_CYTOMINE_URL)) |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
731 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
732 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
733 "URL to the Cytomine server is missing"); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
734 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
735 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
736 if (!options.count(OPTION_CYTOMINE_PUBLIC_KEY)) |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
737 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
738 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
739 "Public key for the Cytomine server is missing"); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
740 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
741 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
742 if (!options.count(OPTION_CYTOMINE_PRIVATE_KEY)) |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
743 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
744 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
745 "Private key for the Cytomine server is missing"); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
746 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
747 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
748 if (!options.count(OPTION_CYTOMINE_IMAGE_INSTANCE_ID)) |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
749 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
750 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
751 "The Image Instance ID from the Cytomine server is missing"); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
752 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
753 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
754 if (!options.count(OPTION_CYTOMINE_COMPRESSION)) |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
755 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
756 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
757 "The tile compression scheme for Cytomine is missing"); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
758 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
759 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
760 const std::string s = options[OPTION_CYTOMINE_COMPRESSION].as<std::string>(); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
761 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
762 OrthancWSI::ImageCompression compression; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
763 if (s == "jpeg") |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
764 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
765 compression = OrthancWSI::ImageCompression_Jpeg; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
766 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
767 else if (s == "png") |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
768 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
769 compression = OrthancWSI::ImageCompression_Png; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
770 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
771 else |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
772 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
773 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
774 "The tile compression scheme must be \"jpeg\" or \"png\", found: " + s); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
775 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
776 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
777 parameters.SetCytomineSource(options[OPTION_CYTOMINE_URL].as<std::string>(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
778 options[OPTION_CYTOMINE_PUBLIC_KEY].as<std::string>(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
779 options[OPTION_CYTOMINE_PRIVATE_KEY].as<std::string>(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
780 options[OPTION_CYTOMINE_IMAGE_INSTANCE_ID].as<int>(), compression); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
781 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
782 |
0 | 783 if (!error && |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
784 options.count(OPTION_HELP) == 0 && |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
785 options.count(OPTION_VERSION) == 0 && |
244
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
786 options.count(OPTION_INPUT) != 1 && |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
787 !parameters.IsCytomineSource()) |
0 | 788 { |
789 LOG(ERROR) << "No input file was specified"; | |
790 error = true; | |
791 } | |
792 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
793 if (error || options.count(OPTION_HELP)) |
0 | 794 { |
795 std::cout << std::endl | |
796 << "Usage: " << argv[0] << " [OPTION]... [INPUT]" | |
797 << std::endl | |
798 << "Orthanc, lightweight, RESTful DICOM server for healthcare and medical research." | |
799 << std::endl << std::endl | |
800 << "Create a DICOM file from a digital pathology image." | |
801 << std::endl; | |
802 | |
803 std::cout << allWithoutHidden << "\n"; | |
804 | |
805 if (error) | |
806 { | |
807 exitStatus = -1; | |
808 } | |
809 | |
810 return false; | |
811 } | |
812 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
813 if (options.count(OPTION_VERSION)) |
8
62adabb8c122
Provide "--version" in command-line tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
814 { |
62adabb8c122
Provide "--version" in command-line tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
815 OrthancWSI::ApplicationToolbox::PrintVersion(argv[0]); |
62adabb8c122
Provide "--version" in command-line tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
816 return false; |
62adabb8c122
Provide "--version" in command-line tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
817 } |
62adabb8c122
Provide "--version" in command-line tools
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
818 |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
819 if (options.count(OPTION_VERBOSE)) |
0 | 820 { |
821 Orthanc::Logging::EnableInfoLevel(true); | |
822 } | |
823 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
824 if (options.count(OPTION_OPENSLIDE)) |
0 | 825 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
826 OrthancWSI::OpenSlideLibrary::Initialize(options[OPTION_OPENSLIDE].as<std::string>()); |
0 | 827 } |
828 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
829 if (options.count(OPTION_PYRAMID) && |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
830 options[OPTION_PYRAMID].as<bool>()) |
0 | 831 { |
832 parameters.SetReconstructPyramid(true); | |
833 } | |
834 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
835 if (options.count(OPTION_SMOOTH) && |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
836 options[OPTION_SMOOTH].as<bool>()) |
0 | 837 { |
838 parameters.SetSmoothEnabled(true); | |
839 } | |
840 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
841 if (options.count(OPTION_SAFETY) && |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
842 options[OPTION_SAFETY].as<bool>()) |
0 | 843 { |
844 parameters.SetSafetyCheck(true); | |
845 } | |
846 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
847 if (options.count(OPTION_REENCODE) && |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
848 options[OPTION_REENCODE].as<bool>()) |
0 | 849 { |
850 parameters.SetForceReencode(true); | |
851 } | |
852 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
853 if (options.count(OPTION_REPAINT) && |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
854 options[OPTION_REPAINT].as<bool>()) |
0 | 855 { |
856 parameters.SetRepaintBackground(true); | |
857 } | |
858 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
859 if (options.count(OPTION_TILE_WIDTH) || |
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
860 options.count(OPTION_TILE_HEIGHT)) |
0 | 861 { |
862 int w = 0; | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
863 if (options.count(OPTION_TILE_WIDTH)) |
0 | 864 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
865 w = options[OPTION_TILE_WIDTH].as<int>(); |
0 | 866 } |
867 | |
145 | 868 int h = 0; |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
869 if (options.count(OPTION_TILE_HEIGHT)) |
0 | 870 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
871 h = options[OPTION_TILE_HEIGHT].as<int>(); |
0 | 872 } |
873 | |
874 if (w < 0 || h < 0) | |
875 { | |
876 LOG(ERROR) << "Negative target tile size specified: " << w << "x" << h; | |
877 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
878 } | |
879 | |
880 parameters.SetTargetTileSize(w, h); | |
881 } | |
882 | |
244
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
883 if (!parameters.IsCytomineSource()) |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
884 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
885 parameters.SetInputFile(options[OPTION_INPUT].as<std::string>()); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
886 } |
0 | 887 |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
888 if (options.count(OPTION_COLOR)) |
0 | 889 { |
890 uint8_t r, g, b; | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
891 OrthancWSI::ApplicationToolbox::ParseColor(r, g, b, options[OPTION_COLOR].as<std::string>()); |
0 | 892 parameters.SetBackgroundColor(r, g, b); |
893 } | |
894 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
895 if (options.count(OPTION_COMPRESSION)) |
0 | 896 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
897 std::string s = options[OPTION_COMPRESSION].as<std::string>(); |
0 | 898 if (s == "none") |
899 { | |
900 parameters.SetTargetCompression(OrthancWSI::ImageCompression_None); | |
901 } | |
902 else if (s == "jpeg") | |
903 { | |
904 parameters.SetTargetCompression(OrthancWSI::ImageCompression_Jpeg); | |
905 } | |
906 else if (s == "jpeg2000") | |
907 { | |
908 parameters.SetTargetCompression(OrthancWSI::ImageCompression_Jpeg2000); | |
909 } | |
910 else | |
911 { | |
912 LOG(ERROR) << "Unknown image compression for the target image: " << s; | |
913 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
914 } | |
915 } | |
916 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
917 if (options.count(OPTION_JPEG_QUALITY)) |
0 | 918 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
919 parameters.SetJpegQuality(options[OPTION_JPEG_QUALITY].as<int>()); |
0 | 920 } |
921 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
922 if (options.count(OPTION_LEVELS)) |
0 | 923 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
924 parameters.SetPyramidLevelsCount(options[OPTION_LEVELS].as<int>()); |
0 | 925 } |
926 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
927 if (options.count(OPTION_LOWER_LEVELS)) |
0 | 928 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
929 parameters.SetPyramidLowerLevelsCount(options[OPTION_LOWER_LEVELS].as<int>()); |
0 | 930 } |
931 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
932 if (options.count(OPTION_THREADS)) |
0 | 933 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
934 parameters.SetThreadsCount(options[OPTION_THREADS].as<int>()); |
0 | 935 } |
936 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
937 if (options.count(OPTION_MAX_SIZE)) |
0 | 938 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
939 parameters.SetDicomMaxFileSize(options[OPTION_MAX_SIZE].as<int>() * 1024 * 1024); |
0 | 940 } |
941 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
942 if (options.count(OPTION_FOLDER)) |
0 | 943 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
944 parameters.SetTargetFolder(options[OPTION_FOLDER].as<std::string>()); |
0 | 945 } |
946 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
947 if (options.count(OPTION_FOLDER_PATTERN)) |
0 | 948 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
949 parameters.SetTargetFolderPattern(options[OPTION_FOLDER_PATTERN].as<std::string>()); |
0 | 950 } |
951 | |
125
7a3f4d580625
SSL is enabled by default for HTTPS transfers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
123
diff
changeset
|
952 OrthancWSI::ApplicationToolbox::SetupRestApi(parameters.GetOrthancParameters(), options); |
0 | 953 |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
954 if (options.count(OPTION_DATASET)) |
0 | 955 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
956 parameters.SetDatasetPath(options[OPTION_DATASET].as<std::string>()); |
0 | 957 } |
958 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
959 if (options.count(OPTION_IMAGED_WIDTH)) |
0 | 960 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
961 volume.SetWidth(options[OPTION_IMAGED_WIDTH].as<float>()); |
0 | 962 } |
963 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
964 if (options.count(OPTION_IMAGED_HEIGHT)) |
0 | 965 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
966 volume.SetHeight(options[OPTION_IMAGED_HEIGHT].as<float>()); |
0 | 967 } |
968 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
969 if (options.count(OPTION_IMAGED_DEPTH)) |
0 | 970 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
971 volume.SetDepth(options[OPTION_IMAGED_DEPTH].as<float>()); |
0 | 972 } |
973 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
974 if (options.count(OPTION_OFFSET_X)) |
0 | 975 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
976 volume.SetOffsetX(options[OPTION_OFFSET_X].as<float>()); |
0 | 977 } |
978 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
979 if (options.count(OPTION_OFFSET_Y)) |
0 | 980 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
981 volume.SetOffsetY(options[OPTION_OFFSET_Y].as<float>()); |
0 | 982 } |
983 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
984 if (options.count(OPTION_OPTICAL_PATH)) |
0 | 985 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
986 std::string s = options[OPTION_OPTICAL_PATH].as<std::string>(); |
0 | 987 if (s == "none") |
988 { | |
989 parameters.SetOpticalPath(OrthancWSI::OpticalPath_None); | |
990 } | |
991 else if (s == "brightfield") | |
992 { | |
993 parameters.SetOpticalPath(OrthancWSI::OpticalPath_Brightfield); | |
994 } | |
995 else | |
996 { | |
997 LOG(ERROR) << "Unknown optical path definition: " << s; | |
998 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
999 } | |
1000 } | |
1001 | |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
1002 if (options.count(OPTION_ICC_PROFILE)) |
0 | 1003 { |
129
806d1bb56918
cleaning up options in Dicomizer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
1004 parameters.SetIccProfilePath(options[OPTION_ICC_PROFILE].as<std::string>()); |
0 | 1005 } |
1006 | |
1007 return true; | |
1008 } | |
1009 | |
1010 | |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
1011 |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1012 OrthancWSI::ITiledPyramid* OpenInputPyramid(OrthancWSI::ImageCompression& sourceCompression, |
279
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1013 OrthancWSI::ImagedVolumeParameters& volume, |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1014 const std::string& path, |
0 | 1015 const OrthancWSI::DicomizerParameters& parameters) |
1016 { | |
244
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1017 if (parameters.IsCytomineSource()) |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1018 { |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1019 // New in release 1.1 |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1020 LOG(WARNING) << "Importing Image Instance " << parameters.GetCytomineImageInstanceId() |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1021 << " from Cytomine server: " << parameters.GetCytomineServer().GetUrl(); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1022 sourceCompression = OrthancWSI::ImageCompression_Unknown; |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1023 return new OrthancWSI::CytomineImage(parameters.GetCytomineServer(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1024 parameters.GetCytominePublicKey(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1025 parameters.GetCytominePrivateKey(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1026 parameters.GetCytomineImageInstanceId(), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1027 parameters.GetTargetTileWidth(512), |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1028 parameters.GetTargetTileHeight(512)); |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1029 } |
4273518c2009
OrthancWSIDicomizer: Support importing of images from Cytomine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
242
diff
changeset
|
1030 |
0 | 1031 LOG(WARNING) << "The input image is: " << path; |
1032 | |
1033 OrthancWSI::ImageCompression format = OrthancWSI::DetectFormatFromFile(path); | |
1034 LOG(WARNING) << "File format of the input image: " << EnumerationToString(format); | |
1035 | |
1036 switch (format) | |
1037 { | |
1038 case OrthancWSI::ImageCompression_Png: | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1039 { |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1040 sourceCompression = OrthancWSI::ImageCompression_Unknown; |
0 | 1041 return new OrthancWSI::TiledPngImage(path, |
1042 parameters.GetTargetTileWidth(512), | |
1043 parameters.GetTargetTileHeight(512)); | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1044 } |
0 | 1045 |
1046 case OrthancWSI::ImageCompression_Jpeg: | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1047 { |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1048 sourceCompression = OrthancWSI::ImageCompression_Unknown; |
0 | 1049 return new OrthancWSI::TiledJpegImage(path, |
1050 parameters.GetTargetTileWidth(512), | |
1051 parameters.GetTargetTileHeight(512)); | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1052 } |
0 | 1053 |
1054 case OrthancWSI::ImageCompression_Tiff: | |
1055 { | |
1056 try | |
1057 { | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
1058 std::unique_ptr<OrthancWSI::HierarchicalTiff> tiff(new OrthancWSI::HierarchicalTiff(path)); |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1059 sourceCompression = tiff->GetImageCompression(); |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1060 return tiff.release(); |
0 | 1061 } |
1062 catch (Orthanc::OrthancException&) | |
1063 { | |
1064 LOG(WARNING) << "This is not a standard hierarchical TIFF file"; | |
1065 } | |
1066 } | |
1067 | |
1068 default: | |
1069 break; | |
1070 } | |
1071 | |
1072 try | |
1073 { | |
1074 LOG(WARNING) << "Trying to open the input pyramid with OpenSlide"; | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1075 sourceCompression = OrthancWSI::ImageCompression_Unknown; |
279
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1076 |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1077 std::unique_ptr<OrthancWSI::OpenSlidePyramid> openslide( |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1078 new OrthancWSI::OpenSlidePyramid(path, parameters.GetTargetTileWidth(512), |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1079 parameters.GetTargetTileHeight(512))); |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1080 |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1081 float volumeWidth, volumeHeight; |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1082 if (openslide->LookupImagedVolumeSize(volumeWidth, volumeHeight)) |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1083 { |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1084 if (!volume.HasWidth()) |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1085 { |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1086 volume.SetWidth(volumeWidth); |
281 | 1087 LOG(WARNING) << "Width of the imaged volume extracted using OpenSlide: " << volumeWidth << "mm"; |
279
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1088 } |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1089 |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1090 if (!volume.HasHeight()) |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1091 { |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1092 volume.SetHeight(volumeHeight); |
281 | 1093 LOG(WARNING) << "Height of the imaged volume extracted using OpenSlide: " << volumeHeight << "mm"; |
279
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1094 } |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1095 } |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1096 |
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1097 return openslide.release(); |
0 | 1098 } |
1099 catch (Orthanc::OrthancException&) | |
1100 { | |
1101 LOG(ERROR) << "This file is not supported by OpenSlide"; | |
1102 return NULL; | |
1103 } | |
1104 } | |
1105 | |
1106 | |
1107 int main(int argc, char* argv[]) | |
1108 { | |
1109 OrthancWSI::ApplicationToolbox::GlobalInitialize(); | |
93
14146ecd1688
Display version of the framework in the logs
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
84
diff
changeset
|
1110 OrthancWSI::ApplicationToolbox::ShowVersionInLog(argv[0]); |
0 | 1111 |
1112 int exitStatus = 0; | |
1113 | |
1114 try | |
1115 { | |
1116 OrthancWSI::DicomizerParameters parameters; | |
1117 OrthancWSI::ImagedVolumeParameters volume; | |
1118 | |
1119 if (ParseParameters(exitStatus, parameters, volume, argc, argv)) | |
1120 { | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1121 OrthancWSI::ImageCompression sourceCompression; |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
1122 std::unique_ptr<OrthancWSI::ITiledPyramid> source; |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1123 |
279
77afef2cf64b
automated extraction of the imaged volume if using OpenSlide
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
254
diff
changeset
|
1124 source.reset(OpenInputPyramid(sourceCompression, volume, parameters.GetInputFile(), parameters)); |
0 | 1125 if (source.get() == NULL) |
1126 { | |
1127 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
1128 } | |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1129 |
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1130 LOG(WARNING) << "Compression of the individual source tiles: " << OrthancWSI::EnumerationToString(sourceCompression); |
0 | 1131 |
1132 // Create the shared DICOM tags | |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
1133 std::unique_ptr<DcmDataset> dataset(ParseDataset(parameters.GetDatasetPath())); |
57
91fc9583b2de
big refactoring to support sparse tiling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
43
diff
changeset
|
1134 EnrichDataset(*dataset, *source, sourceCompression, parameters, volume); |
0 | 1135 |
199
a1c265cb2174
replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
1136 std::unique_ptr<OrthancWSI::IFileTarget> output(parameters.CreateTarget()); |
167
605247fc8758
Fix issue #144 (OrthancWSIDicomizer PhotometricInterpretation)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
1137 Recompress(*output, *source, *dataset, parameters, volume, sourceCompression); |
0 | 1138 } |
1139 } | |
1140 catch (Orthanc::OrthancException& e) | |
1141 { | |
1142 LOG(ERROR) << "Terminating on exception: " << e.What(); | |
1143 exitStatus = -1; | |
1144 } | |
1145 | |
1146 OrthancWSI::ApplicationToolbox::GlobalFinalize(); | |
1147 | |
1148 return exitStatus; | |
1149 } |