По-порядку: пишу LZW-архиватор (с позволения сказать). Дело в том, что до сжатия дело не дошло, а уже куча проблем. Действую по след. принципу: ScanLine'ом иду по исходному изображению, произвожу все необходимые LZW преобразования, потом, при распаковке, создаю новый gif файл, ScanLine'ом иду по нему и изменяю каждый пиксель в соответствии с полученными из сжатия данными. Проблема: со сканлайном можно работать только через bitmap, следовательно все преобразования будут на bitmap'е. Из этого вытекает то, что при вот этом формировании новой gif картинки сохраняться будет фактически bmp-файл и его размер намного больше исходной картинки.
Были некоторые другие варианты архивации (открыть его как файл, а не изображение, но устройство gif не позволило мне этого сделать). Как вообще можно реализовать LZW на Delphi?
Прошу ткнуть носом, ибо я уже много дней сижу на одном и том же месте.
Вот, как я создаю новый (фактически, перезаписываю, но это пока) gif:
Код:
var
GIF: TGIFImage;
i, j: Integer;
PScanLineArray: PByteArray;
f_code: textFile;
b: byte;
begin
AssignFile(f_code,'output.txt'); //файл с цветами пикселей
Reset(f_code);
GIF:=TGIFImage.Create;
try
GIF.LoadFromFile('white.gif'); //перезаписываю белый gif-файл
GIF.Bitmap.PixelFormat:=pf8bit;
for i:=0 to GIF.Bitmap.Height-1 do
begin
PScanLineArray:=GIF.Bitmap.ScanLine[i];
for j:=0 to GIF.Bitmap.Width-1 do
begin
read(f_code,b);
PScanLineArray[j]:=b;
end;
end;
finally
begin
GIF.Bitmap.SaveToFile('D:\LZW_files\Pictures\try.gif');
GIF.Free;
end;
end;
CloseFile(f_code);