/更新:我已经在MATLAB文件交换中心上提供了代码。 发布版本与OCTAVE兼容并带有一些文档。
我想出了这个解决方案。 返回参数是堆叠的图像,颜色映射和对应于透明度的索引。
function [stack,map,transparent]=transparentGifRead(filename)
if ~exist(filename,'file')
error('file %s does not exist',filename);
end
info=imfinfo(filename);
if any(any(any(diff(cat(3,info.ColorTable),[],3))))
error('inconsistent color map')
else
map=info(1).ColorTable;
end
if any(diff([info.TransparentColor]))
error('inconsistent transparency information')
else
transparent=info(1).TransparentColor-1;
end
import java.io.*
str = javax.imageio.ImageIO.createImageInputStream(java.io.File(filename));
t = javax.imageio.ImageIO.getImageReaders(str);
reader = t.next();
reader.setInput(str);
numframes = reader.getNumImages(true);
for imageix = 1:numframes
data = reader.read(imageix-1).getData();
height = data.getHeight();
width = data.getWidth();
data2 = reader.read(imageix-1).getData().getPixels(0,0,width,height,[]);
if imageix == 1
stack=zeros(height,width,1,numframes,'uint8');
end
stack(:,:,1,imageix) = reshape(data2,[width height]).';
end
str.close();
end
这是一些演示代码,可以将透明像素染成绿色:
[stack,map,transparent]=transparentGifRead('tr.gif');
map(transparent+1,:)=[0,1,0]
for frame=1:size(stack,ndims(stack))
imshow(stack(:,:,frame),map);
pause(1/25);
end
imread(___)还会返回图像的透明度。这种语法仅适用于PNG、CUR和ICO文件。
- obchardoncmap(53:end,:) == 1;
但对于最后一帧,它不起作用。 - obchardonhandle_positive_base_frame
函数的行为,但我并不理解它。这就是为什么我在那个函数调用之前停止了,那里我明白数据仍然存在的原因。 - Daniel