4#ifndef OPENCV_slideio_ndpitifftools_HPP
5#define OPENCV_slideio_ndpitifftools_HPP
8#include "slideio/drivers/ndpi/ndpi_api_def.hpp"
9#include "slideio/base/resolution.hpp"
10#include "slideio/base/slideio_enums.hpp"
11#include "slideio/base/base.hpp"
12#include <opencv2/core.hpp>
23#pragma warning( push )
24#pragma warning(disable: 4251)
31 struct SLIDEIO_NDPI_EXPORTS NDPITiffDirectory
48 int YCbCrSubsampling[2];
53 std::string description;
54 std::string userLabel;
56 std::vector<NDPITiffDirectory> subdirectories;
65 std::vector<uint64_t> mcuStarts;
66 uint64_t jpegHeaderOffset;
67 uint64_t jpegSOFMarker;
68 uint32_t jpegHeaderSize;
69 uint32_t rawStripSize = 0;
70 bool auxImage =
false;
72 Type getType()
const {
76 else if(tileWidth > 0 && tileHeight > 0 && !mcuStarts.empty() && slideioCompression == Compression::Jpeg) {
77 return Type::SingleStripeMCU;
79 else if(rowsPerStrip == height) {
80 return Type::SingleStripe;
88 SLIDEIO_NDPI_EXPORTS std::ostream& operator << (std::ostream& os,
const NDPITiffDirectory::Type& type);
90 class SLIDEIO_NDPI_EXPORTS NDPITiffTools
93 static libtiff::TIFF* openTiffFile(
const std::string& path);
94 static void closeTiffFile(libtiff::TIFF* file);
95 static cv::Size computeMCUTileSize(FILE* file,
const cv::Size& dirSize);
96 static std::pair<uint64_t, uint64_t> getJpegHeaderPos(FILE* file);
97 static void readMCUTile(FILE* file,
const NDPITiffDirectory& dir,
int tile, cv::OutputArray output);
98 static void jpeglibDecodeTile(
const uint8_t* jpg_buffer,
size_t jpg_size,
const cv::Size& tileSize, cv::OutputArray output);
99 static void scanTiffDirTags(libtiff::TIFF* tiff,
int dirIndex, int64_t dirOffset, slideio::NDPITiffDirectory& dir);
100 static void updateJpegXRCompressedDirectoryMedatata(libtiff::TIFF* tiff, NDPITiffDirectory& dir);
101 static void scanTiffDir(libtiff::TIFF* tiff,
int dirIndex, int64_t dirOffset, slideio::NDPITiffDirectory& dir);
102 static void readNotRGBStripedDir(libtiff::TIFF* tiff,
const NDPITiffDirectory& dir, cv::_OutputArray output);
103 static void readRegularStripedDir(libtiff::TIFF* file,
const slideio::NDPITiffDirectory& dir, cv::OutputArray output);
104 static void readJpegXRStripedDir(libtiff::TIFF* tiff,
const NDPITiffDirectory& dir, cv::_OutputArray output);
105 static void readStripedDir(libtiff::TIFF* file,
const slideio::NDPITiffDirectory& dir, cv::OutputArray output);
106 static void readJpegXRTile(libtiff::TIFF* tiff,
const slideio::NDPITiffDirectory& dir,
int tile,
const std::vector<int>& vector, cv::OutputArray output);
107 static void readTile(libtiff::TIFF* hFile,
const slideio::NDPITiffDirectory& dir,
int tile,
108 const std::vector<int>& channelIndices, cv::OutputArray output);
109 static void readJpegXRStrip(libtiff::TIFF* tiff,
const NDPITiffDirectory& dir,
int strip,
const std::vector<int>& vector, cv::_OutputArray output);
110 static void readNotRGBStrip(libtiff::TIFF* tiff,
const NDPITiffDirectory& dir,
int strip,
const std::vector<int>& vector, cv::_OutputArray output);
111 static void readRegularStrip(libtiff::TIFF* tiff,
const NDPITiffDirectory& dir,
int strip,
const std::vector<int>& vector, cv::_OutputArray output);
112 static void readStripe(libtiff::TIFF* hFile,
const slideio::NDPITiffDirectory& dir,
int strip,
113 const std::vector<int>& channelIndices, cv::OutputArray output);
114 static void setCurrentDirectory(libtiff::TIFF* hFile,
const slideio::NDPITiffDirectory& dir);
115 static void decodeJxrBlock(
const uint8_t* data,
size_t dataBlockSize, cv::OutputArray output);
116 static void readRegularTile(libtiff::TIFF* hFile,
const slideio::NDPITiffDirectory& dir,
int tile,
117 const std::vector<int>& channelIndices, cv::OutputArray output);
118 static void readNotRGBTile(libtiff::TIFF* hFile,
const slideio::NDPITiffDirectory& dir,
int tile,
119 const std::vector<int>& channelIndices, cv::OutputArray output);
120 static int computeStripHeight(
int height,
int rowsPerStrip,
int strip);
121 static cv::Size computeTileSize(
const NDPITiffDirectory& dir,
int tile);
122 static cv::Size computeTileCounts(
const NDPITiffDirectory& dir);
123 static void readJpegScanlines(libtiff::TIFF* tiff, FILE* file,
const NDPITiffDirectory& dir,
int firstScanline,
124 int numberScanlines,
const std::vector<int>& channelIndices, cv::_OutputArray output);
125 static void readJpegDirectoryRegion(libtiff::TIFF* tiff,
const std::string& filePath,
const cv::Rect& region,
const NDPITiffDirectory& dir,
126 const std::vector<int>& channelIndices, cv::_OutputArray output);
127 static void readDirectoryJpegHeaders(NDPIFile* ndpi, NDPITiffDirectory& dir);
128 static void readUncompressedScanlines(libtiff::TIFF* tiff, FILE* file,
const NDPITiffDirectory& dir,
int firstScanline,
int numberScanlines,
const std::vector<int>& vector,
129 cv::_OutputArray tileRaster);
131 static void fixJpegHeader(
const NDPITiffDirectory& dir, uint8_t* data);
137 NDPITIFFKeeper(libtiff::TIFF* hfile=
nullptr);
139 libtiff::TIFF* getHandle()
const{
142 bool isValid()
const{
143 return getHandle() !=
nullptr;
145 operator libtiff::TIFF* ()
const {
148 NDPITIFFKeeper& operator = (libtiff::TIFF* hFile){
154 libtiff::TIFF* m_hFile;
159#pragma warning( pop )
Definition: exceptions.hpp:15
Compression
raster data compression enum
Definition: slideio_enums.hpp:12