📄 dim_ibw_format_io.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 + -