📄 dim_tiff_format.cpp
字号:
//----------------------------------------------------------------------------
// PARAMETERS, INITS
//----------------------------------------------------------------------------
DIM_INT dimTiffValidateFormatProc (DIM_MAGIC_STREAM *magic, DIM_UINT length)
{
if (length < 4) return -1;
if (memcmp(magic,"\115\115\000\052",4) == 0) return 0;
if (memcmp(magic,"\111\111\052\000",4) == 0) return 0;
return -1;
}
TDimFormatHandle dimTiffAquireFormatProc( void )
{
TDimFormatHandle fp = initTDimFormatHandle();
return fp;
}
void dimTiffReleaseFormatProc (TDimFormatHandle *fmtHndl)
{
if (fmtHndl == NULL) return;
dimTiffCloseImageProc ( fmtHndl );
resetLocalTiffFunctions( );
}
//----------------------------------------------------------------------------
// OPEN/CLOSE
//----------------------------------------------------------------------------
void dimTiffCloseImageProc (TDimFormatHandle *fmtHndl)
{
if (fmtHndl == NULL) return;
if (fmtHndl->internalParams == NULL) return;
TDimTiffParams *tiffpar = (TDimTiffParams *) fmtHndl->internalParams;
if (fmtHndl->io_mode != DIM_IO_WRITE)
{
if (tiffpar != NULL) clearTiffIFDs( &tiffpar->ifds );
clearMetaTags( &fmtHndl->metaData );
}
if ( (tiffpar != NULL) && (tiffpar->dimTiff != NULL) ) {
XTIFFClose( tiffpar->dimTiff );
tiffpar->dimTiff = NULL;
}
// here clear STK struct
if ( (tiffpar != NULL) && (tiffpar->subType == tstStk) )
stkClearInfo ( tiffpar );
if (fmtHndl->internalParams != NULL)
{
_TIFFfree(fmtHndl->internalParams);
fmtHndl->internalParams = NULL;
}
}
DIM_UINT dimTiffOpenImageProc (TDimFormatHandle *fmtHndl, DIM_ImageIOModes io_mode)
{
if (fmtHndl == NULL) return 1;
setLocalTiffFunctions( fmtHndl );
dimTiffCloseImageProc( fmtHndl );
fmtHndl->internalParams = _TIFFmalloc( sizeof(TDimTiffParams) );
TDimTiffParams *tiffpar = (TDimTiffParams *) fmtHndl->internalParams;
tiffpar->info = initTDimImageInfo();
tiffpar->dimTiff = NULL;
tiffpar->subType = tstGeneric;
tiffpar->ifds = initTDimTiffIFDs();
stkInitInfo( &tiffpar->stkInfo );
if (io_mode == DIM_IO_WRITE)
{
if ( isCustomWriting ( fmtHndl ) != TRUE )
tiffpar->dimTiff = XTIFFOpen(fmtHndl->fileName, "w");
else
tiffpar->dimTiff = XTIFFClientOpen( fmtHndl->fileName, "wm",
(thandle_t) fmtHndl, tiff_read, tiff_write, tiff_seek, tiff_close, tiff_size, tiff_mmap, tiff_unmap );
}
else
{
if ( isCustomReading ( fmtHndl ) != TRUE )
tiffpar->dimTiff = XTIFFOpen(fmtHndl->fileName, "r");
else
tiffpar->dimTiff = XTIFFClientOpen( fmtHndl->fileName, "rm",
(thandle_t) fmtHndl, tiff_read, tiff_write, tiff_seek, tiff_close, tiff_size, tiff_mmap, tiff_unmap );
if (tiffpar->dimTiff != NULL) {
tiffpar->ifds = readAllTiffIFDs( tiffpar->dimTiff );
getImageInfo(tiffpar);
fmtHndl->subFormat = tiffpar->subType;
}
}
if (tiffpar->dimTiff == NULL) return 1;
return 0;
}
DIM_UINT dimTiffFOpenImageProc (TDimFormatHandle *fmtHndl, char* fileName, DIM_ImageIOModes io_mode)
{
fmtHndl->fileName = fileName;
return dimTiffOpenImageProc(fmtHndl, io_mode);
}
DIM_UINT dimTiffIOpenImageProc (TDimFormatHandle *fmtHndl, char* fileName,
DIM_IMAGE_CLASS *image, DIM_ImageIOModes io_mode)
{
fmtHndl->fileName = fileName;
fmtHndl->image = image;
return dimTiffOpenImageProc(fmtHndl, io_mode);
}
//----------------------------------------------------------------------------
// INFO for OPEN image
//----------------------------------------------------------------------------
DIM_UINT dimTiffGetNumPagesProc ( TDimFormatHandle *fmtHndl )
{
if (fmtHndl == NULL) return 0;
if (fmtHndl->internalParams == NULL) return 0;
TDimTiffParams *tiffpar = (TDimTiffParams *) fmtHndl->internalParams;
if (tiffpar->dimTiff == NULL) return 0;
return tiffpar->info.number_pages;
}
TDimImageInfo dimTiffGetImageInfoProc ( TDimFormatHandle *fmtHndl, DIM_UINT page_num )
{
TDimImageInfo ii = initTDimImageInfo();
if (fmtHndl == NULL) return ii;
if (fmtHndl->internalParams == NULL) return ii;
TDimTiffParams *tiffpar = (TDimTiffParams *) fmtHndl->internalParams;
TIFF *tif = tiffpar->dimTiff;
if (tif == NULL) return ii;
fmtHndl->pageNumber = page_num;
fmtHndl->subFormat = tiffpar->subType;
unsigned int currentDir = TIFFCurrentDirectory(tif);
// now must read correct page and set image parameters
if (currentDir != fmtHndl->pageNumber)
if (tiffpar->subType != tstStk)
{
TIFFSetDirectory(tif, fmtHndl->pageNumber);
getCurrentPageInfo( tiffpar );
}
ii = tiffpar->info;
return ii;
}
//----------------------------------------------------------------------------
// METADATA
//----------------------------------------------------------------------------
// libTIFF CANNOT ADD TAGS INTO ANY GIVEN IMAGE
DIM_UINT dimTiffAddMetaDataProc (TDimFormatHandle *fmtHndl)
{
fmtHndl=fmtHndl;
return 1;
}
DIM_UINT dimTiffReadMetaDataProc (TDimFormatHandle *fmtHndl, DIM_UINT page, int group, int tag, int type)
{
if (fmtHndl == NULL) return 1;
if (fmtHndl->internalParams == NULL) return 1;
TDimTiffParams *tiffpar = (TDimTiffParams *) fmtHndl->internalParams;
fmtHndl->pageNumber = page;
return read_tiff_metadata (fmtHndl, tiffpar, group, tag, type);
}
char* dimTiffReadMetaDataAsTextProc ( TDimFormatHandle *fmtHndl )
{
if (fmtHndl == NULL) return NULL;
if (fmtHndl->internalParams == NULL) return NULL;
TDimTiffParams *tiffpar = (TDimTiffParams *) fmtHndl->internalParams;
return read_text_tiff_metadata ( fmtHndl, tiffpar );
}
//----------------------------------------------------------------------------
// READ/WRITE
//----------------------------------------------------------------------------
DIM_UINT dimTiffReadImageProc ( TDimFormatHandle *fmtHndl, DIM_UINT page )
{
if (fmtHndl == NULL) return 1;
if (fmtHndl->internalParams == NULL) return 1;
TDimTiffParams *tiffpar = (TDimTiffParams *) fmtHndl->internalParams;
if (tiffpar->dimTiff == NULL) return 1;
fmtHndl->pageNumber = page;
return read_tiff_image(fmtHndl, tiffpar);
}
DIM_UINT dimTiffWriteImageProc ( TDimFormatHandle *fmtHndl )
{
if (fmtHndl == NULL) return 1;
if (fmtHndl->internalParams == NULL) return 1;
TDimTiffParams *tiffpar = (TDimTiffParams *) fmtHndl->internalParams;
if (tiffpar->dimTiff == NULL) return 1;
return write_tiff_image(fmtHndl, tiffpar);
return 0;
}
// at the moment w and h make no effect,the image retreived is the same size as original
DIM_UINT dimTiffReadImagePreviewProc (TDimFormatHandle *fmtHndl, DIM_UINT w, DIM_UINT h)
{
TDimImageBitmap bmp8, *bmp;
initImagePlanes( &bmp8 );
w=w; h=h;
if ( dimTiffReadImageProc( fmtHndl, 0 ) != 0) return 1;
bmp = fmtHndl->image;
if (bmp->i.samples > 3) bmp->i.samples = 3;
if (bmp->i.depth == 16) {
allocImg(&bmp8, bmp->i.width, bmp->i.height, bmp->i.samples, 8);
normalizeImg(bmp, &bmp8);
deleteImg( bmp );
bmp->bits[0] = bmp8.bits[0];
bmp->bits[1] = bmp8.bits[1];
bmp->bits[2] = bmp8.bits[2];
}
bmp->i.depth = 8;
if (bmp->i.samples == 1) {
bmp->bits[1] = bmp->bits[0];
bmp->bits[2] = bmp->bits[0];
}
if (bmp->i.samples == 2) {
bmp->bits[2] = bmp->bits[0];
}
bmp->i.samples = 3;
return 0;
}
//****************************************************************************
//
// EXPORTED FUNCTION
//
//****************************************************************************
TDimFormatItem dimTiffItems[4] = {
{
"TIFF", // short name, no spaces
"Tagged Image File Format (GeoTIFF)", // Long format name
"tif|tiff|fax|geotiff", // pipe "|" separated supported extension list
1, //canRead; // 0 - NO, 1 - YES
1, //canWrite; // 0 - NO, 1 - YES
1, //canReadMeta; // 0 - NO, 1 - YES
0, //canWriteMeta; // 0 - NO, 1 - YES
1, //canWriteMultiPage; // 0 - NO, 1 - YES
//TDivFormatConstrains constrains ( w, h, pages, minsampl, maxsampl, minbitsampl, maxbitsampl, noLut )
{ 0, 0, 0, 0, 0, 0, 0, 0 }
},
{
"STK", // short name, no spaces
"Metamorph Stack File Format", // Long format name
"stk", // pipe "|" separated supported extension list
1, //canRead; // 0 - NO, 1 - YES
0, //canWrite; // 0 - NO, 1 - YES
1, //canReadMeta; // 0 - NO, 1 - YES
0, //canWriteMeta; // 0 - NO, 1 - YES
0, //canWriteMultiPage; // 0 - NO, 1 - YES
//TDivFormatConstrains constrains ( w, h, pages, minsampl, maxsampl, minbitsampl, maxbitsampl, noLut )
{ 0, 0, 0, 0, 0, 0, 0, 0 }
},
{
"PSIA", // short name, no spaces
"AFM PSIA TIFF File Format", // Long format name
"tif|tiff", // pipe "|" separated supported extension list
1, //canRead; // 0 - NO, 1 - YES
0, //canWrite; // 0 - NO, 1 - YES
1, //canReadMeta; // 0 - NO, 1 - YES
0, //canWriteMeta; // 0 - NO, 1 - YES
0, //canWriteMultiPage; // 0 - NO, 1 - YES
//TDivFormatConstrains constrains ( w, h, pages, minsampl, maxsampl, minbitsampl, maxbitsampl, noLut )
{ 0, 0, 0, 0, 0, 0, 0, 0 }
},
{
"FLUOVIEW", // short name, no spaces
"Fluoview TIFF File Format", // Long format name
"tif|tiff", // pipe "|" separated supported extension list
1, //canRead; // 0 - NO, 1 - YES
0, //canWrite; // 0 - NO, 1 - YES
1, //canReadMeta; // 0 - NO, 1 - YES
0, //canWriteMeta; // 0 - NO, 1 - YES
0, //canWriteMultiPage; // 0 - NO, 1 - YES
//TDivFormatConstrains constrains ( w, h, pages, minsampl, maxsampl, minbitsampl, maxbitsampl, noLut )
{ 0, 0, 0, 0, 0, 0, 0, 0 }
}
};
TDimFormatHeader dimTiffHeader = {
sizeof(TDimFormatHeader),
"1.0.1",
"DIMIN TIFF CODEC",
"Tagged Image File Format CODEC",
4, // 0 or more, specify number of bytes needed to identify the file
{1, 4, dimTiffItems}, //dimTiffSupported,
dimTiffValidateFormatProc,
// begin
dimTiffAquireFormatProc, //TDimAquireFormatProc
// end
dimTiffReleaseFormatProc, //TDimReleaseFormatProc
// params
NULL, //TDimAquireIntParamsProc
NULL, //TDimLoadFormatParamsProc
NULL, //TDimStoreFormatParamsProc
// image begin
dimTiffOpenImageProc, //TDimOpenImageProc
dimTiffCloseImageProc, //TDimCloseImageProc
// info
dimTiffGetNumPagesProc, //TDimGetNumPagesProc
dimTiffGetImageInfoProc, //TDimGetImageInfoProc
// read/write
dimTiffReadImageProc, //TDimReadImageProc
dimTiffWriteImageProc, //TDimWriteImageProc
NULL, //TDimReadImageTileProc
NULL, //TDimWriteImageTileProc
NULL, //TDimReadImageLineProc
NULL, //TDimWriteImageLineProc
NULL, //TDimReadImageThumbProc
NULL, //TDimWriteImageThumbProc
dimTiffReadImagePreviewProc, //TDimReadImagePreviewProc
// meta data
dimTiffReadMetaDataProc, //TDimReadMetaDataProc
dimTiffAddMetaDataProc, //TDimAddMetaDataProc
dimTiffReadMetaDataAsTextProc, //TDimReadMetaDataAsTextProc
NULL,
NULL,
NULL,
""
};
extern "C" {
TDimFormatHeader* dimTiffGetFormatHeader(void)
{
return &dimTiffHeader;
}
} // extern C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -