Mercurial > hg > orthanc-wsi
annotate Framework/Inputs/CytomineImage.cpp @ 243:7d189530d648
added class CytomineImage
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 06 Dec 2021 16:15:10 +0100 |
parents | |
children | 4273518c2009 |
rev | line source |
---|---|
243
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Orthanc - A Lightweight, RESTful DICOM Store |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * Copyright (C) 2021-2021 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * This program is free software: you can redistribute it and/or |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * modify it under the terms of the GNU Affero General Public License |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * as published by the Free Software Foundation, either version 3 of |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * the License, or (at your option) any later version. |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, but |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * WITHOUT ANY WARRANTY; without even the implied warranty of |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * Affero General Public License for more details. |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * You should have received a copy of the GNU Affero General Public License |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 **/ |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 #include "CytomineImage.h" |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 #include <Images/ImageProcessing.h> |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 #include <Images/JpegWriter.h> |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 #include <Images/PngReader.h> |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 #include <Logging.h> |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 #include <OrthancException.h> |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 #include <Toolbox.h> |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 #include <boost/date_time/posix_time/posix_time.hpp> |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 #include <boost/lexical_cast.hpp> |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 #include <openssl/hmac.h> |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 #if (OPENSSL_VERSION_NUMBER < 0x10100000L) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 // OpenSSL < 1.1.0 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 namespace |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 class HmacContext : public boost::noncopyable |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 private: |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 HMAC_CTX hmac_; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 public: |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 HmacContext() |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 HMAC_CTX_init(&hmac_); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 ~HmacContext() |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 HMAC_CTX_cleanup(&hmac_); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 HMAC_CTX* GetObject() |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 return &hmac_; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 }; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 #else |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 // OpenSSL >= 1.1.0 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 namespace |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 class HmacContext : public boost::noncopyable |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
72 private: |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 HMAC_CTX* hmac_; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
75 public: |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 HmacContext() |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 hmac_ = HMAC_CTX_new(); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 if (hmac_ == NULL) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 ~HmacContext() |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 HMAC_CTX_free(hmac_); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 HMAC_CTX* GetObject() |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 return hmac_; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 }; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 #endif |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 namespace OrthancWSI |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 bool CytomineImage::GetCytomine(std::string& target, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 const std::string& uri, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 Orthanc::MimeType contentType) const |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 if (uri.empty() || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 uri[0] == '/') |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 std::string t = Orthanc::EnumerationToString(contentType); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 std::string date; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 const boost::posix_time::ptime now = boost::posix_time::second_clock::universal_time(); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 std::stringstream stream; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 stream.imbue(std::locale(std::locale::classic(), |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 new boost::posix_time::time_facet("%a, %d %b %Y %H:%M:%S +0000"))); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 stream << now; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
123 date = stream.str(); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
124 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
126 std::string auth; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
128 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 const std::string token = "GET\n\n" + t + "\n" + date + "\n/" + uri; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
130 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
131 HmacContext hmac; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
132 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
133 unsigned char md[64]; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
134 unsigned int length = 0; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
135 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
136 if (HMAC_Init_ex(hmac.GetObject(), privateKey_.c_str(), privateKey_.length(), EVP_sha1(), NULL) != 1 || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
137 HMAC_Update(hmac.GetObject(), reinterpret_cast<const unsigned char*>(token.c_str()), token.size()) != 1 || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
138 HMAC_Final(hmac.GetObject(), md, &length) != 1) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
139 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
140 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
141 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
142 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 Orthanc::Toolbox::EncodeBase64(auth, std::string(reinterpret_cast<const char*>(md), length)); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 Orthanc::HttpClient c(parameters_, uri); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
147 c.AddHeader("content-type", t); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
148 c.AddHeader("authorization", "CYTOMINE " + publicKey_ + ":" + auth); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 c.AddHeader("date", date); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
151 return c.Apply(target); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
152 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
153 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
154 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
155 void CytomineImage::ReadRegion(Orthanc::ImageAccessor& target, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
156 unsigned int level, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 unsigned int x, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
158 unsigned int y) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
159 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
160 if (level != 0 || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
161 x >= fullWidth_ || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
162 y >= fullHeight_) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
163 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
164 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
165 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
166 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
167 unsigned int w = std::min(tileWidth_, fullWidth_ - x); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
168 unsigned int h = std::min(tileHeight_, fullHeight_ - y); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
169 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
170 const std::string uri = ("api/imageinstance/" + boost::lexical_cast<std::string>(imageId_) + "/window-" + |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
171 boost::lexical_cast<std::string>(x) + "-" + |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
172 boost::lexical_cast<std::string>(y) + "-" + |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
173 boost::lexical_cast<std::string>(w) + "-" + |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
174 boost::lexical_cast<std::string>(h) + ".png"); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
175 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
176 std::string png; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
177 if (!GetCytomine(png, uri, Orthanc::MimeType_Png)) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
178 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
179 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, "Cannot read a tile from Cytomine"); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
180 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
181 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
182 Orthanc::PngReader reader; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
183 reader.ReadFromMemory(png); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
184 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
185 if (reader.GetWidth() != w || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
186 reader.GetHeight() != h) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
187 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
188 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, "Cytomine returned a tile of bad size"); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
189 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
190 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
191 Orthanc::ImageProcessing::Set(target, 255, 255, 255, 255); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
192 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
193 Orthanc::ImageAccessor region; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
194 target.GetRegion(region, 0, 0, w, h); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
195 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
196 Orthanc::ImageProcessing::Copy(target, reader); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
197 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
198 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
199 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
200 CytomineImage::CytomineImage(const Orthanc::WebServiceParameters& parameters, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
201 const std::string& publicKey, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
202 const std::string& privateKey, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
203 int imageId, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
204 unsigned int tileWidth, |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
205 unsigned int tileHeight) : |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
206 parameters_(parameters), |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
207 publicKey_(publicKey), |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
208 privateKey_(privateKey), |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
209 imageId_(imageId), |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
210 tileWidth_(tileWidth), |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
211 tileHeight_(tileHeight) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
212 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
213 if (tileWidth_ < 16 || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
214 tileHeight_ < 16) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
215 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
216 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
217 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
218 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
219 std::string info; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
220 if (!GetCytomine(info, "api/imageinstance/" + boost::lexical_cast<std::string>(imageId_) + ".json", Orthanc::MimeType_Json)) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
221 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
222 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource, "Inexistent image in Cytomine: " + |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
223 boost::lexical_cast<std::string>(imageId)); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
224 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
225 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
226 const char* const WIDTH = "width"; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
227 const char* const HEIGHT = "height"; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
228 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
229 Json::Value json; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
230 if (!Orthanc::Toolbox::ReadJson(json, info) || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
231 !json.isMember(WIDTH) || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
232 !json.isMember(HEIGHT) || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
233 json[WIDTH].type() != Json::intValue || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
234 json[HEIGHT].type() != Json::intValue || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
235 json[WIDTH].asInt() < 0 || |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
236 json[HEIGHT].asInt() < 0) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
237 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
238 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, "Unsupported version of the Cytomine REST API"); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
239 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
240 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
241 fullWidth_ = json[WIDTH].asUInt(); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
242 fullHeight_ = json[HEIGHT].asUInt(); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
243 LOG(INFO) << "Reading an image of size " << fullWidth_ << "x" << fullHeight_ << " from Cytomine"; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
244 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
245 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
246 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
247 unsigned int CytomineImage::GetLevelWidth(unsigned int level) const |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
248 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
249 if (level == 0) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
250 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
251 return fullWidth_; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
252 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
253 else |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
254 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
255 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
256 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
257 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
258 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
259 |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
260 unsigned int CytomineImage::GetLevelHeight(unsigned int level) const |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
261 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
262 if (level == 0) |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
263 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
264 return fullHeight_; |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
265 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
266 else |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
267 { |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
268 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
269 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
270 } |
7d189530d648
added class CytomineImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
271 } |