/* {{{ int loadMRCHeader(char *pszFilename, MRCHeader *pMRCHeader) */
int loadMRCHeader(char *pszFilename, MRCHeader *pMRCHeader) {
	FILE *pFMRC;


	if((pFMRC = fopen(pszFilename, "rb")) == NULL)
		return -1;


	if(!readMRCHeader(pFMRC, pMRCHeader)) {
		fclose(pFMRC);
		return -1;
	}

	fclose(pFMRC);
	return 1;
}
/* {{{ int loadMRC(char *pszFilename, MRC *pMRC) */
int loadMRC(char *pszFilename, MRC *pMRC) {
	FILE *pFMRC;
	unsigned int uElementSize = 0;
	unsigned int uElements = 0;
	unsigned int fuByteOrder = LITTLE_ENDIAN_DATA;
	unsigned int maxElement=500000000;

	if((pFMRC = fopen(pszFilename, "rb")) == NULL)
		return -1;

	if(!readMRCHeader(pFMRC, &(pMRC->header)))
		return -1;

	uElements = pMRC->header.nx * pMRC->header.ny * pMRC->header.nz;

	switch(pMRC->header.mode) {
		case MRC_MODE_BYTE:
			uElementSize = sizeof(char);
			break;
		case MRC_MODE_SHORT:
			uElementSize = sizeof(short);
			break;
		case MRC_MODE_UNSIGNED_SHORT:
			uElementSize = sizeof(short);
			break;
		case MRC_MODE_FLOAT:
			uElementSize = sizeof(float);
			break;
		case MRC_MODE_SHORT_COMPLEX:
			uElementSize = sizeof(short);
			uElements *= 2;
			break;
		case MRC_MODE_FLOAT_COMPLEX:
			uElementSize = sizeof(float);
			uElements *= 2;
			break;
		default:
			return -1;
	}

    if((pMRC->pbyData = malloc(uElements*uElementSize)) == NULL)
    	pMRC->pbyData = malloc(uElements*uElementSize);

	if (uElements>maxElement) {
		// --- split writing in two --- // 
		if(byteswapread(pFMRC, &(pMRC->pbyData[0]), uElements-maxElement, uElementSize, fuByteOrder) == -1) {
			free(pMRC->pbyData);
			fclose(pFMRC);
			return -1;
		}
		if(byteswapread(pFMRC, &(pMRC->pbyData[uElements-maxElement]), maxElement, uElementSize, fuByteOrder) == -1) {
			free(pMRC->pbyData);
			fclose(pFMRC);
			return -1;
		}
	} else {
		if(byteswapread(pFMRC, pMRC->pbyData, uElements, uElementSize, fuByteOrder) == -1) {
			free(pMRC->pbyData);
			fclose(pFMRC);
			return -1;
		}
	}
	
	fclose(pFMRC);
  return 1;
}
Пример #3
0
/**
 * int mrc_copy_from_file(MRCPtr pmrc_dst, char *pszFilename, int dstX, int dstY, int srcX, int srcY, int srcW, int srcH)
 */
int mrc_copy_from_file(MRCPtr pmrc_dst, char *pszFilename, int dstX, int dstY, int srcX, int srcY)
{
	FILE *pFMRC;
	MRCHeader pmrch;

	unsigned int uElementSize = 0;

	int w, h,
			w_src, h_src,
			w_dst, h_dst,
			offset; 

	long	n_src, n_dst,
				i,j,ij,u,v,uv;


	float *data_array = (float *)pmrc_dst->pbyData;

	if((pFMRC = fopen(pszFilename, "rb")) == NULL)
		return -1;

	if(!readMRCHeader(pFMRC, &pmrch)) {
		return -2;
	}

	w_src = pmrch.nx;
	h_src = pmrch.ny;
	n_src = w_src * h_src;
	w_dst = pmrc_dst->header.nx;
	h_dst = pmrc_dst->header.ny;
	n_dst = w_dst * h_dst;
	srcX = (srcX>w_src) ? w_src : srcX;
	srcY = (srcY>h_src) ? h_src : srcY;

	// set new header
	pmrc_dst->header.amin=pmrch.amin;
	pmrc_dst->header.amax=pmrch.amax;
	pmrc_dst->header.amean=pmrch.amean;
	pmrc_dst->header.rms=pmrch.rms;

	w = (w_dst>w_src) ? w_src : w_dst+srcX;
	h = h_dst+srcY;
	offset = (w_dst>w_src) ? 
						(dstX<0) ? srcX-dstX : srcX 
						: w_src-w_dst+abs(dstX);

	if(pmrch.mode == MRC_MODE_BYTE) 
		{
			uElementSize = sizeof(char);
			char data_val[1];
			// --- position pointer file where copy should start: (srcX, srcY);
			fseek(pFMRC, (srcX+srcY*w_src)*uElementSize, SEEK_CUR);
			for (v=dstY, j=srcY; j<h; j++, v++) {
				for (u=dstX, i=srcX; i<w; i++, u++) {
					ij = i + j*w_src;
					uv = u + v*w_dst;
					if ((u>=w_dst) || (v>=h_dst) ||
							(u<0) || (v<0) ||
							(ij<0) || (uv<0) ||
							(ij>n_src-1) || (uv>n_dst-1)
						)
							continue;
					fread(data_val, uElementSize,1,pFMRC);
					data_array[uv] = *data_val;
				}
				// --- seek next row of interested area
				fseek(pFMRC, offset*uElementSize, SEEK_CUR);
			}
		} else if (pmrch.mode==MRC_MODE_SHORT)
		{
			uElementSize = sizeof(short);
			short data_val[1];
			// --- position pointer file where copy should start: (srcX, srcY);
			fseek(pFMRC, (srcX+srcY*w_src)*uElementSize, SEEK_CUR);
			for (v=dstY, j=srcY; j<h; j++, v++) {
				for (u=dstX, i=srcX; i<w; i++, u++) {
					ij = i + j*w_src;
					uv = u + v*w_dst;
					if ((u>=w_dst) || (v>=h_dst) ||
							(u<0) || (v<0) ||
							(ij<0) || (uv<0) ||
							(ij>n_src-1) || (uv>n_dst-1)
						)
							continue;
					fread(data_val, uElementSize,1,pFMRC);
					data_array[uv] = *data_val;
				}
				// --- seek next row of interested area
				fseek(pFMRC, offset*uElementSize, SEEK_CUR);
			}

		} else if (pmrch.mode == MRC_MODE_UNSIGNED_SHORT) 
		{
			uElementSize = sizeof(unsigned short);
			unsigned short data_val[1];
			// --- position pointer file where copy should start: (srcX, srcY);
			fseek(pFMRC, (srcX+srcY*w_src)*uElementSize, SEEK_CUR);
			for (v=dstY, j=srcY; j<h; j++, v++) {
				for (u=dstX, i=srcX; i<w; i++, u++) {
					ij = i + j*w_src;
					uv = u + v*w_dst;
					if ((u>=w_dst) || (v>=h_dst) ||
							(u<0) || (v<0) ||
							(ij<0) || (uv<0) ||
							(ij>n_src-1) || (uv>n_dst-1)
						)
							continue;
					fread(data_val, uElementSize,1,pFMRC);
					data_array[uv] = *data_val;
				}
				// --- seek next row of interested area
				fseek(pFMRC, offset*uElementSize, SEEK_CUR);
			}

		} else if (pmrch.mode = MRC_MODE_FLOAT) 
		{
			uElementSize = sizeof(float);
			// --- position pointer file where copy should start: (srcX, srcY);
			fseek(pFMRC, (srcX+srcY*w_src)*uElementSize, SEEK_CUR);
			for (v=dstY, j=srcY; j<h; j++, v++) {
				for (u=dstX, i=srcX; i<w; i++, u++) {
					ij = i + j*w_src;
					uv = u + v*w_dst;
					if ((u>=w_dst) || (v>=h_dst) ||
							(u<0) || (v<0) ||
							(ij<0) || (uv<0) ||
							(ij>n_src-1) || (uv>n_dst-1)
						)
							continue;
					fread(&(data_array[uv]), uElementSize,1,pFMRC);
				}
				// --- seek next row of interested area
				fseek(pFMRC, offset*uElementSize, SEEK_CUR);
			}
		}
	
	fclose(pFMRC);
	return 1;
}