SlideIO 2.0.0
Open-source library for reading of medical images
Loading...
Searching...
No Matches
ndpitifftools.hpp
1// This file is part of slideio project.
2// It is subject to the license terms in the LICENSE file found in the top-level directory
3// of this distribution and at http://slideio.com/license.html.
4#pragma once
5
6
7#include "slideio/drivers/ndpi/ndpi_api_def.hpp"
8#include "slideio/base/resolution.hpp"
9#include "slideio/base/slideio_enums.hpp"
10#include "slideio/base/base.hpp"
11#include <opencv2/core.hpp>
12#include <string>
13#include <vector>
14
15namespace libtiff
16{
17 struct tiff;
18 typedef tiff TIFF;
19}
20
21#if defined(_MSC_VER)
22#pragma warning( push )
23#pragma warning(disable: 4251)
24#endif
25
26namespace slideio
27{
28 class NDPIFile;
29
30 struct SLIDEIO_NDPI_EXPORTS NDPITiffDirectory
31 {
32 enum class Type
33 {
34 Tiled = 0,
35 SingleStripe = 1,
36 SingleStripeMCU = 2,
37 Striped = 3
38 };
39 int width;
40 int height;
41 bool tiled;
42 int tileWidth;
43 int tileHeight;
44 int channels;
45 int bitsPerSample;
46 int photometric;
47 int YCbCrSubsampling[2];
48 uint32_t compression;
49 Compression slideioCompression;
50 int dirIndex;
51 int64 offset;
52 std::string description;
53 std::string userLabel;
54 std::string comments;
55 std::vector<NDPITiffDirectory> subdirectories;
56 Resolution res;
57 cv::Point2d position;
58 bool interleaved;
59 int rowsPerStrip;
60 DataType dataType;
61 int stripSize;
62 double magnification;
63 uint32_t blankLines;
64 std::vector<uint64_t> mcuStarts;
65 uint64_t jpegHeaderOffset;
66 uint64_t jpegSOFMarker;
67 uint32_t jpegHeaderSize;
68 uint32_t rawStripSize = 0;
69 bool auxImage = false;
70
71 Type getType() const {
72 if(tiled) {
73 return Type::Tiled;
74 }
75 else if(tileWidth > 0 && tileHeight > 0 && !mcuStarts.empty() && slideioCompression == Compression::Jpeg) {
76 return Type::SingleStripeMCU;
77 }
78 else if(rowsPerStrip == height) {
79 return Type::SingleStripe;
80 }
81 else {
82 return Type::Striped;
83 }
84 }
85 };
86
87 SLIDEIO_NDPI_EXPORTS std::ostream& operator << (std::ostream& os, const NDPITiffDirectory::Type& type);
88
89 class SLIDEIO_NDPI_EXPORTS NDPITiffTools
90 {
91 public:
92 static libtiff::TIFF* openTiffFile(const std::string& path);
93 static void closeTiffFile(libtiff::TIFF* file);
94 static cv::Size computeMCUTileSize(FILE* file, const cv::Size& dirSize);
95 static std::pair<uint64_t, uint64_t> getJpegHeaderPos(FILE* file);
96 static void readMCUTile(FILE* file, const NDPITiffDirectory& dir, int tile, cv::OutputArray output);
97 static void jpeglibDecodeTile(const uint8_t* jpg_buffer, size_t jpg_size, const cv::Size& tileSize, cv::OutputArray output);
98 static void scanTiffDirTags(libtiff::TIFF* tiff, int dirIndex, int64_t dirOffset, slideio::NDPITiffDirectory& dir);
99 static void updateJpegXRCompressedDirectoryMedatata(libtiff::TIFF* tiff, NDPITiffDirectory& dir);
100 static void scanTiffDir(libtiff::TIFF* tiff, int dirIndex, int64_t dirOffset, slideio::NDPITiffDirectory& dir);
101 static void readNotRGBStripedDir(libtiff::TIFF* tiff, const NDPITiffDirectory& dir, cv::_OutputArray output);
102 static void readRegularStripedDir(libtiff::TIFF* file, const slideio::NDPITiffDirectory& dir, cv::OutputArray output);
103 static void readJpegXRStripedDir(libtiff::TIFF* tiff, const NDPITiffDirectory& dir, cv::_OutputArray output);
104 static void readStripedDir(libtiff::TIFF* file, const slideio::NDPITiffDirectory& dir, cv::OutputArray output);
105 static void readJpegXRTile(libtiff::TIFF* tiff, const slideio::NDPITiffDirectory& dir, int tile, const std::vector<int>& vector, cv::OutputArray output);
106 static void readTile(libtiff::TIFF* hFile, const slideio::NDPITiffDirectory& dir, int tile,
107 const std::vector<int>& channelIndices, cv::OutputArray output);
108 static void readJpegXRStrip(libtiff::TIFF* tiff, const NDPITiffDirectory& dir, int strip, const std::vector<int>& vector, cv::_OutputArray output);
109 static void readNotRGBStrip(libtiff::TIFF* tiff, const NDPITiffDirectory& dir, int strip, const std::vector<int>& vector, cv::_OutputArray output);
110 static void readRegularStrip(libtiff::TIFF* tiff, const NDPITiffDirectory& dir, int strip, const std::vector<int>& vector, cv::_OutputArray output);
111 static void readStripe(libtiff::TIFF* hFile, const slideio::NDPITiffDirectory& dir, int strip,
112 const std::vector<int>& channelIndices, cv::OutputArray output);
113 static void setCurrentDirectory(libtiff::TIFF* hFile, const slideio::NDPITiffDirectory& dir);
114 static void decodeJxrBlock(const uint8_t* data, size_t dataBlockSize, cv::OutputArray output);
115 static void readRegularTile(libtiff::TIFF* hFile, const slideio::NDPITiffDirectory& dir, int tile,
116 const std::vector<int>& channelIndices, cv::OutputArray output);
117 static void readNotRGBTile(libtiff::TIFF* hFile, const slideio::NDPITiffDirectory& dir, int tile,
118 const std::vector<int>& channelIndices, cv::OutputArray output);
119 static int computeStripHeight(int height, int rowsPerStrip, int strip);
120 static cv::Size computeTileSize(const NDPITiffDirectory& dir, int tile);
121 static cv::Size computeTileCounts(const NDPITiffDirectory& dir);
122 static void readJpegScanlines(libtiff::TIFF* tiff, FILE* file, const NDPITiffDirectory& dir, int firstScanline,
123 int numberScanlines, const std::vector<int>& channelIndices, cv::_OutputArray output);
124 static void readJpegDirectoryRegion(libtiff::TIFF* tiff, const std::string& filePath, const cv::Rect& region, const NDPITiffDirectory& dir,
125 const std::vector<int>& channelIndices, cv::_OutputArray output);
126 static void readDirectoryJpegHeaders(NDPIFile* ndpi, NDPITiffDirectory& dir);
127 static void readUncompressedScanlines(libtiff::TIFF* tiff, FILE* file, const NDPITiffDirectory& dir, int firstScanline, int numberScanlines, const std::vector<int>& vector,
128 cv::_OutputArray tileRaster);
129 private:
130 static void fixJpegHeader(const NDPITiffDirectory& dir, uint8_t* data);
131 };
132
133 class NDPITIFFKeeper
134 {
135 public:
136 NDPITIFFKeeper(libtiff::TIFF* hfile=nullptr);
137 ~NDPITIFFKeeper();
138 libtiff::TIFF* getHandle() const{
139 return m_hFile;
140 }
141 bool isValid() const{
142 return getHandle() != nullptr;
143 }
144 operator libtiff::TIFF* () const {
145 return getHandle();
146 }
147 NDPITIFFKeeper& operator = (libtiff::TIFF* hFile){
148 m_hFile = hFile;
149 return *this;
150 }
151
152 private:
153 libtiff::TIFF* m_hFile;
154 };
155}
156
157#if defined(_MSC_VER)
158#pragma warning( pop )
159#endif
Definition: exceptions.hpp:15
Compression
raster data compression enum
Definition: slideio_enums.hpp:12