Показать сообщение отдельно
  #1  
Старый 09.06.2016, 22:53
Linerath Linerath вне форума
Прохожий
 
Регистрация: 09.06.2016
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию LZW для Gif на Delphi 7

По-порядку: пишу 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);
Ответить с цитированием