Mercurial > hg > orthanc-wsi
annotate Framework/TiffReader.cpp @ 311:4315bd3bffa7
added CITATION.cff
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sat, 06 Apr 2024 17:39:24 +0200 |
parents | 7020852a8fa9 |
children | 0683312e21ba |
rev | line source |
---|---|
297 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
309
7020852a8fa9
updated year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
297
diff
changeset
|
5 * Copyright (C) 2017-2024 Osimis S.A., Belgium |
7020852a8fa9
updated year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
297
diff
changeset
|
6 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
297 | 7 * |
8 * This program is free software: you can redistribute it and/or | |
9 * modify it under the terms of the GNU Affero General Public License | |
10 * as published by the Free Software Foundation, either version 3 of | |
11 * the License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Affero General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Affero General Public License | |
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 **/ | |
21 | |
22 | |
23 #include "TiffReader.h" | |
24 | |
25 #include <Logging.h> | |
26 #include <OrthancException.h> | |
27 | |
28 namespace OrthancWSI | |
29 { | |
30 TiffReader::TiffReader(const std::string& path) | |
31 { | |
32 tiff_ = TIFFOpen(path.c_str(), "r"); | |
33 if (tiff_ == NULL) | |
34 { | |
35 throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentFile, | |
36 "libtiff cannot open: " + path); | |
37 } | |
38 } | |
39 | |
40 | |
41 TiffReader::~TiffReader() | |
42 { | |
43 if (tiff_) | |
44 { | |
45 TIFFClose(tiff_); | |
46 tiff_ = NULL; | |
47 } | |
48 } | |
49 | |
50 | |
51 bool TiffReader::GetCurrentDirectoryInformation(ImageCompression& compression, | |
52 Orthanc::PixelFormat& pixelFormat, | |
53 Orthanc::PhotometricInterpretation& photometric) | |
54 { | |
55 uint16_t c; | |
56 if (!TIFFGetField(tiff_, TIFFTAG_COMPRESSION, &c)) | |
57 { | |
58 return false; | |
59 } | |
60 | |
61 switch (c) | |
62 { | |
63 case COMPRESSION_NONE: | |
64 compression = ImageCompression_None; | |
65 break; | |
66 | |
67 case COMPRESSION_JPEG: | |
68 compression = ImageCompression_Jpeg; | |
69 break; | |
70 | |
71 default: | |
72 return false; | |
73 } | |
74 | |
75 // http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html | |
76 | |
77 uint16_t channels, photometricTiff, bpp, planar; | |
78 if (!TIFFGetField(tiff_, TIFFTAG_SAMPLESPERPIXEL, &channels) || | |
79 channels == 0 || | |
80 !TIFFGetField(tiff_, TIFFTAG_PHOTOMETRIC, &photometricTiff) || | |
81 !TIFFGetField(tiff_, TIFFTAG_BITSPERSAMPLE, &bpp) || | |
82 !TIFFGetField(tiff_, TIFFTAG_PLANARCONFIG, &planar)) | |
83 { | |
84 return false; | |
85 } | |
86 | |
87 if (compression == ImageCompression_Jpeg && | |
88 channels == 3 && // This is a color image | |
89 bpp == 8 && | |
90 planar == PLANARCONFIG_CONTIG) // This is interleaved RGB | |
91 { | |
92 pixelFormat = Orthanc::PixelFormat_RGB24; | |
93 | |
94 switch (photometricTiff) | |
95 { | |
96 case PHOTOMETRIC_YCBCR: | |
97 photometric = Orthanc::PhotometricInterpretation_YBRFull422; | |
98 break; | |
99 | |
100 case PHOTOMETRIC_RGB: | |
101 photometric = Orthanc::PhotometricInterpretation_RGB; | |
102 break; | |
103 | |
104 default: | |
105 LOG(ERROR) << "Unknown photometric interpretation in TIFF: " << photometricTiff; | |
106 return false; | |
107 } | |
108 } | |
109 else if (compression == ImageCompression_None && | |
110 channels == 3 && // This is a color image | |
111 bpp == 8 && | |
112 planar == PLANARCONFIG_CONTIG) // This is interleaved RGB | |
113 { | |
114 pixelFormat = Orthanc::PixelFormat_RGB24; | |
115 photometric = Orthanc::PhotometricInterpretation_RGB; | |
116 } | |
117 else if (compression == ImageCompression_Jpeg && | |
118 channels == 1 && // This is a grayscale image | |
119 bpp == 8) | |
120 { | |
121 pixelFormat = Orthanc::PixelFormat_Grayscale8; | |
122 photometric = Orthanc::PhotometricInterpretation_Monochrome2; | |
123 } | |
124 else | |
125 { | |
126 return false; | |
127 } | |
128 | |
129 return true; | |
130 } | |
131 } |