⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dim_tiff_format.cpp

📁 Digital Notebook Source Code v1.1.0 [
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//----------------------------------------------------------------------------
// 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 + -