示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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);
}
示例#4
0
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;
}