readspe.m 2.82 KB
% Read images of TIFF, SPE2.2(WinSpec) and SPE3.0(Lightfield)
% Version: JTL Jun-9-2016
% ----------------- READ THIS FIRST !!!!! --------------------------------
% Change the file name to "readspe" before use
% Example:
%   Z = readspe(filename)
%   Z = readspe(filename,'info')
%   Z = readspe(filename,frame_index)
%   Z = readspe(filename,frame_index,'info')
% Input:
%   filename - filename string, e.g. 'image.spe'
%   frame_index    - frame index, start from 1
%              If you have multiple frames, use a "for" loop
%   'info'   - flag to show file info, i.e. dimension, number of frames, version 
% Output:
%   Z        - UINT16 image (convert to double if you need)
% ------------------------------------------------------------------------
%        Z = readspe (filename,frame_index,'info')
function Z = readspe (filename,varargin) 

if exist(filename) == 2

    Nfr = 1; % default read first frame
    if nargin >1
        if isa(varargin{1},'numeric')
            Nfr = varargin{1};
        end
    end

    [~,name,ext] = fileparts(filename);
    switch upper(ext)
        case '.TIFF'
            file_ver = 'TIFF';
            Z  = imread(filename);
            [Y,X] = size(Z);
    %         datatype = class(Z)

        case '.SPE'
            fid = fopen(filename); 
            I = fread(fid,Inf,'uint8');
            X = double(typecast(uint8(I(43:44)),'uint16'));
            Y = double(typecast(uint8(I(657:658)),'uint16'));
            fr = typecast(uint8(I(1447:1450)),'int32');
            spe_ver = typecast(uint8(I(1993:1996)),'single');
            file_ver = ['SPE ' num2str(spe_ver)];
            datatypeN = typecast(uint8(I(109:110)),'int16');
            switch datatypeN
                case 0 % 32-bit float
                    datatype = 'single'; datalength = 4; 
                case 1 % 32-bit signed integer
                    datatype = 'int32'; datalength = 4;
                case 2 % 16-bit signed integer
                    datatype = 'int16'; datalength = 2;
                case 3 % 16-bit unsigned integer
                    datatype = 'uint16'; datalength = 2;
                case 8 % 32-bit unsigned integer
                    datatype = 'uint32'; datalength = 4;
            end 
    %       A = I(4101:4100+X*Y*2); % Default read first frame
            A = I(4101+X*Y*datalength*(Nfr-1):4100+X*Y*datalength*Nfr);
            B = typecast(uint8(A),datatype); % important
            Z = reshape(B,X,Y);
            Z = Z';
            fclose(fid);
    end

    if nargin >1
        if varargin{end} == 'info'
            display(['X = ' num2str(X)]);
            display(['Y = ' num2str(Y)]);
            if(exist('fr','var'));display(['Number of Frames: ' num2str(fr)]);end;
            display(['File version: ' file_ver]);
        end
    end
    
elseif exist(filename) == 0
    display('File does not exist!');  
end