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