I am always look for different MRI file readers and writers for the myriad of formats that we use in MRI research. One of the relatively simple and common ones is the Analyze fileformat. Some of the large packages have writers (e.g., SPM) but I am typically wanting to do my own small processing and then write out the data. So, I wrote up my own writeanalyze.m function. It will do the basic formatting though the offsets etc don’t work. Try it out but I can’t guarantee anything.
[cc lang="matlab"]
function [] = writeanalyze(fname, data, ftype)
if( nargin == 2 )
ftype = ‘int16′;
end
if( strcmp( ftype, ‘int16′ ) == 1 )
file_type = 4; bpp = 16;
elseif( strcmp( ftype, ‘uint16′ ) == 1 )
file_type = 4; bpp = 16;
elseif( strcmp( ftype, ‘int32′ ) == 1 )
file_type = 8; bpp = 32;
elseif( strcmp( ftype, ‘float’ ) == 1 )
file_type = 16; bpp = 32;
elseif( strcmp( ftype, ‘double’ ) == 1 )
file_type = 64; bpp = 64;
else
error(sprintf(‘Unknown data type %s’, ftype));
end
fp = fopen([fname '.hdr'], ‘wb’, ‘b’);
%%
%% Write the header_key part
%%
fwrite(fp, 348, ‘int32′);
fwrite(fp, repmat(‘ ‘, 1, 10), ‘char’);
fwrite(fp, repmat(‘ ‘, 1, 18), ‘char’);
fwrite(fp, 16384, ‘int32′);
fwrite(fp, 0, ‘int16′);
fwrite(fp, ‘r ‘, ‘char’);
%%
%% Write the image_dimension part.
%%
fwrite(fp, length( size(data) ), ‘int16′);
for ii=1:length( size(data) )
fwrite(fp, size(data,ii), ‘int16′);
end
for ii=length( size(data) )+1:7
fwrite(fp, 1, ‘int16′);
end
fwrite(fp, 0, ‘int16′); % unused 8
fwrite(fp, 0, ‘int16′); % unused 9
fwrite(fp, 0, ‘int16′); % unused 10
fwrite(fp, 0, ‘int16′); % unused 11
fwrite(fp, 0, ‘int16′); % unused 12
fwrite(fp, 0, ‘int16′); % unused 13
fwrite(fp, 0, ‘int16′); % unused 14
% data type
fwrite(fp, file_type, ‘int16′); % 4 = signed short
fwrite(fp, bpp, ‘int16′); % bpp
fwrite(fp, 0, ‘int16′);
for ii=1:8
fwrite(fp, 1.0, ‘float32′);
end
fwrite(fp, 0, ‘float32′);
fwrite(fp, 0, ‘float32′); % funused 1
fwrite(fp, 0, ‘float32′); % funused 2
fwrite(fp, 0, ‘float32′); % funused 3
fwrite(fp, max(data(:)), ‘float32′);
fwrite(fp, min(data(:)), ‘float32′);
fwrite(fp, 0, ‘float32′);
fwrite(fp, 0, ‘float32′);
fwrite(fp, round(max(data(:))), ‘int32′); % glmax
fwrite(fp, round(min(data(:))), ‘int32′); % glmin
%%
%% Data history
%%
fwrite(fp, repmat(‘ ‘, 1, 80), ‘char’); % descrip
fwrite(fp, repmat(‘ ‘, 1, 24), ‘char’); % aux_file
fwrite(fp, ’3′, ‘char’); % aux_file
fwrite(fp, repmat(‘ ‘, 1, 10), ‘char’); % originator
fwrite(fp, repmat(‘ ‘, 1, 10), ‘char’); % originator
fwrite(fp, repmat(‘ ‘, 1, 10), ‘char’); % originator
fwrite(fp, repmat(‘ ‘, 1, 10), ‘char’); % originator
fwrite(fp, repmat(‘ ‘, 1, 10), ‘char’); % originator
fwrite(fp, repmat(‘ ‘, 1, 10), ‘char’); % originator
fwrite(fp, repmat(‘ ‘, 1, 3), ‘char’); % originator
fwrite(fp, 0, ‘int32′); % views
fwrite(fp, 0, ‘int32′); % vols_added
fwrite(fp, 0, ‘int32′); % start_fiedl
fwrite(fp, 0, ‘int32′); % field_skip
fwrite(fp, 0, ‘int32′); % omax
fwrite(fp, 0, ‘int32′); % omin
fwrite(fp, 0, ‘int32′); % small_max
fwrite(fp, 0, ‘int32′); % small_min
fclose(fp);
%%
%% Write the data
%%
fp = fopen([fname '.img'], ‘wb’, ‘b’);
fwrite(fp, data, ftype);
fclose(fp);
[/cc]