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); }