По-порядку: пишу LZW-архиватор (с позволения сказать). Дело в том, что до сжатия дело не дошло, а уже куча проблем. Действую по след. принципу: ScanLine'ом иду по исходному изображению, произвожу все необходимые LZW преобразования, потом, при распаковке, создаю новый gif файл, ScanLine'ом иду по нему и изменяю каждый пиксель в соответствии с полученными из сжатия данными. Проблема: со сканлайном можно работать только через bitmap, следовательно все преобразования будут на bitmap'е. Из этого вытекает то, что при вот этом формировании новой gif картинки сохраняться будет фактически bmp-файл и его размер намного больше исходной картинки.
Были некоторые другие варианты архивации (открыть его как файл, а не изображение, но устройство gif не позволило мне этого сделать). Как вообще можно реализовать LZW на Delphi?
Прошу ткнуть носом, ибо я уже много дней сижу на одном и том же месте.
Вот, как я создаю новый (фактически, перезаписываю, но это пока) gif:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 . 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);
|