function [a b]=lzwdecode_new(DatCode,InitEnd)
size2 =size(DatCode);
num1=size2(2) %每行的像素数
num2=size2(1) %每列的像素数
DictTable = zeros(4096,4);%建立一个长度为1024的空字典
decode = zeros(1,255);
decode1 = zeros(1,255);
if nargin==1
InitEnd=255;
end
for f=0:InitEnd
DictTable(f+1,1)=f+1; %字典前256字节初始化,向字典1-256地址中写入1-256初始化数据
DictTable(f+1,2)=f+1;
DictTable(f+1,3)=f+1;
DictTable(f+1,4)=f+1;
end
DictCurAddr=InitEnd+1;
c=0;
%解码输出下标
for s=1:num2
for s2=1:num1-1
DictCurAddr =DictCurAddr+1;
Curcode =DatCode(s,s2);
Nextcode =DatCode(s,s2+1);
for DictAddr=1:DictCurAddr-1 %查询字典
if(DictTable(DictAddr,1) == Curcode)
CFCode = DictTable(DictAddr,4);
end
if(DictTable(DictAddr,1)== Nextcode)
NFCode =DictTable(DictAddr,4);
end
end
DictTable(DictCurAddr,1:4) = [DictCurAddr Curcode NFCode CFCode];
TableInsert=1; %解码输出
if(Curcode<(InitEnd+2))
for DictAddr=1:256
if(DictTable(DictAddr,1) == Curcode)
c=c+1;
decode1(c)=DictTable(DictAddr,3);
end
end
else
t=0;
n=0;
while(TableInsert==1)
for DictAddr=1:DictCurAddr
if(DictTable(DictAddr,1) == Curcode)
if(Curcode>(InitEnd+1))
c=c+1;
t=t+1;
decode(c)=DictTable(DictAddr,3);
Curcode=DictTable(DictAddr,2);
TableInsert=1;
else
for DictAddr=1:256
if(DictTable(DictAddr,1) == Curcode)
c=c+1;
decode(c)=DictTable(DictAddr,3);
end
end
n=1;
TableInsert=0;
end
end
end
end
t=t+n;
for m=1:t
decode1(c-t+m)=decode(c+1-m);
end
end
TableInsert=1;
if(s==num2&s2==(num1-1)) %最后一个字符解码输出
p=0;
r=0;
while(TableInsert==1)
for DictAddr=1:DictCurAddr
if(DictTable(DictAddr,1) == Nextcode)
if(Nextcode>(InitEnd+1))
c=c+1;
p=p+1;
decode(c)=DictTable(DictAddr,3);
Nextcode=DictTable(DictAddr,2);
TableInsert=1;
else
for DictAddr=1:256
if(DictTable(DictAddr,1) == Nextcode)
c=c+1;
decode(c)=DictTable(DictAddr,3);
end
end
r=1;
TableInsert=0;
end
end
end
end
p=p+r;
for m=1:p
decode1(c-p+m)=decode(c+1-m);
end
end
end
end
a=decode1;
b=DictTable;
end
- 1
- 2
前往页