Skip to content
Snippets Groups Projects
iconRead.m 2.06 KiB
Newer Older
function cdata = iconRead(filename,guessalpha)
% ICONREAD read an image file and convert it to CData for a HG icon.
%
% CDATA=ICONREAD(FILENAME)
%   Read an image file and convert it to CData with automatic transparency
%   handling. If the image has transparency data, PNG files sometimes do,
%   the transparency data is used. If the image has no CData, the top left
%   pixel is treated as the transparent color.
%
% CDATA=ICONREAD(FILENAME, FALSE)
%   Same as above but supress the usage of the top left pixel for images
%   with no transparency data. This may require the caller to handle the
%   transparency explicitly. View the contents of this m-file for an
%   example of how to handle transparency.
%
% Example:
%
% icon = fullfile(matlabroot,'toolbox','matlab','icons','matlabicon.gif');
% uitoggletool('CData',iconread(icon));
%
% See also IMREAD.

%   Copyright 1984-2006 The MathWorks, Inc.

if nargin < 2
    guessalpha = true;
end

[p,f,ext] = fileparts(filename);
% if this is a mat-file, look for the varible cdata (or something like it)
if isequal(lower(ext),'.mat')
    cdata = [];
    s = whos('-file',filename);
    for i=1:length(s)
        if ~isempty(strfind(lower(s(i).name), 'cdata'))
            data = load(filename,s(i).name);
            cdata = data.(s(i).name);
        end
    end
    return
end

[cdata,map,alpha] = imread(filename);
if isempty(cdata)
    return;
end

if isempty(map)
    % need to use doubles cuz nan's only work as doubles
    cdata = double(cdata);
    cdata = cdata/255;
else
    cdata = ind2rgb(cdata,map);
end

if isempty(alpha)
    if ~guessalpha
        return;
    end
    % guess the alpha pixel by using the top left pixel in the icon
    ap1 = cdata(1,1,1);
    ap2 = cdata(1,1,2);
    ap3 = cdata(1,1,3);
    alpha = cdata(:,:,1) == ap1 & cdata(:,:,2) == ap2 & cdata(:,:,3) == ap3;
    alpha = ~alpha;
end

% process alpha data
r = cdata(:,:,1);
r(alpha == 0) = NaN;
g = cdata(:,:,2);
g(alpha == 0) = NaN;
b = cdata(:,:,3);
b(alpha == 0) = NaN;
cdata = cat(3,r,g,b);