t_vol *init_get_volume_from_minc_file(char *path) { t_vol *volume; int result; volume = malloc(sizeof(*volume)); volume->path = path; volume->dim_nb = 3; if (volume->path == NULL) return (NULL); // open the minc file if ((result = miopen_volume(volume->path, MI2_OPEN_READ, &volume->minc_volume)) != MI_NOERROR) { fprintf(stderr, "Error opening input file: %d.\n", result); return (NULL); } if ((result = miget_volume_dimension_count(volume->minc_volume, 0, 0, &volume->dim_nb)) != MI_NOERROR) { fprintf(stderr, "Error getting number of dimensions: %d.\n", result); return (NULL); } volume->dimensions = malloc(volume->dim_nb * sizeof(*volume->dimensions)); volume->starts = malloc(volume->dim_nb * sizeof(*volume->starts)); volume->steps = malloc(volume->dim_nb * sizeof(*volume->steps)); volume->size = malloc(volume->dim_nb * sizeof(*volume->size)); volume->dim_name = malloc(volume->dim_nb * sizeof(*volume->dim_name)); // get the volume dimensions if ((result = miget_volume_dimensions(volume->minc_volume, MI_DIMCLASS_SPATIAL, MI_DIMATTR_ALL, MI_DIMORDER_FILE, volume->dim_nb, volume->dimensions)) == MI_ERROR) { fprintf(stderr, "Error getting dimensions: %d.\n", result); return (NULL); } // get the size of each dimensions if ((result = miget_dimension_size(volume->dimensions[0], &volume->size[0])) != MI_NOERROR) { fprintf(stderr, "Error getting dimensions size: %d.\n", result); return (NULL); } if ((result = miget_dimension_size(volume->dimensions[1], &volume->size[1])) != MI_NOERROR) { fprintf(stderr, "Error getting dimensions size: %d.\n", result); return (NULL); } if ((result = miget_dimension_size(volume->dimensions[2], &volume->size[2])) != MI_NOERROR) { fprintf(stderr, "Error getting dimensions size: %d.\n", result); return (NULL); } if ((result = miget_dimension_starts(volume->dimensions, 0, volume->dim_nb, volume->starts)) != MI_NOERROR) { fprintf(stderr, "Error getting dimensions start: %d.\n", result); return (NULL); } if ((result = miget_dimension_separations(volume->dimensions, 0, volume->dim_nb, volume->steps)) != MI_NOERROR) { fprintf(stderr, "Error getting dimensions steps: %d.\n", result); return (NULL); } if (miget_dimension_name (volume->dimensions[0], &volume->dim_name[0]) != MI_NOERROR || miget_dimension_name (volume->dimensions[1], &volume->dim_name[1]) != MI_NOERROR || miget_dimension_name (volume->dimensions[2], &volume->dim_name[2])) { fprintf(stderr, "Error getting dimensions name.\n"); return (NULL); } // get slices_max volume->slices_max = get_slices_max(volume); volume->next = NULL; return (volume); }
void MINCResource::Load() { if (loaded) return; int result = miopen_volume(file.c_str(), MI2_OPEN_READ, &handle); if (result != MI_NOERROR) { logger.warning << "Error opening the MINC input file: " << file << logger.end; return; } // char** names = new char*[3]; // names[0] = "x_space"; // names[1] = "y_space"; // names[2] = "z_space"; // miset_apparent_dimension_order_by_name(handle, 3, names); int count; miget_volume_voxel_count(handle, &count); logger.info << "voxel count: " << count << logger.end; // atomic type of the resulting texture (float, int) miclass_t klass; miget_data_class(handle, &klass); logger.info << "data class: " << klass << logger.end; // data type of a voxel (float, uchar, ...) // convert this type into class type by scaling. mitype_t type; miget_data_type(handle, &type); logger.info << "voxel type: " << type << logger.end; misize_t vsize; miget_data_type_size(handle, &vsize); logger.info << "voxel size in bytes: " << vsize << logger.end; midimhandle_t dims[3]; result = miget_volume_dimensions(handle, MI_DIMCLASS_SPATIAL, MI_DIMATTR_ALL, MI_DIMORDER_FILE, 3, dims); if (result != 3) { logger.warning << "Only three spatial dimensions supported. Volume has " << result << logger.end; return; } w = h = d = 0; // hack: in our files dimensions are given in z,y,x order, so we reverse it. miget_dimension_size(dims[0], &w); miget_dimension_size(dims[1], &h); miget_dimension_size(dims[2], &d); // midimhandle_t* dims_app = new midimhandle_t[3]; // dims_app[0] = dims[2]; // dims_app[1] = dims[1]; // dims_app[2] = dims[0]; // miset_apparent_dimension_order (handle, 3, dims_app); logger.info << "dimensions: " << w << " x " << h << " x " << d << logger.end; // count records int recs = 0; miget_record_length(handle, &recs); logger.info << "record length: " << recs << logger.end; // count labels int lbls = 0; miget_number_of_defined_labels(handle, &lbls); logger.info << "# of labels: " << lbls << logger.end; // count attributes milisthandle_t lhandle; milist_start(handle, "", 0, &lhandle); char* path = new char[255]; char* name = new char[255]; while (milist_attr_next(handle, lhandle, path, 255, name, 255) == MI_NOERROR) { logger.info << "path: " << string(path) << " name: " << string(name) << logger.end; } milist_finish(lhandle); delete path; delete name; // char* nm; // miget_dimension_name(dims[2], &nm); // string hest(nm); // mifree_name(nm); // logger.info << "dimension name: " << hest << logger.end; char* space_name; miget_space_name(handle, &space_name); logger.info << "space name: " << string(space_name) << logger.end; mifree_name(space_name); loaded = true; }