/*! * \return Woolz error number. * \ingroup WlzExtFF * \brief Writes the given Woolz object to the given stream using the * '.ipl' file format. * \param fP Output file stream. * \param obj Given woolz object. */ WlzErrorNum WlzEffWriteObjIPL(FILE *fP, WlzObject *obj) { WlzIVertex3 size; WlzErrorNum errNum = WLZ_ERR_WRITE_INCOMPLETE; WlzIVertex3 origin; unsigned char ***data = NULL; WlzEffIPLHeader header; if(fP == NULL) { errNum = WLZ_ERR_PARAM_NULL; } else if(obj == NULL) { errNum = WLZ_ERR_OBJECT_NULL; } else if(obj->type != WLZ_3D_DOMAINOBJ) { errNum = WLZ_ERR_OBJECT_TYPE; } else if(obj->domain.core == NULL) { errNum = WLZ_ERR_DOMAIN_NULL; } else if(obj->domain.core->type != WLZ_PLANEDOMAIN_DOMAIN) { errNum = WLZ_ERR_DOMAIN_TYPE; } else if(obj->values.core == NULL) { errNum = WLZ_ERR_VALUES_NULL; } else if(obj->values.core->type != WLZ_VOXELVALUETABLE_GREY) { errNum = WLZ_ERR_VALUES_TYPE; } else { origin.vtX = obj->domain.p->kol1; origin.vtY = obj->domain.p->line1; origin.vtZ = obj->domain.p->plane1; size.vtX = obj->domain.p->lastkl - origin.vtX + 1; size.vtY = obj->domain.p->lastln - origin.vtY + 1; size.vtZ = obj->domain.p->lastpl - origin.vtZ + 1; if((size.vtX <= 0) || (size.vtY <= 0) || (size.vtZ <= 0)) { errNum = WLZ_ERR_DOMAIN_DATA; } else { errNum = WlzToArray3D((void ****)&data, obj, size, origin, 0, WLZ_GREY_UBYTE); } } if(errNum == WLZ_ERR_NONE) { errNum = WlzEffHeadWriteIPL(&header, fP); } if(errNum == WLZ_ERR_NONE) { /* write the data */ } if(data) { Alc3Free((void ***)data); } return(errNum); }
/*! * \return Woolz error code. * \ingroup WlzExtFF * \brief Writes the given Woolz 3D domain object with values to * the given file using the Amira lattice (.am file) format. * \param fP Output file pointer * \param obj Object to be written. */ static WlzErrorNum WlzEffAmWrite3DDomObj(FILE *fP, WlzObject *obj) { size_t dataCnt, dataSz; WlzDBox3 bbD; WlzIBox3 bbI; WlzIVertex3 sz, org; WlzDVertex3 vSz; char *dateS, *dataTypeS; time_t tTime; WlzGreyType gType; void ***data = NULL; WlzErrorNum errNum = WLZ_ERR_UNIMPLEMENTED; if(obj->domain.core->type != WLZ_PLANEDOMAIN_DOMAIN) { errNum = WLZ_ERR_DOMAIN_TYPE; } else if(obj->values.core == NULL) { errNum = WLZ_ERR_VALUES_NULL; } else if(obj->values.core->type != WLZ_VOXELVALUETABLE_GREY) { errNum = WLZ_ERR_VALUES_TYPE; } else { bbI = WlzBoundingBox3I(obj, &errNum); } if(errNum == WLZ_ERR_NONE) { tTime = time(NULL); dateS = ctime(&tTime); *(dateS + strlen(dateS) - 1) = '\0'; } if(errNum == WLZ_ERR_NONE) { vSz = WlzVozelSz(obj, &errNum); } if(errNum == WLZ_ERR_NONE) { bbD.xMin = bbI.xMin * vSz.vtX; bbD.xMax = bbI.xMax * vSz.vtX; bbD.yMin = bbI.yMin * vSz.vtY; bbD.yMax = bbI.yMax * vSz.vtY; bbD.zMin = bbI.zMin * vSz.vtZ; bbD.zMax = bbI.zMax * vSz.vtZ; sz.vtX = bbI.xMax - bbI.xMin + 1; sz.vtY = bbI.yMax - bbI.yMin + 1; sz.vtZ = bbI.zMax - bbI.zMin + 1; org.vtX = bbI.xMin; org.vtY = bbI.yMin; org.vtZ = bbI.zMin; gType = WlzGreyTypeFromObj(obj, &errNum); } if(errNum == WLZ_ERR_NONE) { switch(gType) { case WLZ_GREY_SHORT: dataTypeS = "short"; break; case WLZ_GREY_UBYTE: dataTypeS = "byte"; break; default: errNum = WLZ_ERR_GREY_TYPE; break; } } if(errNum == WLZ_ERR_NONE) { if(fprintf(fP, "# AmiraMesh 3D BINARY 2.0\n" "# WlzExtFF\n" "# CreationDate: %s\n" "\n" "define Lattice %d %d %d\n" "\n" "Parameters {\n" " Content \"%dx%dx%d %s, uniform coordinates\",\n" " BoundingBox %g %g %g %g %g %g,\n" " CoordType \"uniform\"\n" "}\n" "\n" "Lattice { %s Data } @1\n" "\n" "# Data section follows\n" "@1\n", dateS, sz.vtX, sz.vtY, sz.vtZ, sz.vtX, sz.vtY, sz.vtZ, dataTypeS, bbD.xMin, bbD.xMax, bbD.yMin, bbD.yMax, bbD.zMin, bbD.zMax, dataTypeS) <= 0) { errNum = WLZ_ERR_WRITE_INCOMPLETE; } } if(errNum == WLZ_ERR_NONE) { errNum = WlzToArray3D(&data, obj, sz, org, 0, gType); } if(errNum == WLZ_ERR_NONE) { dataCnt = sz.vtX * sz.vtY * sz.vtZ; switch(gType) { case WLZ_GREY_SHORT: dataSz = 2; break; case WLZ_GREY_UBYTE: dataSz = 1; break; default: break; } if(fwrite(**data, dataSz, dataCnt, fP) != dataSz * dataCnt) { errNum = WLZ_ERR_WRITE_INCOMPLETE; } } (void )Alc3Free(data); return(errNum); }
/*! * \return Woolz error code. * \ingroup WlzExtFF * \brief Writes the given Woolz object to the given file(s) * using the ANALYZE 7.5 file format. The given file name is * used to generate the '.hdr' and '.img' filenames. * \param gvnFileName Given file name with .hdr, .img or no * extension. * \param obj Given woolz object. */ WlzErrorNum WlzEffWriteObjAnl(const char *gvnFileName, WlzObject *obj) { int cnt = 0; double dMin, dMax; FILE *fP = NULL; void *data = NULL; WlzGreyP dataP; WlzEffAnlDsr dsr; WlzGreyType gType; WlzVertex org, sz; char *fileName = NULL, *hdrFileName = NULL, *imgFileName = NULL; WlzErrorNum errNum = WLZ_ERR_NONE; dataP.v = NULL; if((gvnFileName == NULL) || (*gvnFileName == '\0')) { errNum = WLZ_ERR_PARAM_NULL; } else if(obj == NULL) { errNum = WLZ_ERR_OBJECT_NULL; } else if(obj->domain.core == NULL) { errNum = WLZ_ERR_DOMAIN_NULL; } else if(obj->values.core == NULL) { errNum = WLZ_ERR_VALUES_NULL; } else { errNum = WlzEffAnlFileNames(&fileName, &hdrFileName, &imgFileName, gvnFileName); } /* Fill in the ANALYZE file header data structures. */ if(errNum == WLZ_ERR_NONE) { (void )memset(&dsr, 0, sizeof(WlzEffAnlDsr)); switch(obj->type) { case WLZ_2D_DOMAINOBJ: org.i2.vtX = obj->domain.i->kol1; org.i2.vtY = obj->domain.i->line1; sz.i2.vtX = obj->domain.i->lastkl - org.i2.vtX + 1; sz.i2.vtY = obj->domain.i->lastln - org.i2.vtY + 1; if((sz.i2.vtX <= 0) || (sz.i2.vtY <= 0)) { errNum = WLZ_ERR_DOMAIN_DATA; } else { dsr.dim.dim[0] = 2; dsr.dim.dim[1] = sz.i2.vtX; dsr.dim.dim[2] = sz.i2.vtY; dsr.dim.pixdim[0] = 2; dsr.dim.pixdim[1] = 1.0; dsr.dim.pixdim[2] = 1.0; } break; case WLZ_3D_DOMAINOBJ: org.i3.vtX = obj->domain.p->kol1; org.i3.vtY = obj->domain.p->line1; org.i3.vtZ = obj->domain.p->plane1; sz.i3.vtX = obj->domain.p->lastkl - org.i3.vtX + 1; sz.i3.vtY = obj->domain.p->lastln - org.i3.vtY + 1; sz.i3.vtZ = obj->domain.p->lastpl - org.i3.vtZ + 1; if((sz.i3.vtX <= 0) || (sz.i3.vtY <= 0) || (sz.i3.vtZ <= 0)) { errNum = WLZ_ERR_DOMAIN_DATA; } else { dsr.dim.dim[0] = 3; dsr.dim.dim[1] = sz.i3.vtX; dsr.dim.dim[2] = sz.i3.vtY; dsr.dim.dim[3] = sz.i3.vtZ; dsr.dim.pixdim[0] = 3; dsr.dim.pixdim[1] = obj->domain.p->voxel_size[0]; dsr.dim.pixdim[2] = obj->domain.p->voxel_size[1]; dsr.dim.pixdim[3] = obj->domain.p->voxel_size[2]; } break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } } if(errNum == WLZ_ERR_NONE) { (void )WlzGreyStats(obj, &gType, &dMin, &dMax, NULL, NULL, NULL, NULL, &errNum); } if(errNum == WLZ_ERR_NONE) { dsr.dim.glMax = (int )ceil(dMax); dsr.dim.glMin = (int )floor(dMin); switch(gType) { case WLZ_GREY_INT: dsr.dim.dataType = WLZEFF_ANL_DT_SIGNED_INT; dsr.dim.bitPix = 32; break; case WLZ_GREY_SHORT: dsr.dim.dataType = WLZEFF_ANL_DT_SIGNED_SHORT; dsr.dim.bitPix = 16; break; case WLZ_GREY_UBYTE: dsr.dim.dataType = WLZEFF_ANL_DT_UNSIGNED_CHAR; dsr.dim.bitPix = 8; break; case WLZ_GREY_FLOAT: dsr.dim.dataType = WLZEFF_ANL_DT_FLOAT; dsr.dim.bitPix = 32; break; case WLZ_GREY_DOUBLE: dsr.dim.dataType = WLZEFF_ANL_DT_DOUBLE; dsr.dim.bitPix = 64; break; default: errNum = WLZ_ERR_GREY_TYPE; break; } } if(errNum == WLZ_ERR_NONE) { dsr.hk.hdrSz = 348; dsr.hk.regular = 'r'; dsr.hk.extents = 16384; (void )strcpy(dsr.hist.descrip, "Converted from Woolz"); (void )strcpy(dsr.hist.originator, "Woolz"); (void )strcpy(dsr.hist.generated, "Woolz"); } /* Get Woolz object's values as an array. */ if(WLZ_ERR_NONE == errNum) { switch(obj->type) { case WLZ_2D_DOMAINOBJ: cnt = sz.i2.vtX * sz.i2.vtY; errNum = WlzToArray2D((void ***)&data, obj, sz.i2, org.i2, 0, gType); if(errNum == WLZ_ERR_NONE) { switch(gType) { case WLZ_GREY_INT: dataP.inp = *(int **)data; break; case WLZ_GREY_SHORT: dataP.shp = *(short **)data; break; case WLZ_GREY_UBYTE: dataP.ubp = *(WlzUByte **)data; break; case WLZ_GREY_FLOAT: dataP.flp = *(float **)data; break; case WLZ_GREY_DOUBLE: dataP.dbp = *(double **)data; break; default: errNum = WLZ_ERR_GREY_TYPE; break; } } break; case WLZ_3D_DOMAINOBJ: cnt = sz.i3.vtX * sz.i3.vtY * sz.i3.vtZ; errNum = WlzToArray3D((void ****)&data, obj, sz.i3, org.i3, 0, gType); if(errNum == WLZ_ERR_NONE) { switch(gType) { case WLZ_GREY_INT: dataP.inp = **(int ***)data; break; case WLZ_GREY_SHORT: dataP.shp = **(short ***)data; break; case WLZ_GREY_UBYTE: dataP.ubp = **(WlzUByte ***)data; break; case WLZ_GREY_FLOAT: dataP.flp = **(float ***)data; break; case WLZ_GREY_DOUBLE: dataP.dbp = **(double ***)data; break; default: errNum = WLZ_ERR_GREY_TYPE; break; } } break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } } /* Open the ANALYZE .hdr file and write the header information. */ if(errNum == WLZ_ERR_NONE) { if((fP = fopen(hdrFileName, "w")) == NULL) { errNum = WLZ_ERR_WRITE_EOF; } #ifdef _WIN32 else if(_setmode(_fileno(fP), 0x8000) == -1) { errNum = WLZ_ERR_READ_EOF; } #endif } if(errNum == WLZ_ERR_NONE) { errNum = WlzEffWriteAnlHdrKey(fP, &dsr); } if(errNum == WLZ_ERR_NONE) { errNum = WlzEffWriteAnlHdrImageDim(fP, &dsr); } if(errNum == WLZ_ERR_NONE) { errNum = WlzEffWriteAnlHdrDataHistory(fP, &dsr); } if(fP) { (void )fclose(fP); fP = NULL; } /* Open the ANALYZE .img file and write the image data. */ if(errNum == WLZ_ERR_NONE) { if((fP = fopen(imgFileName, "w")) == NULL) { errNum = WLZ_ERR_WRITE_EOF; } #ifdef _WIN32 else if(_setmode(_fileno(fP), 0x8000) == -1) { errNum = WLZ_ERR_READ_EOF; } #endif } if(errNum == WLZ_ERR_NONE) { switch(gType) { case WLZ_GREY_INT: errNum = WlzEffWriteAnlInt(fP, cnt, dataP.inp); break; case WLZ_GREY_SHORT: errNum = WlzEffWriteAnlShort(fP, cnt, dataP.shp); break; case WLZ_GREY_UBYTE: errNum = WlzEffWriteAnlChar(fP, cnt, dataP.ubp); break; case WLZ_GREY_FLOAT: errNum = WlzEffWriteAnlFloat(fP, cnt, dataP.flp); break; case WLZ_GREY_DOUBLE: errNum = WlzEffWriteAnlDouble(fP, cnt, dataP.dbp); break; default: break; } } if(fP) { (void )fclose(fP); } if(data) { switch(obj->type) { case WLZ_2D_DOMAINOBJ: Alc2Free((void **)data); break; case WLZ_3D_DOMAINOBJ: Alc3Free((void ***)data); break; default: break; } } (void )AlcFree(fileName); (void )AlcFree(hdrFileName); (void )AlcFree(imgFileName); return(errNum); }