comparison Framework/Inputs/DicomPyramidInstance.cpp @ 68:c619c8bd72ed

DicomPyramidInstance::Deserialize
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 25 Nov 2016 21:18:46 +0100
parents 63d0a5c74460
children d529d9ce3c7e
comparison
equal deleted inserted replaced
67:789885bd06ae 68:c619c8bd72ed
122 122
123 return compression_; 123 return compression_;
124 } 124 }
125 125
126 126
127 DicomPyramidInstance::DicomPyramidInstance(OrthancPlugins::IOrthancConnection& orthanc, 127 void DicomPyramidInstance::Load(OrthancPlugins::IOrthancConnection& orthanc,
128 const std::string& instanceId) : 128 const std::string& instanceId)
129 instanceId_(instanceId),
130 hasCompression_(false)
131 { 129 {
132 using namespace OrthancPlugins; 130 using namespace OrthancPlugins;
133 131
134 DicomDatasetReader reader(new FullOrthancDataset(orthanc, "/instances/" + instanceId + "/tags")); 132 DicomDatasetReader reader(new FullOrthancDataset(orthanc, "/instances/" + instanceId + "/tags"));
135 133
192 frames_[i].second = y / tileHeight_; 190 frames_[i].second = y / tileHeight_;
193 } 191 }
194 } 192 }
195 193
196 194
195 DicomPyramidInstance::DicomPyramidInstance(OrthancPlugins::IOrthancConnection& orthanc,
196 const std::string& instanceId) :
197 instanceId_(instanceId),
198 hasCompression_(false)
199 {
200 Load(orthanc, instanceId);
201 }
202
203
197 unsigned int DicomPyramidInstance::GetFrameLocationX(size_t frame) const 204 unsigned int DicomPyramidInstance::GetFrameLocationX(size_t frame) const
198 { 205 {
199 assert(frame < frames_.size()); 206 assert(frame < frames_.size());
200 return frames_[frame].first; 207 return frames_[frame].first;
201 } 208 }
218 frame.append(frames_[i].second); 225 frame.append(frames_[i].second);
219 226
220 frames.append(frame); 227 frames.append(frame);
221 } 228 }
222 229
223 Json::Value value; 230 Json::Value content;
224 value["PixelFormat"] = Orthanc::EnumerationToString(format_); 231 content["Frames"] = frames;
225 value["TileHeight"] = tileHeight_; 232 content["TileHeight"] = tileHeight_;
226 value["TileWidth"] = tileWidth_; 233 content["TileWidth"] = tileWidth_;
227 value["TotalHeight"] = totalHeight_; 234 content["TotalHeight"] = totalHeight_;
228 value["TotalWidth"] = totalWidth_; 235 content["TotalWidth"] = totalWidth_;
229 value["Frames"] = frames; 236
237 switch (format_)
238 {
239 case Orthanc::PixelFormat_RGB24:
240 content["PixelFormat"] = 0;
241 break;
242
243 case Orthanc::PixelFormat_Grayscale8:
244 content["PixelFormat"] = 1;
245 break;
246
247 default:
248 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
249 }
230 250
231 Json::FastWriter writer; 251 Json::FastWriter writer;
232 result = writer.write(value); 252 result = writer.write(content);
253 }
254
255
256 void DicomPyramidInstance::Deserialize(const std::string& s)
257 {
258 hasCompression_ = false;
259
260 Json::Value content;
261 OrthancPlugins::IOrthancConnection::ParseJson(content, s);
262
263 if (content.type() != Json::objectValue ||
264 !content.isMember("Frames") ||
265 !content.isMember("PixelFormat") ||
266 !content.isMember("TileHeight") ||
267 !content.isMember("TileWidth") ||
268 !content.isMember("TotalHeight") ||
269 !content.isMember("TotalWidth") ||
270 content["Frames"].type() != Json::arrayValue ||
271 content["PixelFormat"].type() != Json::intValue ||
272 content["TileHeight"].type() != Json::intValue ||
273 content["TileWidth"].type() != Json::intValue ||
274 content["TotalHeight"].type() != Json::intValue ||
275 content["TotalWidth"].type() != Json::intValue ||
276 content["TileHeight"].asInt() < 0 ||
277 content["TileWidth"].asInt() < 0 ||
278 content["TotalHeight"].asInt() < 0 ||
279 content["TotalWidth"].asInt() < 0)
280 {
281 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
282 }
283
284 switch (content["Frames"].asInt())
285 {
286 case 0:
287 format_ = Orthanc::PixelFormat_RGB24;
288 break;
289
290 case 1:
291 format_ = Orthanc::PixelFormat_Grayscale8;
292 break;
293
294 default:
295 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
296 }
297
298 tileHeight_ = static_cast<unsigned int>(content["TileHeight"].asInt());
299 tileWidth_ = static_cast<unsigned int>(content["TileWidth"].asInt());
300 totalHeight_ = static_cast<unsigned int>(content["TotalHeight"].asInt());
301 totalWidth_ = static_cast<unsigned int>(content["TotalWidth"].asInt());
302
303 const Json::Value f = content["Frames"];
304 frames_.resize(f.size());
305
306 for (Json::Value::ArrayIndex i = 0; i < f.size(); i++)
307 {
308 if (f[i].type() != Json::arrayValue ||
309 f[i].size() != 2 ||
310 f[i][0].type() != Json::intValue ||
311 f[i][1].type() != Json::intValue ||
312 f[i][0].asInt() < 0 ||
313 f[i][1].asInt() < 0)
314 {
315 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
316 }
317
318 frames_[i].first = f[i][0].asInt();
319 frames_[i].second = f[i][1].asInt();
320 }
233 } 321 }
234 } 322 }