static int load_file(const char* fileName, byte* buf, word32 bufSz) { FILE* file; word32 fileSz; word32 readSz; if (fileName == NULL) return 0; if (WFOPEN(&file, fileName, "rb") != 0) return 0; fseek(file, 0, SEEK_END); fileSz = (word32)ftell(file); rewind(file); if (fileSz > bufSz) { fclose(file); return 0; } readSz = (word32)fread(buf, 1, fileSz, file); if (readSz < fileSz) { fclose(file); return 0; } fclose(file); return fileSz; }
Nrrd* LBLReader::Convert(int t, int c, bool get_max) { int64_t pos = m_path_name.find_last_of('.'); if (pos == -1) return 0; wstring str_name = m_path_name.substr(0, pos); wostringstream strs; strs << str_name /*<< "_t" << t << "_c" << c*/ << ".lbl"; str_name = strs.str(); FILE* lbl_file = 0; if (!WFOPEN(&lbl_file, str_name.c_str(), L"rb")) return 0; Nrrd *output = nrrdNew(); NrrdIoState *nio = nrrdIoStateNew(); nrrdIoStateSet(nio, nrrdIoStateSkipData, AIR_TRUE); if (nrrdRead(output, lbl_file, nio)) { fclose(lbl_file); return 0; } nio = nrrdIoStateNix(nio); rewind(lbl_file); if (output->dim != 3 || (output->type != nrrdTypeInt && output->type != nrrdTypeUInt)) { delete []output->data; nrrdNix(output); fclose(lbl_file); return 0; } int slice_num = int(output->axis[2].size); int x_size = int(output->axis[0].size); int y_size = int(output->axis[1].size); int data_size = slice_num * x_size * y_size; output->data = new unsigned int[data_size]; if (nrrdRead(output, lbl_file, NULL)) { delete []output->data; nrrdNix(output); fclose(lbl_file); return 0; } fclose(lbl_file); return output; }
void LSMReader::Preprocess() { FILE* pfile = 0; if (!WFOPEN(&pfile, m_path_name.c_str(), L"rb")) return; m_lsm_info.clear(); m_l4gb = false; int i, j; unsigned int ioffset = 0; fread(&ioffset, sizeof(unsigned int), 1, pfile); if (ioffset!=0x002A4949) { fclose(pfile); return; } int cnt_image = 0; bool full_image = false; //first offset if (fread(&ioffset, sizeof(unsigned int), 1, pfile)<1) { fclose(pfile); return; } unsigned int prev_offset = 0; unsigned int offset_high = 0; //images while (fseek(pfile, ioffset, SEEK_SET)==0) { unsigned short entry_num; //entry number if (fread(&entry_num, sizeof(unsigned short), 1, pfile)<1) { fclose(pfile); return; } vector<unsigned int> offsets; vector<unsigned int> offset_highs; vector<unsigned int> sizes; for (i=0; i<entry_num; i++) { unsigned short tag; if (fread(&tag, sizeof(unsigned short), 1, pfile)<1) { fclose(pfile); return; } unsigned short type; if (fread(&type, sizeof(unsigned short), 1, pfile)<1) { fclose(pfile); return; } unsigned int length; if (fread(&length, sizeof(unsigned int), 1, pfile)<1) { fclose(pfile); return; } unsigned int value; if (fread(&value, sizeof(unsigned int), 1, pfile)<1) { fclose(pfile); return; } //remember current position long cur_pos = ftell(pfile); switch (tag) { case 0x00FE://254, new subfile type if (value==0) { full_image = true; cnt_image++; } else full_image = false; break; case 0x0100://256, image width if (full_image && cnt_image == 1) m_x_size = value; break; case 0x0101://257, image length if (full_image && cnt_image == 1) m_y_size = value; break; case 0x0102://258, bits per sample break; case 0x0103://259, compression if (full_image && cnt_image == 1) m_compression = value<<16>>16; break; case 0x0106://262, photometric interpretation break; case 0x0111://273, strip offsets if (full_image) { if (length==1) { offsets.push_back(value); if (value < prev_offset) { m_l4gb = true; offset_high++; } prev_offset = value; offset_highs.push_back(offset_high); } else { if (fseek(pfile, value, SEEK_SET)==0) { unsigned int vtemp; for (j=0; j<(int)length; j++) { if (fread(&vtemp, sizeof(unsigned int), 1, pfile)==1) { offsets.push_back(vtemp); if (vtemp < prev_offset) { m_l4gb = true; offset_high++; } prev_offset = vtemp; offset_highs.push_back(offset_high); } } } } } break; case 0x0115://277, samples per pixel if (full_image && cnt_image == 1) m_chan_num = value<<16>>16; break; case 0x0117://279, strip byte counts if (full_image) { if (length==1) { sizes.push_back(value); } else { if (fseek(pfile, value, SEEK_SET)==0) { unsigned int vtemp; for (j=0; j<(int)length; j++) { if (fread(&vtemp, sizeof(unsigned int), 1, pfile)==1) sizes.push_back(vtemp); } } } } break; case 0x011C://284, planar configuration break; case 0x013D://317, predictor if (full_image && cnt_image == 1) m_predictor = value<<16>>16; break; break; case 0x0140://320, colormap break; case 0x866C://34412, zeiss lsm info if (type == 1) { if (fseek(pfile, value, SEEK_SET)!=0) { fclose(pfile); return; } unsigned char* pdata = new unsigned char[length]; if (fread(pdata, sizeof(unsigned char), length, pfile)!=length) { fclose(pfile); return; } //read lsm info ReadLsmInfo(pfile, pdata, length); //delete delete []pdata; } break; } //reset position if (fseek(pfile, cur_pos, SEEK_SET)!=0) { fclose(pfile); return; } } //build lsm info, which contains all offset values and sizes if (full_image) { int time = (cnt_image-1) / m_slice_num; if (time+1 > (int)m_lsm_info.size()) { DatasetInfo dinfo; for (i=0; i<m_chan_num; i++) { ChannelInfo cinfo; dinfo.push_back(cinfo); } m_lsm_info.push_back(dinfo); } //int slice = (cnt_image-1) % m_slice_num; for (i=0; i<m_chan_num; i++) { SliceInfo sinfo; sinfo.offset = offsets[i]; sinfo.offset_high = offset_highs[i]; sinfo.size = sizes[i]; //add slice info to lsm info m_lsm_info[time][i].push_back(sinfo); } } //next image if (fread(&ioffset, sizeof(unsigned int), 1, pfile)<1) { fclose(pfile); return; } if (!ioffset) break; } fclose(pfile); m_cur_time = 0; m_data_name = m_path_name.substr(m_path_name.find_last_of(GETSLASH())+1); }
Nrrd* LSMReader::Convert(int t, int c, bool get_max) { Nrrd *data = 0; FILE* pfile = 0; if (!WFOPEN(&pfile, m_path_name.c_str(), L"rb")) return 0; int i, j; if (t>=0 && t<m_time_num && c>=0 && c<m_chan_num && m_slice_num > 0 && m_x_size > 0 && m_y_size > 0 && t<(int)m_lsm_info.size() && c<(int)m_lsm_info[t].size()) { //allocate memory for nrrd switch (m_datatype) { case 1://8-bit { unsigned long long mem_size = (unsigned long long)m_x_size* (unsigned long long)m_y_size*(unsigned long long)m_slice_num; unsigned char *val = new (std::nothrow) unsigned char[mem_size]; ChannelInfo *cinfo = &m_lsm_info[t][c]; for (i=0; i<(int)cinfo->size(); i++) { if (m_l4gb? FSEEK64(pfile, ((uint64_t((*cinfo)[i].offset_high))<<32)+(*cinfo)[i].offset, SEEK_SET)==0: fseek(pfile, (*cinfo)[i].offset, SEEK_SET)==0) { unsigned int val_pos = m_x_size*m_y_size*i; if (m_compression==1) fread(val+val_pos, sizeof(unsigned char), (*cinfo)[i].size, pfile); else if (m_compression==5) { unsigned char* tif = new (std::nothrow) unsigned char[(*cinfo)[i].size]; fread(tif, sizeof(unsigned char), (*cinfo)[i].size, pfile); LZWDecode(tif, val+val_pos, (*cinfo)[i].size); for (j=0; j<m_y_size; j++) DecodeAcc8(val+val_pos+j*m_x_size, m_x_size,1); delete []tif; } } } //create nrrd data = nrrdNew(); nrrdWrap(data, val, nrrdTypeUChar, 3, (size_t)m_x_size, (size_t)m_y_size, (size_t)m_slice_num); nrrdAxisInfoSet(data, nrrdAxisInfoSpacing, m_xspc, m_yspc, m_zspc); nrrdAxisInfoSet(data, nrrdAxisInfoMax, m_xspc*m_x_size, m_yspc*m_y_size, m_zspc*m_slice_num); nrrdAxisInfoSet(data, nrrdAxisInfoMin, 0.0, 0.0, 0.0); nrrdAxisInfoSet(data, nrrdAxisInfoSize, (size_t)m_x_size, (size_t)m_y_size, (size_t)m_slice_num); } break; case 2://16-bit case 3: { unsigned long long mem_size = (unsigned long long)m_x_size* (unsigned long long)m_y_size*(unsigned long long)m_slice_num; unsigned short *val = new (std::nothrow) unsigned short[mem_size]; ChannelInfo *cinfo = &m_lsm_info[t][c]; for (i=0; i<(int)cinfo->size(); i++) { if (m_l4gb? FSEEK64(pfile, ((uint64_t((*cinfo)[i].offset_high))<<32)+(*cinfo)[i].offset, SEEK_SET)==0: fseek(pfile, (*cinfo)[i].offset, SEEK_SET)==0) { unsigned int val_pos = m_x_size*m_y_size*i; if (m_compression==1) fread(val+val_pos, sizeof(unsigned char), (*cinfo)[i].size, pfile); else if (m_compression==5) { unsigned char* tif = new (std::nothrow) unsigned char[(*cinfo)[i].size]; fread(tif, sizeof(unsigned char), (*cinfo)[i].size, pfile); LZWDecode(tif, (tidata_t)(val+val_pos), (*cinfo)[i].size); for (j=0; j<m_y_size; j++) DecodeAcc16((tidata_t)(val+val_pos+j*m_x_size), m_x_size,1); delete []tif; } } } //create nrrd data = nrrdNew(); nrrdWrap(data, val, nrrdTypeUShort, 3, (size_t)m_x_size, (size_t)m_y_size, (size_t)m_slice_num); nrrdAxisInfoSet(data, nrrdAxisInfoSpacing, m_xspc, m_yspc, m_zspc); nrrdAxisInfoSet(data, nrrdAxisInfoMax, m_xspc*m_x_size, m_yspc*m_y_size, m_zspc*m_slice_num); nrrdAxisInfoSet(data, nrrdAxisInfoMin, 0.0, 0.0, 0.0); nrrdAxisInfoSet(data, nrrdAxisInfoSize, (size_t)m_x_size, (size_t)m_y_size, (size_t)m_slice_num); } break; } } fclose(pfile); return data; }