RLE- алгоритм PackBits
Для декодирования растровых данных нужен RLE-алгоритм PackBits, которые используется в формате TIFF.
Вот мой код, но он не работает, когда присваиваю пикселям значения. Помогите найти ошибку или скиньте плз алгоритм.
Нашел несколько исходников на сишнике:
https://github.com/Caged/groomlake/blob/master/lib/groom_lake/brush.rb
http://code.metager.de/source/xref/kde/calligra/krita/plugins/paintops/libbrush/kis_abr_brush_collection.cpp#abr_v1_brush_name
Код:
procedure DecodeRLE(var varFile:file);
var
ScanlineLenght: array of word;
i,j,x,w:integer;
tmp,ch,c,y,ImageEnd:shortint;
begin
SetLength(ScanlineLenght, ABR.BrushHeight);
for i:=0 to ABR.BrushHeight do
ScanlineLenght[i]:=ReadWord(varFile, ScanlineLenght[i]);
for i:=0 to ABR.BrushHeight do
while j<ScanlineLenght[i] do
begin
BlockRead(varFile, tmp, 1);
inc(j);
if tmp>=128
then tmp:=tmp-128;
if tmp<0
then
begin
if tmp=-128
then continue;
tmp:=-tmp+1;
BlockRead(varFile, ch, 1);
j:=j+1;
for c:=0 to tmp do
begin
ImageData[y]:=ch;
y:=y+1;
end;
end
else
begin
for c:=0 to (tmp+1) do
begin
ImageData[y]:=ch;
y:=y+1;
j:=j+1;
end;
end;
end;
x:=0;
for i:=0 to ABR.BrushHeight do
for j:=0 to Abr.BrushWidth do
begin
Form1.Image1.Canvas.Pixels[i,j]:=ImageData[x];
inc(x);
end;
end;
var
ScanlineLenght: array of word;
i,j,x,w:integer;
tmp,ch,c,y,ImageEnd:shortint;
begin
SetLength(ScanlineLenght, ABR.BrushHeight);
for i:=0 to ABR.BrushHeight do
ScanlineLenght[i]:=ReadWord(varFile, ScanlineLenght[i]);
for i:=0 to ABR.BrushHeight do
while j<ScanlineLenght[i] do
begin
BlockRead(varFile, tmp, 1);
inc(j);
if tmp>=128
then tmp:=tmp-128;
if tmp<0
then
begin
if tmp=-128
then continue;
tmp:=-tmp+1;
BlockRead(varFile, ch, 1);
j:=j+1;
for c:=0 to tmp do
begin
ImageData[y]:=ch;
y:=y+1;
end;
end
else
begin
for c:=0 to (tmp+1) do
begin
ImageData[y]:=ch;
y:=y+1;
j:=j+1;
end;
end;
end;
x:=0;
for i:=0 to ABR.BrushHeight do
for j:=0 to Abr.BrushWidth do
begin
Form1.Image1.Canvas.Pixels[i,j]:=ImageData[x];
inc(x);
end;
end;