一:TIFF读图工具
1.QuaPath:https://github.com/qupath
2.ASAP:https://github.com/computationalpathologygroup/ASAP
二: TIFF 格式限制
TIFF格式限制了其文件只能存储最大4G,超出4个G无法存储,打破该限制的方法为使用本系列所推荐的方法编译最新的4.1版本,然后将文件存储为bigtiff
如何存储为bigTIFF?
只需要在TIFFOpen函数的参数里面增加一个选项即可
1 //w 代表写文件,8 代表bigtiff ,4 代表标准tiff,默认为4
2 TIFFOpen(pcPath, "w8");
三:存储tile 图像
1 bool SaveTile(const uchar *pucTile, uchar *pucJpeg, const int nL, const int nT,
2 const int nR, const int nB, const int nLayer, const int nFocus)
3 {
4
5 LOG_E("left = %d,top = %d,bottom = %d,right = %d, nLayer=%d,nFocus=%d", nL, nT, nB, nR,nLayer,nFocus);
6
7 LAYER_S &stLayer = m_pD->stTmap.stLayers[nLayer];
8
9
10 const int nWidth = nR - nL;
11 const int nHeight = nB - nT;
12 int nLength = 0;
13
14
15 try
16 {
17 TIFFSetDirectory(m_pD->pfFile, nLayer);
18 TIFFSetField(m_pD->pfFile, TIFFTAG_IMAGEWIDTH, stLayer.nWidth);
19 TIFFSetField(m_pD->pfFile, TIFFTAG_IMAGELENGTH, stLayer.nHeight);
20 TIFFSetField(m_pD->pfFile, TIFFTAG_ROWSPERSTRIP, stLayer.nHeight);
21
22 TIFFSetField(m_pD->pfFile, TIFFTAG_TILEWIDTH, m_pD->nTileW);
23 TIFFSetField(m_pD->pfFile, TIFFTAG_TILELENGTH, m_pD->nTileH);
24 TIFFSetField(m_pD->pfFile, TIFFTAG_SUBFILETYPE, FILETYPE_REDUCEDIMAGE);
25 TIFFSetField(m_pD->pfFile, TIFFTAG_BITSPERSAMPLE, 8);
26 TIFFSetField(m_pD->pfFile, TIFFTAG_SAMPLESPERPIXEL, 3);
27 TIFFSetField(m_pD->pfFile, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
28
29 TIFFSetField(m_pD->pfFile, TIFFTAG_COMPRESSION, COMPRESSION_JPEG);
30 TIFFSetField(m_pD->pfFile, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
31
32 /*int nJpegQuality = 60;
33 TIFFSetField(m_pD->pfFile, TIFFTAG_JPEGQUALITY, nJpegQuality);*/
34 if (nLayer == 0)
35 {
36 float fPixelSize = 0.0f;
37 int nScale = 0;
38 GetScanScale(nScale);
39 GetPixelSize(fPixelSize);
40 fPixelSize = fPixelSize * 100 / max(1, nScale);
41 TIFFSetField(m_pD->pfFile, TIFFTAG_XRESOLUTION, 1.0 / (fPixelSize / 10));
42 TIFFSetField(m_pD->pfFile, TIFFTAG_YRESOLUTION, 1.0 / (fPixelSize / 10));
43 TIFFSetField(m_pD->pfFile, TIFFTAG_RESOLUTIONUNIT, 3);
44 }
45
46
47
48 // save tile information
49 const int nTileRow = nT / m_pD->nTileH;
50 const int nTileCol = nL / m_pD->nTileW;
51 int tiffIndex = nTileRow * (stLayer.nWidth / m_pD->nTileW) + nTileCol;
52
53
54 TIFFWriteEncodedTile(m_pD->pfFile, tiffIndex, (void *)pucTile, m_pD->nTileW * m_pD->nTileH * 3);
55
56 TIFFWriteDirectory(m_pD->pfFile);
57 }