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

📄 dim_ibw_format_io.cpp

📁 Digital Notebook Source Code v1.1.0 [
💻 CPP
字号:
/*****************************************************************************
  Igor binary file format v5 (IBW) / IO
  UCSB/BioITR property
  Copyright (c) 2005 by Dmitry V. Fedorov <www.dimin.net> <dima@dimin.net>

  IMPLEMENTATION
  
  Programmer: Dima V. Fedorov <mailto:dima@dimin.net> <http://www.dimin.net/>

  History:
    10/19/2005 16:03 - First creation
            
  Ver : 1
*****************************************************************************/

#include <string>

#include "dim_ibw_format.h"


#include <math.h>
//#if defined(WIN32)
#include <limits.h>
#include <float.h>
//#endif

//FLT_MIN FLT_MAX DBL_MAX DBL_MIN INT_MAX INT_MIN SHRT_MAX SHRT_MIN

//----------------------------------------------------------------------------
// READ PROC
//----------------------------------------------------------------------------

static int read_ibw_image(TDimFormatHandle *fmtHndl)
{
  if (fmtHndl == NULL) return 1;
  if (fmtHndl->internalParams == NULL) return 1;
  TDimIbwParams *ibwPar = (TDimIbwParams *) fmtHndl->internalParams;
  TDimImageInfo *info = &ibwPar->i; 
  if (fmtHndl->stream == NULL) return 1;
  
  // get needed page 
  if (fmtHndl->pageNumber < 0) fmtHndl->pageNumber = 0; 
  if (fmtHndl->pageNumber > info->number_pages) fmtHndl->pageNumber = info->number_pages-1;
  int page=fmtHndl->pageNumber;

  //allocate image
  TDimImageBitmap *img = fmtHndl->image;
  if ( allocImg( fmtHndl, info, img) != 0 ) return 1;

  //read page
  long ch_num_points = info->width * info->height;
  long ch_size = ch_num_points * ibwPar->real_bytespp; 
  DIM_UCHAR *chbuf = new DIM_UCHAR [ch_size];


  long ch_offset = ibwPar->data_offset + (ch_size * page);

  if ( dimSeek(fmtHndl, ch_offset, SEEK_SET) != 0) return 1;
  if (dimRead( fmtHndl, chbuf, ch_size, 1 ) != 1) return 1;

  // swap if neede
  if ( (dimBigendian) && (ibwPar->little_endian == true) ) 
  {
    if ( (ibwPar->wh.type == NT_FP32) || (ibwPar->wh.type == NT_I32) )
      dimSwapArrayOfLong((DIM_UINT32*) chbuf, ch_size/4);

    if (ibwPar->wh.type == NT_FP64)
      dimSwapArrayOfDouble((DIM_DOUBLE*) chbuf, ch_size/8);

    if (ibwPar->wh.type == NT_I16)
      dimSwapArrayOfShort((DIM_UINT16*) chbuf, ch_size/2);
    
    if (ibwPar->wh.type == NT_CMPLX)
      dimSwapArrayOfLong((DIM_UINT32*) chbuf, ch_size/4);
  }

  // normalize and copy
  if (ibwPar->wh.type == NT_FP32)
  {
    DIM_FLOAT max_val = FLT_MIN;
    DIM_FLOAT min_val = FLT_MAX;
    DIM_FLOAT *pb = (DIM_FLOAT *) chbuf;
    long x = 0;

    // find min and max
    for (x=0; x<ch_num_points; ++x) 
    {
      if (*pb > max_val) max_val = *pb;
      if (*pb < min_val) min_val = *pb;
      ++pb;
    }

    double range = (max_val - min_val) / 256.0;
    if (range == 0) range = 256;

    pb = (DIM_FLOAT *) chbuf;
    DIM_UCHAR *p = (DIM_UCHAR *) img->bits[0];

    // direct data copy
    for (x=0; x<ch_num_points; ++x) 
    {
      *p = iTrimUC ( (*pb - min_val) / range );
      ++pb;
      ++p;
    }
    
    /*
    // copy transposing the data
    long line_size = info->width;
    long y=0;

    for (y=0; y<info->height; ++y) 
    {
      p = ( (DIM_UCHAR *) img->bits[0]) + y;     
      for (x=0; x<info->width; ++x) 
      {
        *p = iTrimUC ( (*pb - min_val) / range );
        ++pb;
        p+=line_size;
      }
    }
    */

  } // if (ibwPar->wh.type == NT_FP32) 

  delete [] chbuf;
  return 0;
}


//----------------------------------------------------------------------------
// META DATA PROC
//----------------------------------------------------------------------------

DIM_UINT read_ibw_metadata (TDimFormatHandle *fmtHndl, int group, int tag, int type)
{
  if (fmtHndl == NULL) return 1;
  if (fmtHndl->internalParams == NULL) return 1;
  group; tag; type;
  return 0;
}

char* read_text_ibw_metadata ( TDimFormatHandle *fmtHndl )
{
  if (fmtHndl == NULL) return NULL;
  if (fmtHndl->internalParams == NULL) return NULL;
  TDimIbwParams *ibwPar = (TDimIbwParams *) fmtHndl->internalParams;
  
  char *buf = NULL;
 /*
  std::string str = "";
  char cstr[1024], *line, *l2, p1[1024], p2[1024];

  

  str += "[IBW image properties]\n";

  sprintf( cstr, "Width: %.2f um\n", nimg.width * nimg.xR );
  str += cstr;

  sprintf( cstr, "Height: %.2f um\n", nimg.height * nimg.yR );
  str += cstr;

*/
  long buf_size = ibwPar->bh.noteSize;
  buf = new char [buf_size+1];
  buf[buf_size] = '\0';

  if ( dimSeek(fmtHndl, ibwPar->notes_offset, SEEK_SET) != 0) return NULL;
  if (dimRead( fmtHndl, buf, buf_size, 1 ) != 1) return NULL;

  for (int i=0; i<buf_size; ++i)
    if (buf[i] == 0x0d) buf[i] = 0x0a;

  //std::string

  //buf = new char [buf_size+1];
  //buf[buf_size] = '\0';
  //memcpy( buf, str.c_str(), buf_size );

  return buf;
  return NULL;
}








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -